考虑下面的简单程序。它只是从MyStruct
中定义了两个变量A
和B
,然后初始化A
。
如何用B
的新指针复制A
到B
?
如果我使用赋值运算符,B
的firstMember
将被A
的firstMember
赋值,每当我改变B.firstMember[i]
的值时,A.firstMember[i]
的值也会改变。我已经知道它可以用一个函数来完成,但是有没有更简单的方法?假设MyStruct
可以有很多指针,写一个函数似乎不太好。
typedef struct MyStruct
{
int * firstMember;
int secondMember;
} MyStruct;
int main()
{
MyStruct A;
MyStruct B;
Initialize(A); // initializes A such that A.firstMember[0] != 5
B = A;
B.firstMember[0] = 5;
cout<<A.firstMember[0]; // prints 5
return 0;
}
这符合" 3原则"。一旦开始管理类中的原始指针,出于这个原因,您可能希望定义自定义构造函数、析构函数和赋值操作符。
首先,我不明白为什么两个成员中,一个是指针,而另一个不是。我假设第一个成员是一个指针,指向一个整数。下面是该结构的改进代码片段:
struct MyStruct
{
int * firstMember;
int secondMember;
MyStruct& operator = (const MyStruct& src) {
*firstMember = *src.firstMember;
return *this;
}
MyStruct(int a = 0) {
firstMember = new int(a);
secondMember = a;
}
MyStruct(const MyStruct& src) {
// deep copy
firstMember = new int(*src.firstMember);
secondMember = src.secondMember;
}
~MyStruct() {
if (firstMember)
delete firstMember;
}
};
注意,struct是一个所有成员默认声明为public的类。与其用C方式初始化,不如使用c++的构造函数,你还需要复制构造函数和赋值操作符。