Effective C++ 条款6——若不想使用编译器自动生成的函数,就该明确拒绝

原创 2013年12月02日 09:37:44

拒绝方法

上一节中说编译器为我们合成课一些函数,他们不仅仅功能简陋,甚至有时是我们所明令禁止的。比如说复制,在业务逻辑上,有些先天独一无二的东西是不允许复制的。

对于其他功能,只要我们在类中不去声明定义,那么自然不会有此功能,但对于copy构造函数和copy assignment操作符就不会起作用。正如上一节所说,若果不去声明定义,那么编译器会为我们声明他们。这里有一个办法:

class Example{
public:
...

private:
Example(const Example&);
Example& operator=(const Example&);
};

看出来了吗?我们将函数写到了private里,这样当我们的用户(类的使用者)尝试copy时,编译就会报错。在c++ iostream程序库中阻止copy的行为也是这个样子,可以自己去查查看。但这么写还是有个缺陷,就是友元函数和成员函数还是有可能调用copy。为了追求完美,

class Uncopyable{
protected:
Uncopyable() { }
~Uncopyable() { }
private:
Uncopyable (const Uncopyable&);
Uncopyable& operator=(const Uncopyable&)
};

将copy的行为放入一个专门的基类中。那么

class Example:private Uncopyable{

....

};

此时任何尝试copy Example对象的行为都是不允许的。

说的直白点,就是我们自定义出函数,阻止编译器为我们合成他们,然后将我们自定义的函数处于不可用状态。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

条款6:若不想使用编译器自动生成的的函数,就该明确拒绝

Explicitly disallow the use of compiler-generated function  you do not want! 在C++的设计和实现中,对于有的类的对象,可...

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

条款6:若不想使用编译器自动生成函数,就该明确拒绝

前面我们已经知道,编译器会默认为我们合成六个成员函数分别是:构造函数、拷贝构造函数、析构函数、赋值运算符重载、取地址运算符重载、const取地址运算符重载。   那么如果我们如果不想要编译器为我们自...
  • gjggj
  • gjggj
  • 2017-05-08 20:24
  • 343

effective c++若不想使用编译器自动生成的函数,就应该明确拒绝

友元函数: 友元函数只是一个普通函数,并不是该类的类成员函数,它可以在任何地方调用,友元函数中通过对象名来访问该类的私有或保护成员。class A { public: A(int _a):a...

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

// 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝。 #include // 防止编译器自动生成copy构造函数和copy assignment操作符的两种方法: // 1.将这两个...

effective c++条款5,6(c++默默编写并调用哪些函数,若不想使用,就该明确拒绝)

当我们写一个类时,若类里面是空的,那么编译器就会自动声明一个拷贝构造函数,一个copy assignment操作符合一个析构函数,如果没有声明其他构造函数,也会默认生成一个默认构造函数,若自己写了一个...

Effective c++学习笔记——条款6,不想自动生成函数,要明确拒绝

Explicitly disallow the use of complier-generated functions you do not want         上一条款我们已经知道,编译器会...

<Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数

引言:觉得这一Item挺重要的所以特地拿出来说一说。之前在知乎看到过陈硕大大的某回答中有这么一句话让我印象深刻,大致是“想知道一个项目靠不靠谱(编码者基础扎不扎实),只要点开一个文件看看自己设计的类,...

Item 06: 若不想使用编译器自动生成的函数,就该明确拒绝

Item 06:Explicitly disallow the use of compiler-generated functions you do not want. 假设你现在要实现一个类,你不想...

若不想使用编译器自动生成的函数,就该明确拒绝

通常如果你不希望class 支持某一特定机能,只要不声明对应函数就是了。但这个策略对copy 构造函数和copy assignment 操作符却不起作用,如果你不声明它们,而某些人尝试调用它们,编译器...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)