我对以下代码有疑问:
假设我有一个P类,它有一个复制构造函数,一个常规构造函数,它接收一个字符串值。
我有以下代码:
P doSomething(){
P p("myValue");
return p;
}
int main(){
P m=doSomething();
return 1;
}
return p
函数的doSomething()
调用复制构造函数?P m=doSomething()
- 是否要调用复制构造函数或运算符=?如果是operator =,则此代码与以下内容有何不同:
P new_val=("newVal");
p m=new_val;
(我知道这里的调用是复制构造函数)
谢谢, 玛丽
答案 0 :(得分:2)
该标准允许删除此副本。谷歌[N] RVO。在某些编译器上,这只在优化时发生,在其他编译器上,它是调用约定的一部分,因此总是发生。
T t = x;
, T(x)
是“语法糖”(在T t(T(x))
隐式发生的意义上),因此 - 尽管=
- 没有做operator=
。请注意,此处也可以省略附加临时,因此不会调用复制ctor。
这段代码毫无意义,你的意思是什么?
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; (我知道这里的调用是复制构造函数)
您是否遗漏了代码段中的内容?我认为它不会编译