【发布时间】:2015-06-04 17:54:47
【问题描述】:
我试图理解Copy constructor 和Operator。我读了一些代码,但我没有得到它。
这里是主要功能
int main()
{
Cwin win1('A',"window")
Cwin win2;
win1 = win2;
win1.set_data('B',"hello");
win1.show();
win2.show();
}
我从Class Cwin
中提取了最重要的代码Class Cwin
{
private:
char id, *title ;
public:
Cwin(char i, char *text){......} //constructor
Cwin(){......} //default constructor, id ='D' , *title = "default"
Cwin(const Cwin &win)
{
id = win.id;
strcpy(title,win.title);
}
......
};
输出:
B : hello
B : hello
我能理解是什么原因造成的。但我无法理解下面的解决方案。
Class Cwin
{
private:
char id, *title ;
public:
Cwin(char i, char *text){......} //constructor
Cwin(){......} //default constructor, id ='D' , *title = "default"
Cwin(const Cwin &win)
{
id = win.id;
strcpy(title,win.title);
}
void operator=(const Cwin &win)
{
id = win.id;
strcpy (this->title , win.title);
}
......
};
输出:
B : hello
D : default
为什么把 strcpy (title , win.title); 改成 strcpy (this->title , win.title); 会有很大的不同?
【问题讨论】:
-
从
strcpy (title , win.title)更改为strcpy (this->title , win.title)没有任何区别,除非有一个名为title的变量是函数的本地变量。 stackoverflow.com/help/mcve -
它写了一个操作符来重载
=,会不会导致这个结果? -
@CodaChang 我不明白你在问什么,你定义了一个赋值运算符,但它的行为不是你想要的?相反,您期望什么行为?您的复制构造函数似乎正在复制到未初始化的指针 (
title),这是未定义的行为。请编辑问题以准确指出问题所在,并如 Benjamin 所说,添加一个 MCVE。 -
是的,可能。因为没有它,默认赋值运算符只是复制指针,这意味着您的对象将指向相同的数据,并且更改一个指向的字符串的内容也会更改另一个。我感觉你的代码有更严重的问题。但是,由于您对它进行了如此严格的缩写,因此我无法说出您的真实代码实际上是什么,以及您真正在做什么只是简写。这就是为什么我要求MCVE
-
感谢您的建议,我已经理解这个问题。我会更新我的问题。
标签: c++ class pointers operators copy-constructor