【问题标题】:Direct Assignment Operator in C++C++ 中的直接赋值运算符
【发布时间】:2012-06-10 20:58:46
【问题描述】:

我正在使用 C++ 中的运算符重载,特别是赋值运算符“=”。

所以,我可以一次做到这一点:

MyClass var1;
var1 = "string";

但是,当我尝试这样做时,它给了我一个错误:

MyClass var2 = "string";

有人知道为什么吗?我怎样才能使它成为可能?

【问题讨论】:

  • 为什么要投赞成票,以前被问过上千次...
  • @Griwes,这是研究与清晰、简洁的问题之间的某种联系。
  • @chris,这个问题表明 OP 自己没有进行任何研究,并且在询问之前没有使用 Google。这让他不值得支持。

标签: c++ operator-overloading


【解决方案1】:

第二个例子不是调用operator=,而是调用const char []的转换构造函数,或者你在内部使用它的任何东西,只要它可以从中转换(例如std::string),目前还不存在。您可以在 std''OrgnlDave 的答案中看到一个实现。和

几乎一模一样
MyClass var2 ("string");

不过,后者是显式的,而前者是隐式的。要查看差异,请创建一个构造函数并将其标记为explicit。这里的代码可以工作,但你的不行。例如,当您意外传递一个字符串而不是 MyClass 时,这可以避免混淆,并且当它最初甚至不打算成为 MyClass 时,它会被隐式转换。

【讨论】:

  • +1 我相信这是第一个答案(不是评论)我从你那里看到的 ;)
  • 谢谢!我确实认为 会先调用 operator=,然后是构造函数。
  • @IgorBorges,不只是你。其他人很可能会发现这一点,它也会对他们有所帮助。他们可能不知道密码。此外,它确实比另一个答案中的一条解释线(尽管在确定问题和解决方案方面仍然正确)提供了更令人满意的答案。代码是不言而喻的备份。
  • 嗯... 它正在为std::string 调用转换构造函数 我想知道std::string 在整个问题中的位置...
【解决方案2】:

你需要为你的类创建一个构造函数,第二个例子是调用构造函数。

class MyClass {
  public:
    MyClass(const std::string& what) {  } // copy string
};

【讨论】:

  • 这是一个转换构造函数。你应该让它explicit
  • @ChetSimpson 这就是要点。他想要一个转换构造函数。如果我明确表示,他将无法在其上使用 =。
  • 不过,explicit 应该是默认设置,除非您有理由不这样做。我不认为使用MyClass var2 ("string"); 可能会在以后避免混淆。
  • @std''OrgnlDave 这允许隐式转换发生在任何地方,而不仅仅是赋值。这可能不是他正在寻找的行为(我希望不是)。
  • @std''OrgnlDave 更不用说它甚至不适用于右值。常量what?
猜你喜欢
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2021-08-10
  • 2011-03-11
相关资源
最近更新 更多