您的位置:首页 > 其它

从百度空间(WEB-IDEA)转载:复制构造函数和赋值操作符的区别

2012-04-06 16:53 225 查看
复制构造函数和赋值操作符的区别(以类MyTest为例):

class MyTest{

public:

MyTest();

MyTest(const MyTest&);

MyTest& operator=(MyTest&);

void func1(MyTest obj);

void func2(MyTest& obj);

MyTest func3();

~MyTest();

};

MyTest::MyTest(){

cout << "call construct" << endl;

}

MyTest::MyTest(const MyTest&){

cout << "call copy construct" << endl;

}

MyTest& operator=(MyTest&){

cout << "call operator MyTest" << endl;

return *this;

}

~MyTest() {

cout << "~ MyTest " << endl;

}

void func1(MyTest obj){

}

void func2(MyTest& obj){

}

const MyTest func3(){

MyTest obj;

return obj;

}

一、函数原型上的区别

复制构造函数的函数原型:MyTest(const MyTest&);//一般用const形参

赋值操作符函数的函数原型:MyTest& operator=(const MyTest&);

二、调用时机上的区别

在以下两种情况下,将调用复制构造函数:

1、当定义一个对象并用同一类型的对象对它初始化时 如:

MyTest t1;

MyTest t2(t1);

MyTest t3=t1;

2、当将该类型的对象传递给函数或从函数返回该类型的对象时 如:

MyTest& MyTest::Return(MyTest& mt){

return mt;

}

在使用同类型的对象对一个对象赋值时,将调用赋值操作符函数 如:

MyTest t1;

MyTest t2;

t2 = t1;

下面主要為測試用例:

int main(int argc, char *argv[]){

MyTest eobj; //调用默认构造函数创建MyTest 对象eobj;

//執行結果:MyTest ~MyTest

func1(eobj);
//调用复制构造函数

//将形参MyTest 对象创建为实参MyTest 对象的副本

//函数执行完毕后调用析构函数撤销形参MyTest 对象

//執行結果:call copy construct , ~MyTest

func2(eobj); //形参为MyTest 对象的引用,无需调用复制构造函数传递实参

eobj = func3(); //调用默认构造函数创建局部MyTest 对象

//函数返回时调用复制构造函数创建作为返回值副本的MyTest 对象

//然后调用析构函数撤销局部MyTest 对象

//然后调用赋值操作符

//执行完赋值操作后,调用析构函数撤销作为返回值副本的MyTest 对象
//執行結果:call construct , call copy construct, ~MyTest, call operator construct, ~MyTest

vector<MyTest> evec(3); //调用默认构造函数,创建一个临时对象值MyTest 对象

//然后3次调用复制构造函数,将临时值MyTest 对象复制到vector容器evec的每个元素

//然后调用析构函数撤销临时值MyTest 对象和三次產生的復制構造對象

//執行結果:call construct , call copy construct, call copy construct, call copy construct,
~MyTest, ~MyTest ~MyTest ~MyTest

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: