若不想使用编译器自动生成的函数,应该明确拒绝
2017-09-16 00:09
260 查看
方法是:可以将对应的函数在类中进行声明,这样编译器就不会自动去生成。可行具体方案如下:
(1).将这个函数在该类中声明为private,并不进行定义。
(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)
代码示例:
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale &); // 参数并非必要,这里不去实现,所以不写
HomeForSale& operator= (const HomeForSale &);
}
(2).将该函数专门用一个基类里面进行声明为private,并不进行定义。
然后进行继承,继承类不用再写该函数。(这可以保证当本类成员函数或者友元函数进行调用时,在编译期就可以发现错误)
代码示例:
class Uncopyable
{
protected:
Uncopyable(){} // 允许继承对象的构造和析构函数
~Uncopyable(){} // 析构函数不一定得是virtual
private:
Uncopyable(const Uncopyable&); // 阻止拷贝
Uncopyable& operator=(const Uncopyable&);
}
class HomeForSale : private Uncopyable // 不一定都是public 继承
{
// class 不再声明拷贝构造函数和赋值操作符
...
}
这行得通,因为只要任何人,甚至是成员函数或友元函数,尝试拷贝,编译器便试着生成一个copy构造函数和一个copy assigenment 操作符,这些函数的“编译器生产版”会尝试调用其 base class 的对应兄弟,那些调用会被编译器拒绝,因为其 base class 的拷贝函数是private
(1).将这个函数在该类中声明为private,并不进行定义。
(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)
代码示例:
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale &); // 参数并非必要,这里不去实现,所以不写
HomeForSale& operator= (const HomeForSale &);
}
(2).将该函数专门用一个基类里面进行声明为private,并不进行定义。
然后进行继承,继承类不用再写该函数。(这可以保证当本类成员函数或者友元函数进行调用时,在编译期就可以发现错误)
代码示例:
class Uncopyable
{
protected:
Uncopyable(){} // 允许继承对象的构造和析构函数
~Uncopyable(){} // 析构函数不一定得是virtual
private:
Uncopyable(const Uncopyable&); // 阻止拷贝
Uncopyable& operator=(const Uncopyable&);
}
class HomeForSale : private Uncopyable // 不一定都是public 继承
{
// class 不再声明拷贝构造函数和赋值操作符
...
}
这行得通,因为只要任何人,甚至是成员函数或友元函数,尝试拷贝,编译器便试着生成一个copy构造函数和一个copy assigenment 操作符,这些函数的“编译器生产版”会尝试调用其 base class 的对应兄弟,那些调用会被编译器拒绝,因为其 base class 的拷贝函数是private
相关文章推荐
- Effective C++学记之06 若不想使用编译器自动生成的函数,就应该明确拒绝。
- 若不想使用编译器自动生成的函数,就应该明确拒绝
- 读书笔记《Effective c++》 条款06 若不想使用编译器自动生成的函数,就应该明确拒绝
- 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝
- Effective C++条款06解读 : 若不想使用编译器自动生成的函数, 就应该明确拒绝
- effective c++若不想使用编译器自动生成的函数,就应该明确拒绝
- 如果不想使用编译器自动生成的函数,就应该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
- 条款6:如果不想使用编译器自动生成的函数,就应该明确的拒绝。
- 条款6:若不想使用编译器自动生成的的函数,就该明确拒绝
- 【06】若不想使用编译器自动生成的函数,就该明确拒绝
- 条款六 若不想使用编译器自动生成的函数,就该明确的拒绝
- 条款6:若不想使用编译器自动生成的函数,就该明确拒绝
- 若不想使用编译器自动生成函数,就该明确拒绝
- 条款6:若不想使用编译器自动生成函数,就该明确拒绝
- 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝(Explicitly disallow the use of compiler-generated you do not want.)
- 条款6:若不想使用编译器自动生成的函数,就该明确拒绝
- effective C++ 条款 6:若不想使用编译器自动生成的函数,就该明确将拒绝