任何人都可以在下面提到的代码中向我解释赋值运算符。我有
问题 1:为什么赋值运算符返回引用对象 [我知道这用于类似这样的事情 c1 = c2 = c3
,但这是如何工作的]
任务 2:我创建了动态指针 tempName
但我没有释放内存,因此存在内存泄漏。我该如何解决。或者如果你有的话给我举个例子。
任务 3:我已经在名称中分配了 tempName
,所以如果我删除 tempName
,名称将指向 tempName
> 在返回之前,会发生什么。
Contact& operator=( const Contact& rhs ) {
char* tempName = new char[ strlen( rhs. name ) + 1] ;
delete[ ] name;
name = tempName;
strcpy( name, rhs. name ) ;
age = rhs. age;
return *this;
}
最佳答案
Q1.
当您返回一个对象的引用时,您就可以将它放在赋值的左侧以分配另一个值。所以,我认为有两个原因。
(1) 避免不必要的复制。
(2) C++中赋值的默认行为,你可以做到
a = (b = c)
或
(a = b) = c
即使返回值,第一种形式也可以。 但是对于第二个,您必须返回对值的引用才能具有与正常 C++ 赋值相同的行为。†
Q2.
是的,它有内存泄漏。除非,你在析构函数中删除了 name
。
Q3.
name
和 tempName
指向同一个地址。因此,删除 tempName
将删除 name
指向的内容。不要这样做。
此外,使用 C++,为什么不使用 std::string
而不是 C 风格的字符串并让 std::string
管理其内存。
† 当然你可以不遵守 C++ 的方式,对操作符有你自己的行为。但不推荐。
关于c++ - 复制构造函数和重载赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888372/