首先我们的对比下C++98和C++11对成员进行初始化的方式:
编译环境:linux
g++ 2-7.cpp -o main
#include <iostream>
using namespace std;
class Init {
public:
Init():a(5){ //c++ 98初始化成员的方式
}
public:
int a;
int c = 10;//直接这么写,在c++98中不合法
};
int main(){
Init i1;
cout << i1.a << endl;
cout << i1.c << endl;
}
在上面的写法中,我们看到了一行代码:
int c = 10;
这个是直接在头文件中进行的初始化.
C++ 98中,只允许在头文件中进行声明,定义和初始化(定义也就是分配内存,不要把定义和初始化理解为一个概念)是放在构造函数中实现的,初始化也可以放在一个单独的Init方法里.
初始化是赋一个初始值,而定义是分配内存.
这里额外说一个基础知识,我们程序中经常程序中会碰到undefined reference的作用,这个是未定义的错误,运用我们通俗的说法就是:成员或者方法没有分配内存啊!!!
具体大家可以参考下这篇文章:
https://blog.csdn.net/vict_wang/article/details/80994894
C++ 11中可以直接赋值,赋值的方式有两种:=或者{}
struct person {
public:
//C++ 11 的两种初始化方法
int age1 = 10;
string name = "zhangkai";
int age2 {100};
string name2 {"zhangkai"};
};
推荐使用{},这样更好进行区分.
int age1 = 10 ;
上面的这种写法称作:就地初始化,在C++ 98中也支持就地初始化的写法,但是条件限制的非常的死.
for example:
struct Init2 {
public:
static int a ; //c++ 98 合法 ,声明可以,定义必须在cpp文件中.
const static int b = 100 ;//c++ 98合法
const static double d = 2.34; //非整型和枚举,无法通过变异 ,c++ 11中需要添加编译选项:-fpermissive
int c = 100;//c ++ 98 中不合法
}
C++98中:
1.在头文件中,只支持static静态成员变量进行就地初始化,非静态成员只能在构造函数中初始化或者初始化方法中.
2.静态成员变量还必须是const类型的.
3.只支持基本数据类型和枚举类型进行就地初始化.
4.静态成员变量可以在头文件中声明,具体的定义必须在某一个具体的cpp文件中.
为什么对静态成员单独的进行说明???
这是因为c++ 98 和 c++ 11对静态成员的写法的规则是一致的.
class Init3 {
public:
int a = 100; //c++ 98 不合法 ,c++ 11合法
static int b ; //c++ 98 / c++ 11 都允许
**static int c = 100 ;//c++ 98 或者 c++ 11都不允许这么写**
};
大家有没有什么想过为什么不行?为什么不允许这么写?
首先静态成员变量,是属于整个类的,而不属于某个对象的。
一旦编译器放开这种写法:
static int c = 100;
如果一个类有几十个子类,每个子类都单独设置一下c,这个就和static成员变量属于整个类这个理念相违背了.
遗留问题:
const static int b = 56; //为什么这个不报waring?
const static float f = 1.234f;//为什么这个就报warning?
const static double d = 1.234;
编译时:
2-7.cpp:15:24: warning: ‘constexpr’ needed for in-class initialization of static data member ‘const float Init::f’ of non-integral type [-fpermissive]
const static float f = 1.234f;
^
2-7.cpp:16:25: warning: ‘constexpr’ needed for in-class initialization of static data member ‘const double Init::d’ of non-integral type [-fpermissive]
const static double d = 1.234;
为什么只能是int或者枚举型static const 编译时没有warning? 一旦使用其它类型就会出现warning呢?