C++如何拒绝编译器自动生成的函数

每一个class,编译器都会自动生成四个特殊成员函数:

  • destructor(析构函数)
  • default constructor(默认构造函数)
  • copy constructor(copy构造函数)
  • copy assignment operator =(copy assignment操作符)

但是有时候我们不想让我们设计的class有某些默认的构造函数。那么我们就应该明确禁止它。

比如我设计的一个class不想有copy构造函数和copy assignment操作符,那么我可以把这两个函数声明为private并且故意不实现他们。

class zywscq()
{
public:
    zywscq(){}
    ~zywscq(){}
private:
    zywscq(const zywscq&);//只有声明
    zywscq& operator=(const zywscq&);//反正用不到,懒得写参数名称了
}

其实C++11提供了更好的办法:在函数声明后加上“=delete”,就可以将该函数禁用。

class X{
     public:
       X();
       X(const X&) = delete;  // 声明拷贝构造函数为 deleted 函数
       X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 deleted 函数
     }; 

 int main(){
  X x1;
  X x2=x1;   // 错误,拷贝构造函数被禁用
  X x3;
  x3=x1;     // 错误,拷贝赋值操作符被禁用
 }
时间: 2024-10-10 20:32:52

C++如何拒绝编译器自动生成的函数的相关文章

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

Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6. 若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compiler-generated functions you do not want) 地产中介商卖的是房子,一个中介软件系统自然而然想必有个 class 用来描述待售房屋: cla

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

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现.使用像Uncopyable这样的base class也是一种方法 classUncopyable{ protected: //允许derived对象构造和析构 Uncopyable(){} ~Uncopyable(){} private: Uncopyable(constUncopyable&); //但阻止c

【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝

地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子 class HomeFoeSale { ......} 但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作不应该正确! HomeForSale h; HomeForSale h1(h); //调用复制构造函数 HomeForSale h2 = h; //调用赋值操作符 阻止这两个操作(复制.赋值)可以不声明它们,but自己不声明,编译器会自动生成,并且访问权限还是public.没办法只好声明出来,但是如

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

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就是了.但这个策略对copy构造函数和copy assignment操作符却不起作用,你如果不声明它们,而某些人尝试调用它,编译器会为你声明它们. 这把你逼到了一个困境.如果你不声明copy构造函数和copy assignment操作符,编译器可能为你产出一份,于是你的clas支持copying.如果

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

class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForSale&); HomeForSale& operator = (const HomeForSale&);//只有申明,此函数很少被使用   };   //方法二,设计一个专门用来阻止copying动作的基类,然后让其他类继承这个类即可   class Uncopyable { prot

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

有些情况自己是不希望生成拷贝构造函数以及拷贝赋值运算符的,这种时候不能只是自己不去编写这些函数,因为这样编译器会自动的去生成这些函数.保险一点的做法是将拷贝构造函数以及拷贝赋值运算符都声明为private的.这样既阻止了编译器生成默认的版本,而且又阻止了别人去调用它. 注意上面的这条“将成员函数声明为private而故意的不去实现它”是一种常用手段,即使是标准程序库中有的部分也是这样做的. class HomeForSale//很明显,销售的两个方子一般内容都是不相同的,所以拷贝构造函数以及 {

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

如果自己定义的类中并不需要copy assignment操作符或者copy构造函数,为了避免编译器自动生成 因为编译器自动生成的没什么用,一般是按照顺序进行赋值或者拷贝,对于有对象内含有指针的话可能会出现一些问题 可以在private中声明(并不定义)它们.但是,友元和成员函数依然可以调用它们. 在C++11标准中可以用如下方法: class A { public: A(const A&) = delete;//不实现的函数可以不用写参数,光是声明其实也可以不用写参数 A operator=(c

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

记住:为防止编译器暗自提供的功能,可将相应的成员函数声明为privae并且不予实现.也可以使用Uncopyable这样的父类实现. 对于独一无二的对象,希望不支持拷贝构造函数和赋值操作符. class HomeForSale { public: ... private: HomeForSale(const HomeForSale&); //只是声明,阻止编译器自动生成 HomeForSale& operator=(const HomeForSale&); } HomeForSale

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

一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const string& name):m_name(name) {} private: //拒绝copy和赋值,声明为private,并且只声明不实现 A(const A&); A& operator=(const A&); private: string m_name; }; 二.对于拒绝赋值的