栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

如果自己没有声明,编译器就会为它声明一个拷贝构造函数、拷贝赋值操作符和一个析构函数。此外,如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是public且inline的。

编译器产出的析构函数是一个非虚函数,除非这个类的基类本身声明有virtual析构函数

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

如果某个基类的拷贝赋值操作符被声明为private,编译器拒绝为它的派生类生成拷贝赋值操作符。

请记住 :

编译器可以暗自为class创建默认构造函数、拷贝构造函数、拷贝赋值操作符以及析构函数

通常如果你不希望类支持某一特定的功能,只要不声明对应的函数就是了,但这个操作对拷贝构造函数和拷贝赋值操作符却不起作用,因为条款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。

请记住:

为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的基类也是一种做法。 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号