c++成員變數初始化
1.
#include <iostream>
#include <string>
using namespace std;
class A{
public:
int a;
string s;
};
A a;
int main() {
//A a;
cout<<a.a<<endl;
cout<<a.s<<endl;
}
類A的成員變數將進行預設初始化
- 即a如果在函式外定義,則其內建型別被初始化為0,類型別呼叫其預設建構函式進行初始化;
- a如果在函式內定義,其內建型別不被初始化,類型別執行預設初始化。
2.
- c++11新特性允許為資料成員提供類內初始值
#include <iostream>
#include <string>
using namespace std;
class A{
public:
int a=1;
string s;
};
A a;
int main() {
//A a;
cout<<a.a<<endl;
cout<<a.s<<endl;
}
a.a被初始化為1;
- 如果有建構函式,將按照建構函式的初始化列表進行初始化
#include <iostream>
#include <string>
using namespace std;
class A{
public:
int a=1;
string s;
A(int val=5):a(val){}
};
A a;
int main() {
//A a;
cout<<a.a<<endl;
cout<<a.s<<endl;
}
a.a輸出5
- 對於const成員常量和引用型別變數第2條也是適用的
#include <iostream>
using namespace std;
class A{
public:
const int a=0;
const int & b = a;
int c = 1;
A(int val=5):a(val),b(c){
}
};
int main() {
A a;
cout<<a.a<<endl;
cout<<a.b<<endl;
}
a和b都被提供了類內初始值並且在建構函式初始化列表進行了初始化,最終輸出a.a=5,a.b=1說明a和b都被建構函式進行了初始化而不是類內初始值(猜測原因為提供了自定義建構函式後就會按照此建構函式進行初始化,如果沒有自定義建構函式或者自定義建構函式沒有進行列表初始化,那麼就會執行預設初始化,如果此時有類內初始值就按照它進行初始化)有建構函式初始化就按照建構函式,沒有就預設初始化
- static變數在類內宣告,在類外定義和初始化,類外定義和初始化時不用加static關鍵字
using namespace std;
class A{
public:
static int a;
};
int A::a = 1;
int main() {
A a;
cout<<A::a<<endl;
}
- 非const的static成員變數不允許提供類內初始值
using namespace std;
class A{
public:
static int a=2; //宣告並初始化 出錯
};
int A::a; //定義
int main() {
A a;
cout<<A::a<<endl;
}
編譯出錯,顯示不能為nonconst member提供類內初始值
- 為const static成員變數提供類內初始值,如果提供類內初始值,就不允許再在定義的時候初始化。
using namespace std;
class A{
public:
const static int a=5; //宣告和初始化
};
const int A::a; //定義 如果在此處再次初始化,則會出錯
int main() {
A a;
cout<<A::a<<endl;
}
- const static成員變數如果只宣告不定義,並且宣告時也進行了初始化,則此變數相當於一個立即數,可以通過變數名訪問其值,不可以取它的地址
using namespace std;
class A{
public:
const static int a=5; //宣告和初始化
};
//const int A::a; //不定義
int main() {
A a;
const int *p = &A::a; //會導致連線出錯
cout<<A::a<<endl;
}
聯結器會提示找不到A::a,因為此符號並沒有定義。
- const static成員變數如果只宣告不定義,並且宣告時沒有進行初始化,也就沒法當一個立即數使用,自然也就無法輸出A::a
using namespace std;
class A{
public:
const static int a; //宣告不初始化
};
//const int A::a; //不定義
int main() {
A a;
cout<<A::a<<endl; //連結出錯,無法找到符號A::a
}
總結:nonconst static成員變數不能對其提供類內初始值,const可以提供,const static也可以提供。
相關文章
- C++類的靜態成員變數初始化C++變數
- 類成員變數的初始化變數
- 12-成員變數的初始化變數
- 類的成員變數的初始化順序變數
- 成員變數變數
- 成員變數和區域性變數變數
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- C++類內成員變數可以定義引用型別嗎C++變數型別
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- 12 ### 各種成員變數變數
- 子父類中成員變數變數
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- C++ 建構函式 explicit 關鍵字 成員初始化列表C++函式
- c++語言中類的私有型別或保護型別成員變數C++型別變數
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- C++之友元成員C++
- C++ 靜態變數什麼時候完成初始化C++變數
- C# 建構函式 (初始化成員變數的角色)C#函式變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- java基礎-初始化與清理-成員初始化Java
- C++ 的靜態成員變數為什麼一定要在類外定義C++變數
- cosnt成員資料的初始化
- C++類中的常成員和靜態成員C++
- c++ const 成員函式C++函式
- C++ 類成員函式C++函式
- C++ 類成員指標C++指標
- 18、繼承以及繼承中成員變數和成員方法的重名問題繼承變數
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- Java之private關鍵字修飾成員變數Java變數
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- c++類的靜態成員C++
- C++ 靜態資料成員C++
- C++:類的成員函式C++函式
- C++:類的靜態成員C++
- c++中的靜態成員C++
- 在Python中將字典轉為成員變數的方法Python變數
- 力扣 1342. 將數字變成 0 的操作次數 C++力扣C++