c++ - 为什么我可以在不重载 "="运算符的情况下将一个对象分配给另一个对象?

标签 c++

我是 C++ 新手,刚刚了解重载运算符。我很困惑,因为似乎我可以将一个对象分配给另一个对象而不必重载“=”运算符。 以此代码为例:

class process
{
  int size;
  
public:
  process(int s)
  {
    size = s;
  }
  ~process();

  int getSize()
  {
    return size;
  }
  
};

int main()
{
  process p1(2);
  process p2(3);
  p1 = p2;
  std::cout << p1.getSize() << "\n";
}

输出是:

3

如您所见,进程类“p2”中的信息已复制到“p1”,但我没有重载“=”运算符。为什么会这样?有什么地方可以让我了解一些关于 C++ 为实现这一目标所做的具体信息吗?谢谢。

最佳答案

Why can I assign one object to another without overloading the “=” operator?

因为类有一个隐式生成的复制(和移动)赋值运算符。

Is there any place where I can have some concrete info about what C++ did for this to happen?

信息的权威来源是标准文档。

Books也有关于 C++ 的文章。


But then why would I want to overload the "=" operator?

没有理由要重载示例类的赋值运算符。

一般来说,你可能想要重载,因为

  • 编译器生成的赋值运算符不能读懂你的想法,也不能做你想让它做的事。它只做一件事,如果那不是你想要的,那么你需要定义你自己的。如果您遵循最佳实践,那么隐式生成的赋值运算符通常会执行您想要的操作。

  • 有时您可能希望能够分配其他类型。

  • 有时会删除隐式生成的运算符,例如当存在不可分配的成员时。在这种情况下,如果您知道运算符(operator)应该做什么,您可以定义自己的。


附言编译器还隐式生成析构函数。您不需要为您的类定义析构函数。

关于c++ - 为什么我可以在不重载 "="运算符的情况下将一个对象分配给另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62669166/

相关文章:

c++ - Boost.Pointer 容器在 C++11/14 中被 std::unique_ptr 淘汰了吗?

c++ - 顶点着色器中的采样后台缓冲区始终返回 0 和 float1 而不是 float4

c++ - 不能将 std::iota 与 std::set 一起使用

c++ - c++中读取函数的一个问题

c++ - boost::asio,为什么我的套接字在调用 async_receive_from 后立即运行回调函数?

c++ - 如何让 CMFCToolBar 识别图像 mask ?

c++ - 如何让 eclipse 运行当前打开的源文件?

c++ - 如何在ROS的cpp文件中找到头文件路径

c++ - 为什么 std::numeric_limits::digits10 对于 int 类型少一个?

c++ - 在低功耗多核微 Controller 中使用全局变量不好吗? (C++)