什么是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 ++编译器提供了默认的拷贝构造函数(如果完全没有在类中明确定义的话),我们也会为这个类编写拷贝构造函数,原因如下。
- 如果在类中有任何dynamic内存分配。
- 如果我们在类中使用指针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表单):