1.1 const 变量作为类的成员函数
1.1.1 const 变量作为类的成员函数示例代码
class Test
{
private:
const int a;
public:
Test(int i):a(i) // 通过初始化列表的形式对const 只读变量进行初始化
{ }
};
int main()
{
Test t1(10);
return 0;
}
总结:通过代码实例,我们可以看出const 只读变量作为类的成员函数的时候只能通过初始化列表的形式对const只读变量进行初始化。
1.1.2 初始化和赋值的区别
- 我理解的是,在类中,在初始化列表中的就是初始化,而在构造函数的函数体内进行的就是赋值:
Test():c(1) ======>初始化
Test(){int a =10} =====>这就是赋值
注意初始化和赋值两者的区别
- 初始化 : 对正在创建的对象进行初值的设置 (
注意对象正在创建
) - 赋值 : 对已经存在的对象进行值设置(
注意对象已经存在
)
int i =10 ; //初始化
int b ;
b =10; //赋值
- 初始化和赋值的比较
struct Test
{
private:
const int ci;
int j;
public:
Test(int i,int j) :ci(i) //对i初始化
{
this->j = j; //对j赋值
}
Test():ci(10),j(20) //对i,j初始化,而不是赋值
{
}
void print()
{
printf("ci=%d,j=%d\n",ci,j);
}
};
int main()
{
Test t(1,2);
t.print();
Test t2;
t2.print();
return 0;
}
1.1.3 注意事项
- 成员的初始化与成员的声明顺序相同
- 成员的初始化顺序与初始化列表中位置无关
- 初始化列表先于构造函数的函数体执行。
1.1.4 初始化列表的代码实例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
class Value
{
private:
int v;
public:
Value(int v)
{
this->v =v;
printf("value =%d\n",v);
}
};
class Test
{
private:
const int a;
Value v2;
Value v1;
Value v3;
public:
Test(int i,int j,int k ,int m):a(i),v1(j),v2(k),v3(m)
{
printf("Test()\n");
}
};
int main()
{
Test t1(1,1,2,3);
return 0;
}
结果:
value =2;
value =1;
value =3;
结果再次证明了,初始化顺序与变量的声明顺序有关。
1.2 类中的const 成员再分析
- 类中的const成员被分配空间
- 类中的const 成员的本质是只读变量
- 类中的const成员只能在初始化列表中指定初始值
注意:编译器无法直接得到const成员的初始值,因此无法进入符号表成为真正意义上的常量
1.3 对象的构造顺序
1.3.1
- 局部对象的构造顺序依赖于程序的执行流
- 堆对象的构造顺序依赖于new的使用顺序
- 全局对象的构造顺序是不确定的
参考一 :狄泰软件学院C++进阶剖析
如有侵权:请联系邮箱 1986005934@qq.com