C++的缺省的拷贝构造函数和赋值运算符重载函数

很久以来,对于C++的基本概念,本人认为已经很熟透了,今天一个例子就把不足给暴露了。还好,这块重新捡起来特别快。


Copy Constructor and Assignment Operator FAQ, Part I


对于C++的拷贝构造函数和赋值重载函数,估计大家都不陌生。但如果说编译器默认产生的这个函数里面是什么内容呢?还有什么时候需要你去重新写一个拷贝构造函数和赋值运算符呢? 估计要一下子回答正确估计不易。


还好,上面的链接可以找到我们所需要的答案。不过如果说缺省的拷贝构造函数是member-wise的方式,估计大家不直观,至少我在这方面就把它和bitwise的方式混淆了。

还好,搜索到另外一篇blog,可以让我们很直观的来体会member-wise了。


Copy constructors, assignment operators, and exception safe assignment



1
2
3
4
5
  class MyClass {
      int x;
      char c;
      std::string s;
  };


the compiler-provided copy constructor is exactly equivalent to:

1
2
3
  MyClass::MyClass( const MyClass& other ) :
     x( other.x ), c( other.c ), s( other.s )
  {}

MyClass& MyClass::operator=( const MyClass& rhs ) {
      x = other.x;
      c = other.c;
      s = other.s;
      return *this;
  }


看到了吗? 所谓的member-wise就是编译器逐个的成员进行赋值操作,而不是等同于bitwise(也就是memcpy).

the difference between member-wise copying and bitwise copying (such as a memcpy()call) is significant in two cases:

  • copying of subobjects
  • copying of padding bytes

也就是第一篇文章中介绍的,我把上面的翻译一下:

成员方式的拷贝(member-wise copying)和位方式的拷贝(bitwise copying,也就是通过memcpy之类来实现的拷贝)主要差别在于两方面:

1. 子对象的拷贝

2. padding字节的拷贝 

位方式拷贝,是把整个内存的内容都拷贝过去,这在有子对象的情况下是个灾难。估计大家都知道。

但有时发现自己没有子对象,只是简单的数值类型时,一定要主要padding的字节,尽量不要通过memcmp来比较两个对象的类容是否相等。要通过member-wise的方式,逐个成员数据进行比较 (切记)。


终于把这块短板不起来了,呵呵。

后记,为了进一步巩固先前的模糊的部分,贴上另外一个blog。 关于什么是POD的类型?

POD主要是用于和C代码来打交道的。什么是POD结构(Plain Old Data)? http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

expression POD type T non-POD type T
 new T not initialized default-initialized
 new T() always default-initialized
 new T(x) always initialized via a constructor




C++的缺省的拷贝构造函数和赋值运算符重载函数

上一篇:css3中transition属性详解


下一篇:Python 入門語法和類型(转载学习)