从百度空间(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
}
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
}
相关文章推荐
- 《转载》IntelliJ 2016.2 IDEA 中进行 Java Web 项目开发配置
- 第十二章-----第十三章 构造函数 复制构造函数 赋值操作符析构函数 static类成员
- 默认构造函数、构造函数、复制构造函数和赋值操作符
- Web_submit_form和Web_submit_data的区别(转载)
- [转载] web.xml之<context-param>与<init-param>的区别与作用
- Web_submit_form和Web_submit_data的区别(转载)
- <转载>项目工程中的WebRoot与WebContent有什么区别?
- C++ - 复制构造器 和 复制-赋值操作符 的 区别
- 三法则,合成赋值操作符,合成复制构造函数
- 转载--c++中构造函数初始化的方法以及主要区别
- 复制控制:复制构造函数 赋值操作符 以及 析构函数(智能
- C++ - 复制构造器 和 复制-赋值操作符 的 区别
- [转载] About Career Promotion and Tutoring from Zhihu Web FAQer (Quoted Entirely Without Personal Idea. Delete Immediately If Pirated)
- 转载:Web服务器和应用服务器的区别
- [转载]IDEA新建web项目
- C++的对象复制构造函数与赋值操作符重载的区别小结
- VS2008生成WebSite和WebApplication的区别(转载)
- 【转载】IntelliJ IDEA WEB项目的部署配置
- 字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符
- httpRequest与httpwebrequest区别 (转载)