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

2021-08-17 23:59

阅读:820

标签:功能   编译器   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


评论


亲,登录后才可以留言!