Effective C++ item 5

条款5 :了解C++默默编写调用了那些函数

calss A{
	public:
	A() = default; //empty 类会自动创建,显示声明构造时,编译器不会自动添加
	A(std::string a,std::string b){}  
	private:
	std::string aa;
	std::string bb; 
};
int main(){
	A a("abc","123"); // ok
	std::string _a = "123";
	std::string _b = "abc";
	A b(_a,_b); //ok
	A c(); //ok
}

当类中成员变量为non-reference或者non-const时,构造函数参数接受左值和右值,函数体内可通过赋值传给成员变量。同理copy-construct和assignment。

class A{
	public:
	A() = default;;
	A(std::string a,std::string b):aa(a),bb(b){}
	private;
	std::string & aa;
	const std::string bb;
};
int main(){
	A a("123","12345"); //ok,but a.aa  no initialization success
	-----------------------------------------------------------
	std::string a = "123";
	std::string b = "345";
	A b(a,b); // ok
	a = "qweer";
	b;//b.aa no value
}

当类中成员变量为引用类型或const时,必须使用初始化列表进行初始化,但是构造中的参数,引用时必须传入左值才能正确赋值否则为空,而const变量接受左值和右值。注意的时,当使用左值传入参数时,a的值修改之后,b中aa会为空。
将构造函数改成:

A(std::string& a,std::string b):aa(a),bb(b){}

这样上述问题将不不会存在,外部变量a的改变不会使得b.aa为空。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值