至于这两种函数的用途,用于引用计数时比较有用吧,完成一些在堆上分配的数据的传递工作。[url]http://xinklabi.iteye.com/blog/653457[/url]
啥也不说了,直接上代码;注释很详细了
啥也不说了,直接上代码;注释很详细了
#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);//类的引用作为参数,进入函数时不会调用拷贝构造函数
}