拷贝构造函数是一种特殊的构造函数。copy constructor
它是构造函数,所以函数名是类名、没有返回值
它是特殊的构造函数:参数形式是固定的
class Object
{
public:
Object( const Object& other );
};
拷贝构造函数的含义: 以一个对象为蓝本,来构造另一个对象。
Object b;
Object a(b); // 或写成 Object a = b;
称作:以b为蓝本,创建一个新的对象a。
(a是b的一个拷贝/备份,两者内容完全相同)
拷贝构造函数从来不显式调用,而是由编译器隐式地调用。
在以下三种情况:
(1)定义对象
Object a;
Object b(a); // 或写成 Object b = a;
(2)动态创建对象
Object a;
Object* p = new Object(a);
(3)函数的传值调用
void Test(Object obj);
构造:
Object a;
Object b = a; // 或写作 Object b(a);
// 此为“构造”,在创建对象的时候给初值,拷贝构造函数被调用
赋值:
Object a(1,2);
Object b;
b = a; // 此为“赋值”,不会调用拷贝构造函数
在拷贝构造函数,可以访问参数对象的任意成员
因为它们是同类,所以访问不受限制。
Object(const Object& other)
{
this->a = other.a;
this->b = other.b;
}
#include <stdio.h> #include <stdlib.h> #include <string.h> class Object { public: Object(int a, int b) { this->a = a; this->b = b; } Object(const Object& other) { printf("in copy constructor...\n"); this->a = other.a; this->b = other.b; } private: int a; int b; }; void Test(Object obj) // Object obj(x) { } int main() { Object x(1,2); Test(x); // Object y(x); // copy // Object* p = new Object(x); // // delete p; return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> class Base { public: int dddd; }; class Object : public Base { public: Object(int a, int b) { this->a = a; this->b = b; } Object(const Object& other):Base(other) { this->a = other.a; this->b = other.b; } private: int a; int b; }; int main() { Object objx(1,2); objx.dddd = 123; Object objy(objx); return 0; }