C++ 1.下面student & student::operator=(student &s)...............①这个函数是什么意思?作用是什么?
2.为什么s3=s2;...............②这里就调用了①的这个函数//【例7.4】类含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,自定义//...
2.为什么 s3=s2;...............②这里就调用了①的这个函数
//【例7.4】类含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,自定义
//拷贝构造函数(Copy Structor)和拷贝赋值操作符(Copy Assignment Operator)实现深拷贝。
#include <iostream>
#include <cstring>
using namespace std;
class student{
char *pName; //为了演示深拷贝,不用string类
public:
student();
student(char *pname);
student(student &s);
~student();
student & operator=(student &s);
};
student::student(){
cout<<"Constructor";
pName=NULL;
cout<<"缺省"<<endl;
}
student::student(char *pname)
{
cout<<"Constructor";
if(pName=new char[strlen(pname)+1]) strcpy(pName,pname);
//加一不可少,否则串结束符冲了其他信息,析构会出错!
cout<<pName<<endl;
}
student::student(student &s){ //copy function
cout<<"Copy Constructor";
if(s.pName){
if(pName=new char[strlen(s.pName)+1]) strcpy(pName,s.pName);
cout<<pName<<endl;
}
else pName=NULL;
}
student::~student(){ //因有动态生成的类成员,析构函数不可用缺省的析构函数
cout<<"Destructor";
if(pName) cout<<pName<<endl;
delete pName;
}
student & student::operator=(student &s).................................①
{
cout<<"Copy Assign operator";
delete[] pName;
if(s.pName){
if(pName=new char[strlen(s.pName)+1]) strcpy(pName,s.pName);
cout<<pName<<endl;
}
else pName=NULL;
return *this;
}
int main(void){
student s1("范英明"),s2("沈俊"),s3;
student s4=s1;
s3=s2;...............................②
return 0;
} 展开
//【例7.4】类含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,自定义
//拷贝构造函数(Copy Structor)和拷贝赋值操作符(Copy Assignment Operator)实现深拷贝。
#include <iostream>
#include <cstring>
using namespace std;
class student{
char *pName; //为了演示深拷贝,不用string类
public:
student();
student(char *pname);
student(student &s);
~student();
student & operator=(student &s);
};
student::student(){
cout<<"Constructor";
pName=NULL;
cout<<"缺省"<<endl;
}
student::student(char *pname)
{
cout<<"Constructor";
if(pName=new char[strlen(pname)+1]) strcpy(pName,pname);
//加一不可少,否则串结束符冲了其他信息,析构会出错!
cout<<pName<<endl;
}
student::student(student &s){ //copy function
cout<<"Copy Constructor";
if(s.pName){
if(pName=new char[strlen(s.pName)+1]) strcpy(pName,s.pName);
cout<<pName<<endl;
}
else pName=NULL;
}
student::~student(){ //因有动态生成的类成员,析构函数不可用缺省的析构函数
cout<<"Destructor";
if(pName) cout<<pName<<endl;
delete pName;
}
student & student::operator=(student &s).................................①
{
cout<<"Copy Assign operator";
delete[] pName;
if(s.pName){
if(pName=new char[strlen(s.pName)+1]) strcpy(pName,s.pName);
cout<<pName<<endl;
}
else pName=NULL;
return *this;
}
int main(void){
student s1("范英明"),s2("沈俊"),s3;
student s4=s1;
s3=s2;...............................②
return 0;
} 展开
1个回答
展开全部
追问
这个函数的作用和前面的student::student(student &s)都是复制构造函数的意思吧?为什么student s4=s1;调用了student::student(student &s),而s3=s2;调用了运算符重载的那个,
还有student & student::operator=(student &s)..前面的那个&是什么意思?为什么要有这个取地址?
追答
&那是引用的意思,使用的参数&s表示参数是引用类型,而student前面的&表示这个运算符重载的函数的返回值是一个引用
至于调用哪一个,可以这么说:定义一个新的对象(不论是堆对象还是栈对象),肯定是调用构造函数,而赋值的过程才是调用运算符重载的那个函数
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |