您的位置:首页 > 移动开发 > Objective-C

Inside the c++ object model读书笔记之拷贝构造函数(一)

2014-03-21 00:43 351 查看
在C++中,会有三种情况以一个对象作为另一个对象的初值,分别为:

1.   

class X
{
…
};
X x;
X xx = x;


2.

void fun(X x);
X xx;
Fun(xx);


3.  

X fun()
{
Xxx;
return  xx;
}


在以上三种情况中,编译器会在必要的时候合成拷贝构造函数。那么何为必要的时候呢?首先看这样一种情况:

class String
{
public:
//………没有显示声明拷贝构造函数
public:
char*str;
intlen;
};
String obj(“hello”);
String Obj = obj;


这种情况下,会以一种叫做Default memberwise initialization的手法来完成初始化Obj,这就相当于分别对每一个成员进行初始化,也就是所谓的逐位拷贝:

Obj.str = obj.str;

Obj.len = obj.len;

但是当String的对象作为了一个类成员变量时,情况有所改变,比如:

class Word
{
public:
//….没有提供显示的拷贝构造函数
public:
int m;
String word;
};


这种情况下,当有类对象做成员变量时,会把每个成员类对象以default memberwise initlization初始化。假如这时候的Sting类提供了一个拷贝构造函数:

class String
{
public:
String(constString&);
public:
char* str;
int   len;
};


那么这时候的编译器将需要为Word类合成一个拷贝构造函数以便调用成员类对象的拷贝构造函数,如下为测试例子:

class Base
{
public:
Base()
{}
~Base()
{}
Base(constBase& obj)
{
cout<< "Base copy constructor!" << endl;
}
};

class Test
{
public:
Test()
{}
~Test()
{}
public:
Base obj;
int m;
};

int main()
{
Testobj();
Testobject(obj);
return0;
}


运行结果为:



说明在Test类中,编译器合成了一个拷贝构造函数,并在函数中调用了Base类的拷贝构造函数,同时拷贝构造函数会复制每一个其它成员变量,需要注意是的是此处如果涉及的指针的复制是浅拷贝,所谓浅拷贝就是直接复制指针的值,而不是拷贝指针所指空间的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 拷贝构造函数