`

C++ 拷贝构造函数、赋值运算符=的调用时机

    博客分类:
  • C++
 
阅读更多
至于这两种函数的用途,用于引用计数时比较有用吧,完成一些在堆上分配的数据的传递工作。http://xinklabi.iteye.com/blog/653457


啥也不说了,直接上代码;注释很详细了

#include <iostream>
using namespace std;

class Class{

public:
	Class(){
	}
	//如果用 explicit Class(const Class& c){ 来声明,则不能用Class c1=c;而只可以Class c2(c);
	 Class(const Class& c){
		cout<<"copy construnctor called\n";
	}


	//=的调用者本身就是个Class类!该函数只是为了自行完成一些数据传递的任务,最后返回该调用者的引用即可
	Class& operator=(const Class& c){
		cout<<"= operator called\n";
		return *this;
	}

	//函数返回时调用拷贝构造函数
	static Class getClass(){
		cout<<"begin getClass\n";

		Class c;
		cout<<"end of getClass,soon to return\n";
		return c;

	}

};

//类作为参数,进入函数时会调用拷贝构造函数
void classAsParam(Class c){
	cout<<"begin classAsParam\n";
}

//类的引用作为参数,进入函数时不会调用拷贝构造函数
void classReferenceAsParam(Class& c){
	cout<<"begin classReferenceAsParam\n";
}


void main(){
	Class c;

	Class c1=c;//因为是初始化,调用的是拷贝构造函数,而非=运算符
	Class c2(c);//同上

	cout<<"\n////////////  Test getClass without return value\n";
	Class::getClass();//函数返回时调用拷贝构造函数

	cout<<"\n////////////  Test getClass with new left value\n";
	Class c3=Class::getClass();//函数返回时调用拷贝构造函数;由于c3在此声明,因而再调用拷贝构造函数(貌似被编译器省略了)

	cout<<"\n////////////  Test getClass with exist left value\n";
	c2=Class::getClass();//函数返回时调用拷贝构造函数;由于c2已经声明过,因而再调用=运算符将临时变量赋值给c2

	cout<<"\n////////////  Test classAsParam\n";
	classAsParam(c);//类作为参数,进入函数时会调用拷贝构造函数

	cout<<"\n////////////  Test classReferenceAsParam\n";
	classReferenceAsParam(c);//类的引用作为参数,进入函数时不会调用拷贝构造函数
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics