「Effective C++」条款04: 确定对象被使用前已先被初始化

1.为什么要初始化?

例如int x; 此时并没有给x进行初始化,但是可能会被赋处置0但是在更多的情况下,x内存的是脏数据,并不清楚具体的值,所以操作未知的值会引发意想不到的状况,为此,我们使用对象前需要进行初始化。

2.基础知识:C++的内置类型(C++不保证初始化内置类型,会初始化非内置类型)

类型描述大小(字节)范围
bool布尔类型1true/false
char字符类型1-128 到 127 或 0 到 255
signed char有符号字符类型1-128 到 127
unsigned char无符号字符类型10 到 255
short短整数类型2-32768 到 32767
unsigned short无符号短整数类型20 到 65535
int整数类型4-2147483648 到 2147483647
unsigned int无符号整数类型40 到 4294967295
long长整数类型4 或 8-2147483648 到 2147483647 或更大
unsigned long无符号长整数类型4 或 80 到 4294967295 或更大
long long长长整数类型8-9223372036854775808 到 9223372036854775807
unsigned long long无符号长长整数类型80 到 18446744073709551615
float单精度浮点数类型4精度约为6位小数
double双精度浮点数类型8精度约为15位小数
long double长双精度浮点数类型8 或 16精度约为15位小数或更大
wchar_t宽字符类型2 或 41 个宽字符编码单元(UTF-16)或代码点(UTF-32)
char16_tUTF-16字符类型21 个UTF-16代码单元
char32_tUTF-32字符类型41 个UTF-32代码单元
void空类型无法存储值
std::nullptr_t指针

3.推荐的初始化方式

​ ·首先看不推荐的初始化方式(记住C++规定对象的成员变量初始化动作发生在进入构造函数本体之前)

class Student      //首先定义一个类
{
public:
	Student(int age,int number,string name);
private:
	int s_age;
	int s_number;
	string s_name;
}

Student:Student(int age,int number,string name)   //构造函数的实现
{
	s_age=age;				//这是使用赋值的方式,而非初始化的方式,因为在构造函数体内
	s_number=number;
	s_name=name;
}

以下是推荐的方式:使用初始化列表

class Student      //首先定义一个类
{
public:
	Student(int age,int number,string name);
private:
	int s_age;
	int s_number;
	string s_name;
}

Student:Student(int age,int number,string name)   //构造函数的实现
:s_age(age),s_number(number),s_name(name)		//这才是真正的初始化,而不是赋值
{
	
}

​ ·二者的区别和联系以及优缺点

​ 首先两段代码在使用上几乎没有区别,但是在时间效率上有所不同。第一种方式(在构造函数函数体内进行初始化),这种方式,首先Student这个构造函数对s_age s_number s_name 进行了设初值,然后显式的对s_age s_number s_name进行赋值,所以浪费了Student 构造函数做的事。

​ 第二种方式只使用了一次拷贝构造函数对s_age s_number s_name进行了初始化,效率会有很大的提高。

​ 虽然对于内置类型,两种方式的效率几乎相同,但是为了统一,建议还是都使用初始化列表的方式进行初始化。

4.初始化列表部分初始化

​ 如果只想初始化几个成员变量,而不想全部初始化,可以使用以下做法:

Student:Student()  				 //使用无参构造函数
:s_age(18),s_number(2012),s_name()		//只对s_age和s_number进行了初始化,对于非内置类型s_name此时没有初始化,则有构造函数进行初始化
{									//虽然没有全部进行初始化,但是还是得写在初始化列表以免遗漏
	
}

5.一定使用初始化的方式情况:

当有const和引用时候,就不可以使用赋值的方式。

6.注意事项

​ 成员变量的声明顺序可以不和初始化列表写的顺序相同,但是实际上初始化顺序还是按照声明顺序进行的,不过请按照声明顺序书写初始化列表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值