c++ - 复制构造函数和重载赋值?

标签 c++ operator-overloading copy-constructor assignment-operator

任何人都可以在下面提到的代码中向我解释赋值运算符。我有

问题 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.

nametempName 指向同一个地址。因此,删除 tempName 将删除 name 指向的内容。不要这样做。

此外,使用 C++,为什么不使用 std::string 而不是 C 风格的字符串并让 std::string 管理其内存。


当然你可以不遵守 C++ 的方式,对操作符有你自己的行为。但不推荐。

关于c++ - 复制构造函数和重载赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888372/

相关文章:

c++ - 了解复制构造函数调用和命名返回值优化

php - 在网络服务器中运行的后台服务如何通知客户端浏览器服务的进度?

java - 在构造函数中使用重写方法的替代方法,Java

c++ - 将多行附加到 openCV 矩阵

c++ - 复合取消引用和赋值的运算符重载

c++ - 在类中使用带有重载算术运算符的ostream

c++ - 基于 C++ 表单的应用程序中的 ActiveX 控件

c++ - 如何在重用 std::stringstream 变量时避免使用 std::stringstream.str() 和 std::stringstream.clear() ?

ios - 如何重写 iOS 纯 swift 拷贝构造函数

c++ - 删除复制构造函数和 operator= 类作用域访问