Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
2021-08-17 23:59
标签:功能 编译器 prot 函数 就会 赋值运算符重载 派生 重载 opera 我们先定义一个房地产类 class HomeForSale{} 我们认为一个房地产应该是独一无二的,所以不希望他被拷贝或者赋值。所以我们希望下面的语句是错误的,编译器应该不予通过 int main() { HomeForSale h1; HomeForSale h2; HomeForSale h3(h1); // wrong h1 = h2 // wrong } 那如何实现呢? 上述的两个语句分别调用了HomeForSale类的拷贝构造函数和赋值运算符重载函数。通常来讲,如果我们不实现一个函数,那么编译器在调用的时候自然会报错。但是这两个函数非常特殊,如果我们自己不定义,编译器自己会给我们定义。那现在的问题就是怎么阻止编译器自己定义。 编译器自己定义方法都是public的,所有人都能用。如果我们自己声明一个私有的,那么外面的人调用时候就会出错。这可以算一个解决方案。但是它不绝对安全。因为HomeForSale这个类自己也可能会进行赋值和拷贝。 为了解决这个问题,我们可以考虑设计一个UNcopyable基类。 class Uncopyable { protected: Uncopyable(){} ~Uncopyable(){} private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); } 我们将不可复制这一个功能下放到基类。这样即使我们的派生类想要赋值,基类也不会允许。 将相应的成员函数声明为私有并不予实现 利用一个基类实现私有功能,并让不允许拷贝的类作为派生类 Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝标签:功能 编译器 prot 函数 就会 赋值运算符重载 派生 重载 opera 原文地址:https://www.cnblogs.com/destinyzk/p/14926103.html
文章标题:Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
文章链接:http://soscw.com/index.php/essay/107541.html