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