知道了拷贝构造函数的基本用法之后,还需明白不同的类,所需的拷贝构造函数写法不同。
根据类中是否有带指针的数据成员,来判断写哪种拷贝构造函数。
1.不带指针—浅拷贝。
#include <iostream>
using namespace std;
class complexs
{
private:
double Real;
double Image;
public:
complexs(double a,double b): Real(a),Image(b){}
complexs(const complex& com):Real(com.Real),Image(com.Image){}//初始化列表
inline double getReal()const{return Real;}//内联函数,const加在()后,表明不能通过该函数的this指针修改内容。
inline double getImage()const{return Image;}
};
int main()
{
complexs c(3,4);
complexs b = c;
cout << "Real: " << b.getReal() << " Image: " << b.getImage() << endl;
return 0;
}
以上是不带指针的简单示例。
2.带指针 —深拷贝
#include <iostream>
#include <cstring>
using namespace std;
class strings
{
private:
char* str;
public:
strings(char* s):str(s){}
strings(const string& s);
strings& operator=(const strings& s);
inline char* getchar()cosnt{ return str;}
};
strings::strings(const strings& s)
{
str = new char [strlen(s.str)+1];
strcpy(str,s.str);
}
strings& strings::operator=(const strings& s)
{
if(this == &s) return *this;//判断是否为同一个对象
delete [] str; // 先删除之前的内存
str = new char [strlen(s.str) + 1];//重新分配内存
strcpy(str,s.str);
retrun *this;
}
int main()
{
strings s("Hello world!");
strings a = s;
cout << a.getchar()<< endl;
strings b("every thing goes well ");
a = b;
cout << a.getchar() << endl;
return 0;
}
深拷贝不能像浅拷贝那样直接赋值,如果那样做,两个对象的str指针指向同一处,如果其中一个对象删除了,那么另外一个指针还指向那个已经被释放的内存,如果操作,将会有不可预知的后果。