第二十课:初始化列表----------狄泰软件学院

一、类中是否可以定义const成员?

class Test()
{
private:
    const int ci;
public:
    getCI
    {
        return ci;
    }
};

在编译的时候会报错说没有初始化的const成员,那么如何来初始化类中的const成员?
在构造函数中用直接赋值的方法编译时也会出错,因为ci是一个只读成员变量,不能赋值
注注注:类中的const成员是只读变量,且不能在构造函数中用赋值语句来赋值

初始化列表:

class Test()
{
private:
    const int ci;
public:
    Test():ci(10)//初始化列表
    {
        //ci = 10;//这样的话是错误的,ci是只读变量,但可以用指针来改变
    }
    getCI
    {
        return ci;
    }


};

注意事项:

成员的初始化顺序与成员的声明顺序相同
成员初始化顺序与初始化列表中的位置无关
初始化列表先于构造函数的函数体执行

#include <iostream>
using namespace std;

class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};

class Test
{
private:
    Value m2;//value类的对象,不能Value m2(2);故要用初始化列表
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3)//先m2,再m3,最后m1,初始化列表先于构造函数执行
    {
        printf("Test::Test()\n");//先打印2,3,1,再打印Test::Test()
    }
};

int main()
{
    Test t;
    system("pause");
    return 0;
}

二、类中的const成员

类中的const成员会被分配空间(和类空间分配的空间一致,如:类在栈上分配空间,则只读变量也在栈上分配空间)
类中的const成员的本质是只读变量(不是常量,可以用指针来修改)
类中的const成员只能在初始化列表中指定初始值

编译器无法直接得到const成员的初始值,因此无法进入符号表成为真正意义上的常量

#include <iostream>
using namespace std;
class Value
{
private:
    int mi;
public:
    Value(int i)
    {
        printf("i = %d\n", i);
        mi = i;
    }
    int getI()
    {
        return mi;
    }
};


class Test
{
private:
    const int ci;
    Value m2;
    Value m3;
    Value m1;
public:
    Test() : m1(1), m2(2), m3(3), ci(100)
    {
        printf("Test::Test()\n");
    }
    int getCI()
    {
        return ci;
    }
    int setCI(int v)
    {
        int* p = const_cast<int*>(&ci);//用指针来改变值,要先把const属性去掉

        *p = v;
    }
};

int main()
{
    Test t;

    printf("t.ci = %d\n", t.getCI());

    t.setCI(10);

    printf("t.ci = %d\n", t.getCI());
    system("pause");
    return 0;
}

初始化与赋值不同:

初始化:对正在创建的对象进行初值设置
赋值:对已经存在的对象进行值的设置

小结:

类中可以使用初始化列表对成员进行初始化
初始化列表先与构造函数执行
类中可以定义const成员变量
const成员变量必须在初始化列表中指定初值
const成员变量为只读变量(可以用指针来修改,但要进行类型转换去掉const属性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值