C++基础之 成员变量初 始化赋值

摘要: C++成员变量 初始化赋值 你都清楚吗?还有好多坑,好多细节也不知道。。。

    今天在写一个类的时候,由于该类的一个成员变量是引用,所以初始化出现了问题,查了一下之后,才发现,原来引用的初始化和const常量 一样只能在构造函数的初始化列表里初始。突然发现自己的C++基础本科的时候学的有待重温。

    至于为什么成员变量中要用到引用,这个主要是该成员变量是另一个类的对象,但是该类却禁止copy【怎么禁止拷贝构造函数?其实很简单,声明为Private即可】。

 

注解:

在 C++ 标准中(除了C++11版本以后), 类的成员变量的初始化都是在构造函数中实现的,不能在类中设定默认值。其中,有三类成员变量比较特殊,就是静态类型成员变量,const常量类型成员变量, 引用类型成员变量。

1.引用的初始化const常量 一样只能在构造函数初始化列表里初始。

2.静态类型 成员变量 只能在类体外定义 及 初始化

 

#include <iostream>
#include <string>
using namespace std;

class TestVar{
public:
    TestVar():b(2), e(a)
    {
        a = 1;
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
    }
//private:
public:
    //int a = 0;//error: ISO C++ forbids initialization of member ‘a’
    int a;//初始化可以在构造函数里面,也可以在初始化列表
    //const int b = 0;//error: ISO C++ forbids initialization of member ‘a’
    const int b;//常量的正确初始化应该使用[构造函数的初始化列表]
    int &e;//引用类型变量,和常量一样只能在[构造函数的初始化列表],参数是同类型变量
    
    //static int c = 0;//ISO C++ forbids in-class initialization of non-const static member ‘c’
    static int c;
    static const int d = 4;//注意只有整型数据才行[int.., char]
    static const char f = 'a';//可以,char也是整型数据
    static const double h = 9.9;//书上说不行,但是在g++下是可以的,根编译器有关吧
};
int TestVar::c = 3;//静态成员的正确初始化方法

int main()
{
    TestVar t;
    t.a++;
    cout<<t.a<<"    "<<t.e<<endl;
    return 0;
}

运行结果:

 

修改构造函数为:

public:
    TestVar():b(2), e(a)
    {
        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
        a = 1;
    }

运行结果:

有上面对比发现, 构造函数的初始化列表是在 构造函数体 运行开始之前 最早运行的

此时, b 被赋值为2,  a变量没有被初始化为随机值 4197184 ,  e为a 的引用 所以 e值也为 4197184 。

 

 

 

 

 

 

 

源地址:

https://my.oschina.net/chengshuguang/blog/210666

 

 

==============================

 

 

补充:

#include <iostream>
#include <string>
using namespace std;

class TestVar{
public:
    TestVar():b(2), e(a) //const, &
    {
        a = 1;

        //c = 99;

        /* static const */
        static const int d = 4;
        static const double h = 9.9;
        static const char f = 'a';

        cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
    }

//private:
public:
    //int a = 0;//error: ISO C++ forbids initialization of member ‘a’
    int a;//初始化可以在构造函数里面,也可以在初始化列表

    //const int b = 0;//error: ISO C++ forbids initialization of member b’
    const int b;//常量的正确初始化应该使用[构造函数的初始化列表]

    //static int c = 0;//ISO C++ forbids in-class initialization of non-const static member ‘c’
    static int c;

    //static const int d = 4;//注意只有整型数据才行[int.., char]

    int &e;//引用类型变量,和常量一样只能在[构造函数的初始化列表],参数是同类型变量

    //static const char f = 'a';//可以,char也是整型数据

    //static const double h = 9.9;
};


int TestVar::c = 3;//静态成员的正确初始化方法


int main()
{
    TestVar t;

    t.a++;
    cout<<t.a<<"    "<<t.e<<endl;

    return 0;
}

 

 

运行结果:

 

 

 

 

 

 

 

 

posted on 2017-01-29 11:54  Angry_Panda  阅读(8998)  评论(0编辑  收藏  举报

导航