【问题标题】:Memberwise Copier会员复印机
【发布时间】:2013-02-25 04:16:43
【问题描述】:

我对这段代码有疑问...为什么它一直访问会员复制器

这是代码,这是一个名为string的类的成员函数。

string operator +(string &r) {
    char *k = NULL;
    k = new char[strlen(this->getstring()) + strlen(r.getstring()) + 1];

    strcpy(k, this->getstring());
    strcat(k, r.getstring());
    string Z = k;

    delete[] k;
    return Z; // visits MemberWise Copier then destructs.. 
}

这是我的会员复印机..

string(string &p) : s(NULL)
{
    setstring(p.getstring());
}

【问题讨论】:

  • 由于您从该函数按值返回一个字符串,它需要调用复制构造函数来返回该副本。将 operator+ 更改为返回 string& 应该可以解决此问题。
  • @medgno 那将是一个错误,您不能返回对局部变量的引用。这里需要按值返回。

标签: c++ operator-overloading return


【解决方案1】:

此代码调用 string 类的复制构造函数,因为字符串 Z 正在按值返回。在这种情况下,总会发生成员副本。

【讨论】:

    【解决方案2】:

    您按值返回:根据定义,这显然调用了复制构造函数(不是“成员复制器”,因为在 C++ 用语中不存在这样的东西)。

    所以一切都是它应该的样子。

    如果您担心复制字符串的开销,请不要担心:所有现代编译器都会在可能的情况下优化此副本,以便按值返回安全高效(不是您有选择:这里的语义要求按值返回)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多