复制构造函数和operator = in c ++

时间:2011-09-21 09:08:18

标签: c++ operator-keyword copy-constructor

我对以下代码有疑问:

假设我有一个P类,它有一个复制构造函数,一个常规构造函数,它接收一个字符串值。

我有以下代码:

P doSomething(){
   P p("myValue");
   return p;
}

int main(){
    P m=doSomething();
    return 1;
}
  1. 为什么不在return p函数的doSomething()调用复制构造函数?
  2. 调用P m=doSomething() - 是否要调用复制构造函数或运算符=?
  3. 如果是operator =,则此代码与以下内容有何不同:

    P new_val=("newVal");
    p m=new_val;
    
  4. (我知道这里的调用是复制构造函数)

    谢谢, 玛丽

3 个答案:

答案 0 :(得分:2)

  • 为什么不在doSomething()函数的返回页面调用复制构造函数?

该标准允许删除此副本。谷歌[N] RVO。在某些编译器上,这只在优化时发生,在其他编译器上,它是调用约定的一部分,因此总是发生。

  • 调用P m = doSomething() - 是否要调用复制构造函数或运算符=?
对于T t = x;

T(x)是“语法糖”(在T t(T(x))隐式发生的意义上),因此 - 尽管= - 没有做operator=。请注意,此处也可以省略附加临时,因此不会调用复制ctor。

  • 如果是operator =,则此代码与以下内容有何不同:

这段代码毫无意义,你的意思是什么?

P new=("newVal");
p m=new;

答案 1 :(得分:0)

我做了一个小样本进行演示。

void print(char* text, int ident)
{
    for(int i = 0 ; i < ident ; i++)
    {
        printf("   ");
    } // end for

    fprintf(stdout, text);
    fprintf(stdout, "\n");
    fflush(stdout);
}

class P
{
public:
    char* _str;

    P (P& arg)
    {
        print("copy constructor", 2);
        arg._str = this->_str;
    }

    P (char* str)
    {
        print("constructor", 2);
        _str = str;
    }
};

P doSomething(){
    print("do something - function", 1);
    P p("myValue");
    print("before return p", 1);
    return p;
}

int main(int argc, char* argv[])
{
    print("start", 0);
    P m=doSomething();
    print("stop - call return", 0);
    return 1;
}

返回

start
   do something - function
      constructor
   before return p
      copy constructor
stop - call return

因此复制构造函数将被调用

答案 2 :(得分:-2)

  

1)为什么在doSomething()函数的“return p”中没有调用复制构造函数?

它应该 - 尝试在复制程序中向控制台打印一些东西,看它是否真的在运行。

  

2)调用P m = doSomething() - 是否要调用复制构造函数或运算符=?

应该调用operator =。再次,使用方法中的调试消息打印来检查

  

3)如果是operator =,这段代码与以下内容的区别是什么:   P new =(“newVal”); p m = new; (我知道这里的调用是复制构造函数)

您是否遗漏了代码段中的内容?我认为它不会编译