effective c++条款05

编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment函数

看个例子

#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;

class E05
{
	friend ostream& operator<<(ostream& out, E05& e05)
	{
		out << e05.m_name << " " << e05.m_age;
		return out;
	}
public:
	E05() {}
	E05(std::string name, int age) :m_name(name), m_age(age){}
	~E05(){}
private:
	std::string m_name;
	int m_age;
};

int main()
{
	E05 e05_f("小明", 20);
	cout << e05_f << endl;
	E05 e05_s(e05_f);//使用了默认复制构造函数
	cout << e05_s << endl;
	E05 e05_t;
	e05_t = e05_f;//使用默认赋值构造函数
	cout << e05_t << endl;
	system("pause");
	return 0;
}

小明 20
小明 20
小明 20
这就是默认复制和赋值构造函数的效果

但是假如E05类是这样的

class E05
{
	friend ostream& operator<<(ostream& out, E05& e05)
	{
		out << e05.m_name << " " << e05.m_age;
		return out;
	}
public:
	E05() {}
	E05(std::string name, int age) :m_name(name), m_age(age){}
	~E05(){}
private:
	std::string& m_name;
	const int m_age;
};
int main(){
	E05 a(小明,10);
	E05 b(小明的大哥,20);
	a = b;//这条语句能通过编译吗?
	return 0;
}
由于默认复制构造函数和默认赋值狗构造函数,只是简单的复制其内部的成分,比如,string 对象会调用string的copy复制构造函数,int 属于内置类型,只会简单的复制其副本
但是引用有了初值后,不允许改变其指向,const 常量也不允许改变其常量
特意讲这个的原因是想说明 默认复制构造函数和默认赋值构造函数只会进行简单的复制和赋值,对于某些特殊的类,复制构造函数和赋值构造函数必须要自己编写
此时编译器不会自动生成默认构造函数,reference对象无法更改指向的对象,const成员也无法更改,基于以上原因,默认赋值构造函数不会生成
此外,如果base class将赋值构造函数声明为private,编译器将拒绝为derived class生成一个赋值构造函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值