什么是C ++中的复制构造函数?

Scott Meyers的Effective C ++第6页中定义了“复制构造函数”这个术语。 我一直使用Schiltdt的书作为我的参考,我可以发现没有提到复制构造函数。 我明白了,但这是c ++的标准部分? 这样的构造函数在按值传递类时会被调用吗?

复制构造函数具有以下forms:

class example { example(const example&) { // this is the copy constructor } } 

以下示例显示了它的调用位置。

 void foo(example x); int main(void) { example x1; //normal ctor example x2 = x1; // copy ctor example x3(x2); // copy ctor foo(x1); // calls the copy ctor to copy the argument for foo } 

是的,复制构造函数肯定是标准C ++的重要组成部分。 在这里阅读更多关于他们(和其他构造函数)(C ++ FAQ)。

如果你有一本没有教授复制构造函数的C ++书,就把它扔掉。 这是一本不好的书。

请参阅维基百科上的复制构造函数 。

基本的想法是复制构造函数通过复制现有的实例来实例化新的实例:

 class Foo { public: Foo(); // default constructor Foo(const Foo& foo); // copy constructor // ... }; 

给定一个实例foo ,调用复制构造函数

 Foo bar(foo); 

要么

 Foo bar = foo; 

标准模板库的容器要求对象是可复制和可分配的,所以如果你想使用std::vector<YourClass> ,一定要定义一个合适的拷贝构造函数和operator=如果编译器生成的默认值没有意义。

复制构造函数将在以下scheme中调用:

  • 从现有对象创build新对象时。

     MyClass Obj1; MyClass Obj2 = Obj1; // Here assigning Obj1 to newly created Obj2 

    要么

     MyClass Obj1; MyClass Obj2(Obj1); 
  • 按值传递类对象时。

     void NewClass::TestFunction( MyClass inputObject_i ) { // Function body } 

    上面MyClass对象通过值传递。 所以MyClass的复制构造函数将会调用。 通过引用传递,以避免复制构造函数调用。

  • 按值返回对象时

     MyClass NewClass::Get() { return ObjMyClass; } 

    上面的MyClass是由值返回,所以MyClass的复制构造函数将调用。 通过引用传递,以避免复制构造函数调用。

复制构造函数是C ++的重要组成部分。 即使任何C ++编译器提供了默认的拷贝构造函数(如果完全没有在类中明确定义的话),我们也会为这个类编写拷贝构造函数,原因如下。

  1. 如果在类中有任何dynamic内存分配。
  2. 如果我们在类中使用指针variables。 (否则它将是一个浅的副本,其中2个对象将指向相同的内存位置。)

要进行深层复制,必须编写一个复制构造函数并重载赋值运算符,否则复制将指向原始文件,带来灾难性后果。

复制构造函数的语法如下:

 class Sample{ public: Sample (const Sample &sample); }; int main() { Sample s1; Sample s2 = s1; // Will invoke Copy Constructor. Sample s3(s1); //This will also invoke copy constructor. return 0; } 

Eli发布的C ++ FAQ链接很好,gbacon的post是正确的。

要明确地回答你的问题的第二部分:是的,当你通过值传递一个对象实例时,复制构造函数将被用来在函数调用的范围内创build对象的本地实例。 每个对象都有一个“默认拷贝构造函数”(gbacon暗示为“编译器生成缺省值”),它简单地复制每个对象成员 – 例如,如果对象实例包含指针或引用,则这可能不是你想要的。

关于(重新)学习C ++的优秀书籍 – 我在二十年前才第一次了解它,从那时起它已经改变了很多 – 我推荐Bruce Eckel的“Thinking in C ++”版本1和2,这里免费提供PDF和HTML表单):

http://www.ibiblio.org/pub/docs/books/eckel/