怎样禁止C++ 类支持拷贝

怎样禁止C++ 类支持拷贝

C++ 编译器默默地为你做了不少工作

  • 当你写下

    class Empty {};
    //事实上等价于
    class Empty {
    public:
        Empty() { ... } //default constructor
        Empty(const Empty &rhs) { ... } //copy constructor
        ~Empty() { ... } //destructor
    
        Empty& operator=(const Empty &rhs) { ... } //copy assignment
    };
  • 然而,有的时候,你却想禁止类进行复制。

    假设你不声明 copy 构造函数或者 copy assignment 操作符,编译器将为你产生一份;假设你声明他们。你的类相同支持 copying。

解决方式:

  • 将拷贝构造函数和copy assignment 声明为 private, 并不给出实现; 一般而言,member 函数和 friend 函数还是有可能调用它们,这会导致一个链接错误(由于你未定义函数)

    class A {
    public:
    private:
        A(const A &rhs); //仅仅有声明
        A& operator=(const A &rhs);
    };
  • 更好的做法。能够将做法1 的连接错误转移到编译期(越早发现错误越好)。让类继承 例如以下的base 类这可行的原因在于:仅仅要不论什么人----甚至是 member 函数 或 friend 函数-----尝试拷贝对象,编译器都会试着生成一个 copy 构造函数和
    copy assignment 操作符。而这些函数的“编译器生成版”会尝试调用 base class 的相应兄弟,而这些调用会被编译器拒绝,因此 base class 的拷贝函数是 private。

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

    另一点须要注意的是,继承用 private 而不是 public。这样能够阻止public继承时。下列的代码:(内存泄漏,由于通过基类的指针删除派生类对象,基类必须是 virtual 虚函数,否则内存泄漏)

    Uncopyable *p = new B();
    ...
    delete p;
时间: 2024-10-16 17:19:20

怎样禁止C++ 类支持拷贝的相关文章

如何禁止C++ 类支持拷贝

如何禁止C++ 类支持拷贝 C++ 编译器默默地为你做了不少工作 当你写下 class Empty {}; //其实等价于 class Empty { public: Empty() { ... } //default constructor Empty(const Empty &rhs) { ... } //copy constructor ~Empty() { ... } //destructor Empty& operator=(const Empty &rhs) { ...

wxWidgets第二课 DECLARE_NO_COPY_CLASS 禁止类的拷贝

说明 在defs.h文件中,对该宏进行了如下的定义 #define DECLARE_NO_COPY_CLASS(classname) \ wxDECLARE_NO_COPY_CLASS(classname); 而wxDECLARE_NO_COPY_CLASS的实际定义如下: #define wxDECLARE_NO_COPY_CLASS(classname)      \ private:                                    \ classname(const

读书笔记 effective c++ Item 14 对资源管理类的拷贝行为要谨慎

1. 自己实现一个资源管理类 Item 13中介绍了 “资源获取之时也是初始化之时(RAII)”的概念,这个概念被当作资源管理类的“脊柱“,也描述了auto_ptr和tr1::shared_ptr是如何用堆资源来表现这个概念的.然而并不是所有资源都是在堆上创建的,对于这种资源,像auto_ptr和tr1::shared_ptr这样的智能指针就不适合当作资源句柄(handle)来使用了.你会发现你时不时的就会需要创建自己的资源管理类. 举个例子,假设你正在使用C API来操纵Mutex类型的互斥信

15.含有指针成员的类的拷贝(copy constructor)

http://zhedahht.blog.163.com/blog/static/25411174200722710364233/ http://www.cnblogs.com/t427/archive/2012/08/10/2633133.html http://blog.csdn.net/gamecreating/article/details/5382902 http://www.cppblog.com/xczhang/archive/2008/01/21/41569.html 题目:下面

c++类的拷贝、赋值与销毁(拷贝构造函数、拷贝赋值运算符析构函数)

拷贝构造函数     如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. 拷贝构造函数第一个参数必须是一个引用类型.此参数几乎总是一个const的引用.拷贝构造函数在几种情况下都会被隐式地使用.因此,拷贝构造函数通常不应该是explicit的. 合成拷贝构造函数 与合成默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数. 对某些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成的拷贝构造函数

C++基础3 类:构造 拷贝 析构函数,

为什么会出现构造函数 与 析构函数 [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; class Test { public: void init() { a = 1; b = 2; } private: int a; int b; }; int main() { Test arr[

禁止对象之间的拷贝

如何禁止对象之间的拷贝? 将构造函数和析构函数中的任意一个设置为private,如下: class A{ public: A(){}; private: ~A(){}; A(const A&a){}; A &operator=(const A&a){return a;} }; A a; 编译报错提示:Variable of type 'A' has private destructor. 我们知道,如果我们不显性的声明拷贝构造函数和重载=,那么编译器会为我们提供默认的拷贝构造函数和

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

引用参数与引用返回值 类的拷贝构造

引用地址  http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查.    首先看一下在类的成员函数中的引用参数和引用返回值: 类定义class A{     public:      int x; A