Effective C++ 条款5 了解C++默默调用了哪些函数

  • 常见的默认构造函数,默认拷贝构造,默认拷贝赋值运算 

#include <iostream>
using namespace std;


class Empty{}; //空类

int main()
{
	Empty e1;    //调用e1的默认构造函数
	Empty e2(e1);//调用e2的默认拷贝构造函数
	e2 = e1;     //调用e2的默认拷贝赋值运算符
	return 0;
}
  • 当在main中有如上代码,类Empty中什么都没有写,但main中却可以调用默认构造,拷贝构造,赋值这三种操作。这是因为编译器为我们写了这些函数。
  • 相当于main中的调用,会让Class Empty从空类变为了下面这样
class Empty{
public:
    Empty() {/******/}
    Empty(const Empty& rhs) {/******/}
    ~Empty() {/******/}
};
  • 注:所有编译器产生的函数都是public的
  • 拷贝赋值出错情况

有一种情况会导致出错,见下面的演示案例

template<typename T>
class NamedObject
{
public:
    //因为name变为了string引用类型,因此参数1位char*类型的构造函数就没有用了
    NamedObject(std::string& name, const T& value);
 
private:
    //此处将name改为了引用形式,objectValue改为了const类型
    std::string& name;
    const T objectValue;
};
 
 
std::string newDog("Persephone");
std::string oldDog("Satch");
NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog,36);
 
p = s; //错误

上述“p=s”错误的原因:

  • name:因为name为引用类型了,我们知道引用一旦绑定就不可以改变引用指向,但是在此处拷贝赋值运算符中,我们将p的name引用从一开始指向于newDog又指向了oldDog,因此会发生错误(引用的绑定不可被修改
  • objectValue:因为objectValue为const类型,因此在初始化之后其值就不可以改变了,此处将p的值从2改变为36因此会发生错误(const值不可修改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L7256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值