C++初始化列表

    在谈C++初始化列表这个内容前,我们先来回顾下const 修饰的变量,我们知道,在C语言中,被const修饰的变量是不可以被直接改变的,在C++中,const升级了,被const修饰后就直接进入常量符号表,是真正意义上的常量。既然我们知道这些知识,那么在C++的类中,我们能不能定义一个const变量?下边我们就直接用代码来验证下我们的设想:
 

#include <iostream>
#include <string>

using namespace std;

class test
{
private:
    const int m_value = 10;	//定义一个const成员变量,并初始化为10(编译error)
	
public:

    test()
    {
    	m_value = 20;	//在构造函数中为其赋值 (编译error)
    }

    void setValue(int i)
    {
    	m_value = 30;	//在成员函数中为其赋值(编译error)
    }

    int getValue()
    {
    	return m_value;
    }

};

int main()
{
    test t;
    system("pause");
}

编译结果如下:

从编译结果,看来在类中定义并初始化const变量、或者对const变量直接赋值,是行不通的,那么怎样才能在类中定义时初始化const成员变量?这就需要这节我们说的初始化列表。

    C++中提供初始化列表对类成员变量进行初始化,先来看下初始化列表的语法规则(其中的m1为成员变量,v1为要初始的值)

要说明的一点是,初始化列表是优先于构造函数执行,下边我们把m_value在初始化列表中初始化
 

#include <iostream>
#include <string>

using namespace std;

class test
{
private:
    int m_i;
    const int m_value;	//定义一个const成员变量
	
public:

    test():m_value(10), m_i(20)	//在初始化列表中将const变量m_value初始化为10, m_i初始化为20
    {

    }

    int getValue()
    {
    	return m_value;
    }

    int getI()
    {
    	return m_i;
    }
};

int main()
{
    test t;
    cout << "t.getValue() = " << t.getValue() << endl;
    cout << "t.getI() = " << t.getI() << endl;
    system("pause");
}

这里我们定义了一个普通的成员变量,一个const成员变量,并且都在初始化列表中对他们进行初始化,来看看编译输出的结果:

输出结果表明,可以定义const成员变量,但是需要在初始化列表中对成员变量进行初始化。

对于初始化列表,有如下几点需要注意:
    -可以使用初始化列表对类成员进行初始化
    -初始化列表优先于构造函数执行
    -成员变量的初始化顺序与定义的顺序相同
    -成员变量初始化的顺序与初始化列表的顺序无关
    
依据上边三点,我们回头看看代码,我们定义的两个成员变量的初始化顺序为 先初始化m_i,再初始化m_value,跟定义的顺序一样,与初始化列表写的顺序无关。

对于类中的const成员
    -类中的const成员会被分配内存空间,本质是只读变量
    -类中的const成员只能在初始化列表中初始化
    -编译器无法得到const成员的初始值,因此无法进入符号表成为真正意义上的常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值