網站首頁 編程語言 正文
一、小問題
下面的類定義是否合法? 如果合法,ci 的值是什么,存儲在哪里?
下面編寫代碼一探究竟(代碼1):
#include <stdio.h>
class Test
{
private:
const int ci;
public:
Test()
{
ci = 10;
}
int getCI()
{
return ci;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
return 0;
}
可以看到,編譯報錯,ci 沒有被初始化,如果要初始化,就得在 test() 那里進行,且看下節初始化列表。
二、類成員的初始化
C++ 中提供了初始化列表對成員變量進行初始化
語法規則
所以代碼 1 可以寫成:
#include <stdio.h>
class Test
{
private:
const int ci;
public:
Test() : ci(10)
{
//ci = 10;
}
int getCI()
{
return ci;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
return 0;
}
這樣編譯就能通過,得到想要的結果:
注意事項
- 成員的初始化順序與成員的聲明順序相同
- 成員的初始化順序與初始化列表中的位置無關
- 初始化列表先于構造函數的函數體執行
下面看一段初始化列表使用的代碼:
#include <stdio.h>
class Value
{
private:
int mi;
public:
Value(int i)
{
printf("i = %d\n", i);
mi = i;
}
int getI()
{
return mi;
}
};
class Test
{
private:
Value m2;
Value m3;
Value m1;
public:
Test() : m1(1), m2(2), m3(3)
{
printf("Test::Test()\n");
}
};
int main()
{
Test t;
return 0;
}
輸出結果如下:?
這段代碼很好的將上面的注釋事項體現出來了,初始化順序是 m1,m2,m3,輸出順序確是 m2,m3,m1,并且構造函數的函數體后于初始化列表的執行。
三、類中的 const 成員
- 類中的 const 成員會被分配空間的
- 類中的 const 成員的本質是只讀變量
- 類中的 const 成員只能在初始化列表中指定初始值
編譯器無法直接得到 const 成員的初始值,因此無法進入符號表成為真正意義上的常量。
下面看一段代碼:
#include <stdio.h>
class Value
{
private:
int mi;
public:
Value(int i)
{
printf("i = %d\n", i);
mi = i;
}
int getI()
{
return mi;
}
};
class Test
{
private:
const int ci;
Value m2;
Value m3;
Value m1;
public:
Test() : m1(1), m2(2), m3(3), ci(100)
{
printf("Test::Test()\n");
}
int getCI()
{
return ci;
}
int setCI(int v)
{
int* p = const_cast<int*>(&ci);
*p = v;
}
};
int main()
{
Test t;
printf("t.ci = %d\n", t.getCI());
t.setCI(10);
printf("t.ci = %d\n", t.getCI());
return 0;
}
下面為輸出結果:
這段代碼說明 const 不是真正意義上的常量,只是只讀變量。?
四、初始化與賦值的不同
- 初始化:對正在創建的對象進行初值設置
- 賦:對已經存在的對象進行值設置
五、小結
- 類中可以使用初始化列表對成員進行初始化
- 初始化列表先于構造函數體執行
- 類中可以定義 const 成員變量
- const 成員變量必須在初始化列表中指定初值
- const 成員變量為只讀變量
原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/123610627
相關推薦
- 2022-07-13 查看工具設置的編碼 sys.getdefaultencoding()
- 2022-09-14 jQuery實現簡易計算器功能_jquery
- 2022-03-19 使用Docker部署Spring?Boot項目的實現步驟_docker
- 2022-05-05 Python中閉包和自由變量的使用與注意事項_python
- 2022-11-02 使用ggsignif優雅添加顯著性標記詳解_R語言
- 2022-10-06 如何利用Redis作為Mybatis的二級緩存_Redis
- 2022-09-03 Nginx文件已經存在全局反向代理問題排查記錄_nginx
- 2022-07-07 圖解AVL樹數據結構輸入與輸出及實現示例_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支