0
点赞
收藏
分享

微信扫一扫

Effective C++读书笔记(条款05:了解C++默默编写并调用哪些函数 && 条款06:若不想使用编译器自动生成的函数,就该明确拒绝)

小龟老师 2022-02-26 阅读 25

什么时候空类不再是一个空类呢?当C++处理过它之后。

如果你打算在一个“内含引用成员”的class内支持赋值操作,你必须自己定义拷贝赋值操作符。面对“内含const成员”的classes,编译器的反应也一样。

请记住 :

通常如果你不希望类支持某一特定的功能,只要不声明对应的函数就是了,但这个操作对拷贝构造函数和拷贝赋值操作符却不起作用,因为条款05:已经指出了,如果你不声明它们,而某些人尝试调用它们,编译器会为你声明它们。

我们的解决办法是将拷贝构造函数和拷贝赋值操作符声明为private,但这个做法并不绝对安全,因为成员函数以及friend还是可以调用private函数。

我们实现一个专门为了阻止copying动作而设计的基类

class uncopyable {
protected:
    Uncopyable(){}        //允许派生对象构造和析构
    ~Uncopyable(){}
private:
    Uncopyable(cosnt Uncopyable&);        //但阻止copying
    Uncopyable& operator=(const uncopyable&);
}

为了阻止A对象被拷贝,我们唯一需要做的就是继承Uncopyable:

class A:private Uncopyable{        //类不再声明拷贝构造函数或拷贝赋值操作符
    ...
};

这行得通,任何人——甚至是成员函数或友元函数尝试拷贝A对象,编译器试着生成拷贝构造函数和一个拷贝赋值操作符。正如条款12所说:这些函数的“编译器生成版”会尝试调用其基类的对应兄弟,那些调用会被拒绝,因为其基类的拷贝函数是private。

 

举报

相关推荐

0 条评论