cpp类成员变量的初始化方式错误和总结

⌚Time: 2021-08-07 16:42:04

👨‍💻Author: Jack Ge

项目场景:

编写以下程序

#include<iostream>
using namespace std;
 
class test{
    private:
        char ch='a';
    public:
        test(){}
};
int main(){
 
    test t1;
    return 0;
}

用g++编译

g++ test.cpp

问题描述:

编译时出现警告:"warning:non-static data number initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]"。

原因分析:

成员初始化的方式错误,c++类为对象的抽象,不能储存变量的值

解决方案:

修改:

#include<iostream>
using namespace std;
 
class test{
    private:
        char ch;
    public:
        test():ch('a'){}
};
int main(){
 
    test t1;
    return 0;
}

总结和扩展

c++成员变量初始化方法总结如下:

类普通成员变量初始化

1.将类成员定义为const static类型直接初始化

const static char ch='a';

2.成员初始化列表赋值

class test{
    private:
        char ch;
    public:
        test():ch('a'){
        }
};

3.在构造函数中初始化

class test{
    private:
        char ch;
    public:
        test(){
            ch='a';
        }
};

特殊成员变量的初始化

1.const变量:在成员初始化列表赋值

class test{
    private:
        const char ch;
    public:
        test():ch('a'){
        }
};

2.引用变量:在成员初始化列表赋值

class test{
    private:
        char &ch;
    public:
        test(char a):ch(a){
        }
};

3.static变量:在类外初始化

class test{
    private:
        static char ch;
    public:
        test(){
        }
};
char test::ch='a';

需要注意的是,即使不对static类型成员变量初始化,也要在类外进行定义,否则编译时会报错

class test{
    private:
        static char ch;
    public:
        test(){
        }
};
char test::ch;

4.const static变量:直接赋值或在类外赋值

class test{
    private:
        const static char ch1='a';
        const static char ch2;
    public:
        test(){
        }
};
const char test::ch2='b';

5.没有无参构造函数的对象变量:在构造函数的在成员初始化列表中初始化变量

#include <iostream>
using namespace std;
class CA{
public:
    CA(int arg){//只有一个有参构造函数
        cout<<"initialized with arg "<<arg;
    }
private:

};
class CB{
public:
    CB(int arg):ca(arg){//使用参数初始化ca对象
        
    }
private:
    CA ca;
};
int main(){

    CB cb(1);
}