c++成員變數初始化

littleflypig發表於2019-04-04

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.

  1. 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;

  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

  1. 對於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都被建構函式進行了初始化而不是類內初始值(猜測原因為提供了自定義建構函式後就會按照此建構函式進行初始化,如果沒有自定義建構函式或者自定義建構函式沒有進行列表初始化,那麼就會執行預設初始化,如果此時有類內初始值就按照它進行初始化)有建構函式初始化就按照建構函式,沒有就預設初始化

  1. static變數在類內宣告,在類外定義和初始化,類外定義和初始化時不用加static關鍵字
using namespace std;

class A{
public:
	static int a;
};
int A::a = 1;
int main() {
	A a;
	cout<<A::a<<endl;
}
  1. 非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提供類內初始值

  1. 為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;
}
  1. 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,因為此符號並沒有定義。

  1. 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也可以提供。

參考:https://www.cnblogs.com/xiezhw3/p/4354601.html

相關文章