C++进阶剖析( 十)之对象的初始化列表和对象的构造顺序

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值