《Effective C++》条款5:默认构造/析构/赋值函数的问题

本章节主要讲述了如果不指定类内构造、析构、赋值函数所可能出现的坑;

 

对于每一个类,如果不指定任何函数,则编译器会帮助使用者构建四类基本函数:

1.构造函数:构建;

2.析构函数:析构;

3.赋值函数:主要针对于实参括号初始化所使用的函数;

4.符号赋值函数:利用等号进行函数赋值的函数;

 

其中构造析构是老生常谈的问题,主要在于赋值和符号赋值函数可能出现的问题;

 

对于两者其实操作十分类似,默认直接采用复制的方式来进行赋值操作;

对于对于类内成员的复制操作也可以根据类内成员类型的不同进行不同的操作:

1.类类型,例如string等,直接调用string的copy函数进行复制,相当于逐层调用copy;

2.对于内置类型,往往直接一个bit不差的全部复制过去;

 

存在问题:

关于string、string&、const string& 、引用、指针的函数传参问题;

但是这种默认复制构造往往也存在一些问题,针对于特殊的类内成员可能会有不太好的结果:

例如下个例子:

#include<iostream>
#include<string>
using namespace std;


class test {
public:
	test(string& ss, const int& v) :s(ss),cvalue(v) {}
private:
	const int cvalue;
	string& s;
};



int main() {
	string s1("123");
	string s2("234");
	test t1(s1, 4);
	test t2(s2, 5);
	t1 = t2;
	system("pause");
	return 0;
}

对于如上所示,定义两个类内成员,分别为const int和string的引用;

但是可以得知这样做不合法:

1.const不能进行改变;

2.引用目标也不能进行改变;

所以对于所使用的copy assignment和copy函数,应该进行定义,而非进行默认初始化;

 

其中还要注意一点是继承的问题,如果基类将copy assignment操作符声明为private,则编译器拒绝为派生类生成一个copy assignment操作符;

posted @ 2020-12-03 15:11  暮云林凌  阅读(93)  评论(0)    收藏  举报