// proj1.cpp
#include <iostream>
using namespace std;
class MyClass {
char * p;
public:
MyClass(char c) { p = new char; *p = c; }
// 为什么下面这段代码copy前必须加上 &,删除就编译有误呢
MyClass(const MyClass ©) { p = new char; *p = *(copy.p); }
~MyClass() {delete p; }
MyClass& operator=(const MyClass & rhs)
{
if ( this == &rhs ) return *this;
*p = *(rhs.p);
return *this;
}
char GetChar() const { return *p; }
};
int main()
{
MyClass obj1('C'), obj2('P');
MyClass obj3(obj1);
obj3 = obj2;
cout << "The extension is: "
<< obj1.GetChar() << obj2.GetChar()
<< obj3.GetChar() << endl;
return 0;
}
參考答案:#include <iostream>
using namespace std;
class MyClass
{
char *p; //定义一个字符型指针变量
public:
MyClass(char c) //构造函数
{
p = new char;
*p = c;
}
// 为什么下面这段代码copy前必须加上 &,删除就编译有误呢
MyClass(const MyClass & copy)//复制构造函数
{
p = new char;//
*p = *(copy.p);//将对象属性地址赋值给指针p
}
~MyClass()//析构函数
{
delete p;
}
MyClass& operator=(const MyClass &rhs) //对运算符=重载
{
if ( this == &rhs ) return *this;
*p = *(rhs.p);
return *this;
}
char GetChar() const { return *p; } //常成员函数GetChar
};
int main()
{
MyClass obj1('C'), obj2('P'); //用构造函数建立两个对象obj1属性是C,obj2属性是P
MyClass obj3(obj1); //用复制构造函数建立对象obj3,调用copy方法
obj3 = obj2; //将obj2的内容赋值给obj3/调用重载函数
cout << "The extension is: "
<< obj1.GetChar() << obj2.GetChar() //分别用各对象的GetChar成员函数输出自己的属性
<< obj3.GetChar() << endl;
return 0;
}
注意:复制构造函数原型是:X::X(X&)
所以,你把& 去了当然不行了!
为加强对复制构造函数的理解,请看下面代码:
//复制构造函数的使用情况
#include<iostream.h>
class a
{
int aa;
int bb;
public :
a(int x,int y)
{
aa=x;
bb=y;
}
void show ()
{
cout<<"aa="<<aa<<"bb="<<bb<<endl;
}
a(const a &x)
{
cout<<"复制构造函数在调用"<<endl;
aa=x.aa;
bb=x.bb ;
}
a testf(a temp)//自定义的函数,当返回一个对象的时候,返回类型应该是该对象所属的类。
{
cout<<"这是在测试函数中"<<endl;
return temp;
}
};
void main()
{
a *a1;
a1=new a(1,2);
a a2(*a1);
a2.show();
a a3(0,0);
a3.testf(a2);
a3.show();
}
-------------------------
晕,今天发现了个百度的问题,应该过滤一下& copy吧????