Google C++编程规范 – 第三十二条 -《拷贝构造函数》

【规范】

仅在确认需要的时候,才定义拷贝构造函数和赋值运算符;否则,请使用DISALLOW_COPY_AND_ASSIGN关闭此功能。

【定义】

我们通过拷贝构造函数和赋值运算符来实现对一个类对象的拷贝。在一些情况下,编译器会隐式的调用拷贝构造函数,比如在以值传递方式传递对象时。

【支持者的声音】

拷贝构造函数,使得拷贝一个类对象变得很容易。STL容器更是规定其内容都要是可拷贝和可赋值的。拷贝构造方式要比CopyFrom方式更加高效,这是因为拷贝构造方式将构造和拷贝两者结合起来了。而且在一些上下文中编译器会省略掉它们,并且它们会更容易的避免堆分配。

【反对者的声音】

隐式的类对象拷贝会引入很多bug和性能方面的问题,还会因为很难追踪一个类对象的行为而导致代码的可读性的降低。

【结论】

只有很少的类需要进行拷贝。而大多数的类既不需要拷贝构造函数,也不需要赋值运算符。在很多情况下,一个指针或一个引用其实已经足够,而且还会有更好的性能表现。比如,你可以通过传入指针、引用来代替传入一个值,你还可以在STL容器中保存对象的指针,而非对象本身。

如果你的类就是需要可拷贝,那么最好提供一个拷贝方法,比如CopyFrom()或Clone(),而非一个拷贝构造函数,这样可以有效的避免隐式调用。如果拷贝方法还不足以满足你的需求(比如性能方面的原因,或者你的类就是需要在容器中保存对象本身),那么请同时提供拷贝构造函数和赋值运算符。

如果你的类不需要拷贝构造函数或赋值运算符,那么请显式的禁用它们。禁用的方法是在类的private区域中增加一个拷贝构造函数和赋值运算符的哑声明,但是不要提供相应的定义。

DISALLOW_COPY_AND_ASSIGN本身是一个宏,其定义如下:

// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)

然后,我们可以在Foo类中这样使用:

class Foo {
public:
Foo(int f);
~Foo(); private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};

c++ DISALLOW_COPY_AND_ASSIGN的更多相关文章

  1. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  2. [原创]C++通用宏定义

    //单态模式(singletion) #defube DECLEAR_SINGLETION(ClassName) \ private: \ static ClassName* m_pInstance; ...

  3. C++11 之 delete 和 default

    1  特殊成员函数 设计一个类,没有成员函数 (member function),只有数据成员 (member data) class DataOnly { private: std::string ...

  4. Chrome RenderText分析(2)

      接Chrome RenderText分析(1) 继续分析以下步骤   一.TextRun结构 struct TextRun { TextRun(); ~TextRun(); ui::Range r ...

  5. 阅读Google的C++代码规范有感

    李开复曾在微博上说过,Google的C++代码规范是全球最好的一份C++代码规范,没有之一.最近花了点时间看了下这份代码规范,收获确实很大,在编程过程中一些乱七八糟的坏习惯也该改一改了.最新的英文版见 ...

  6. Google开发规范

    v0.2 - Last updated November 8, 2013 源自 Google's C++ coding style rev. 3.274 目录 由 DocToc生成     头文件   ...

  7. Android Framework------之Property子系统

    概述 Property是Android系统中一个重要的概念,在Android系统内,主要用于系统配置,以及不同服务间的简单信息分享.比如设备名字,蓝牙名字,编译信息,网络dns地址,以及其他的一些基本 ...

  8. 创建Chromium WebUI接口

    转载自:http://www.chromium.org/developers/webui Chrome的WebUI是那种,在Chrome中输入 "chrome://xxxx"就能打 ...

  9. google base库中的WaitableEvent

    这个类说白了就是对windows event的封装,没有什么特别的,常规做法,等侍另一线程无非就是等侍事件置信waitsingleobject,通知事件无非就是setevent,一看就明白,不就详解, ...

随机推荐

  1. Nginx 配置文件模板

    user www www; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/loc ...

  2. StringUtil

    package per.son.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.js ...

  3. 面向对象之abstract

    1.abstract class,抽象类不能被实例化,只能被继承:抽象类中可以包含非抽象方法 2.abstract method();抽象方法只能在抽象类中进行声明,并且没有方法体,非抽象继承子类中必 ...

  4. Spring @Resource、@Autowired、@Qualifier的区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Resource注解是J2EE提供,而@Autowired是由Spring提供,故减少系统对s ...

  5. php之curl实现http与https请求的方法

    原文地址:http://m.jb51.net/show/56492   这篇文章主要介绍了php之curl实现http与https请求的方法,分别讲述了PHP访问http网页与访问https网页的实例 ...

  6. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  7. [LeetCode]题解(python):103 Binary Tree Zigzag Level Order Traversal

    题目来源 https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ Given a binary tree, re ...

  8. [LeetCode]题解(python):80-Remove Duplicates from Sorted Array II

    题目来源 https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/ Follow up for "Remov ...

  9. Aptana快捷键(方便查询)

    窗口类:Ctrl+ Shift +L 调出快捷键提示Ctrl+ W 关闭当前标签窗口Ctrl+ Shift + W 关闭当前标签窗口Ctrl+ F6 (或者是Aptana的Ctrl+Tab )下一个编 ...

  10. c# ini file

    ini文件主要用于保存配置.之前一直以为是当作普通文本进行操作,读取里面的内容,再自己解析读取的文本.后来发现已经有写好的api函数:WritePrivateProfileString()和GetPr ...