当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候系统将会提供给一个默认的拷贝构造函数来完成这个过程。Copy构造函数有一个参数,这个参数是一个该类的对象。例如CString的构造函数CString( const CString& stringSrc )就是一个Copy构造函数。
代码:
#include <iostream.h>
#include <string.h>
#include <fstream.h>
ofstream out("autocc.out");
class inside_withCC {
static int inside_withCC_object_count;
public:
inside_withCC(){
out << "inside_withCC constructions function is called" << endl;
inside_withCC_object_count++;
out << "inside_withCC(): inside_withCC_object_count = " << inside_withCC_object_count << endl;
}
inside_withCC(const inside_withCC&) {
out << "inside_withCC copy-constructions function is called" << endl;
inside_withCC_object_count++;
out << "inside_withCC(const withCC&): inside_withCC_object_count = " << inside_withCC_object_count << endl;
}
};
int inside_withCC::inside_withCC_object_count = 0;
class withCC {
static int withCC_object_count;
inside_withCC IWITHCC;
public:
withCC(){
out << "withCC constructions function is called" << endl;
withCC_object_count++;
out << "withCC(): withCC_object_count = " << withCC_object_count << endl;
}
withCC(const withCC&) {
out << "withCC copy-constructions function is called" << endl;
withCC_object_count++;
out << "withCC(const withCC&): withCC_object_count = " << withCC_object_count << endl;
}
};
int withCC::withCC_object_count = 0;
class woCC {
enum { bsz = 30 };
char buf[bsz];
static int woCC_object_count;
public:
woCC(const char* msg = 0) {
memset(buf, 0, bsz);
if(msg) strncpy(buf, msg, bsz);
out << "woCC construction function is called" << endl;
woCC_object_count++;
out << "woCC(): woCC_object_count: " << woCC_object_count << endl;
}
void print(const char* msg = 0) const {
if(msg) out << msg << ": ";
out << buf << endl;
}
};
int woCC::woCC_object_count = 0;
class composite {
withCC WITHCC;
woCC WOCC;
static int composite_object_count;
public:
composite():WOCC("composite()") {
out << "composite constructor function is called" << endl;
composite_object_count++;
out << "composite(): composite_object_count: " << composite_object_count << endl;
}
composite(const composite& cmp)
{
out << "composite copy-constructor function is called" << endl;
composite_object_count++;
out << "composite(composite&): composite_object_count:" << composite_object_count << endl;
}
void print(const char* msg = 0) {
WOCC.print(msg);
}
};
int composite::composite_object_count = 0;
int main(int argc, char* argv[])
{
composite c;
c.print("contents of c");
out << "calling composite copy-constructor"
<< endl;
composite c2 = c;
c2.print("contents of c2");
return 0;
}
autocc.out文件为:
inside_withCC constructions function is called
inside_withCC(): inside_withCC_object_count = 1
withCC constructions function is called
withCC(): withCC_object_count = 1
woCC construction function is called
woCC(): woCC_object_count: 1
composite constructor function is called
composite(): composite_object_count: 1
contents of c: composite()
calling composite copy-constructor
inside_withCC constructions function is called
inside_withCC(): inside_withCC_object_count = 2
withCC constructions function is called
withCC(): withCC_object_count = 2
woCC construction function is called
woCC(): woCC_object_count: 2
composite copy-constructor function is called
composite(composite&): composite_object_count:2
contents of c2: