C++ 11 成员的初始化

首先我们的对比下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呢?

猜你喜欢

转载自blog.csdn.net/zhangkai19890929/article/details/83272512
今日推荐