共两个问题
第一个问题相关的代码:
Person returnP2 ()//问题2相关
{
Person p2(10);//期望出现默认构造与析构
return p2;
}
int main()
{
Person p2 = returnP2();//希望出现拷贝构造
cout << p2.age << endl;
cout << p2.age << endl;
cout << p2.age << endl; // 输出三次值成功,证明p2接收返回局部对象成功
此时输出为:
有参构造:
10
10
10
析构函数
问题1:这里是否是因为返回值优化,导致希望出现的拷贝构造这几个字眼没有出现
第二个问题相关的代码:(大致与上面相似,只是return后加了括号)
Person returnP2 ()
{
Person p2(10);//期望出现默认构造与析构
return (p2);
}
int main()
{
Person p2 = returnP2();//希望出现拷贝构造
cout << p2.age << endl;
cout << p2.age << endl;
cout << p2.age << endl; // 输出三次值成功,证明p2接收返回局部对象成功
此时输出为:
有参构造:
拷贝构造:
析构函数
10
10
10
析构函数
问题2:return后面加括号有什么特殊意义吗,为什么这里成功调用了拷贝构造函数,没有被返回值优化
类中的成员如下:
class Person
{
public:
int age = 0;
Person()
{
cout << "默认构造" << endl;
}
Person(int val)
{
age = val;
cout << "有参构造: " << endl;
}
Person(const Person & p)
{
age = p.age;
cout << "拷贝构造: " << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
};
软件为vsc,编译器gcc,标准为c++14
第一次在csdn问问题,如果格式上有问题望各位指出
gcc 不了解,说一下visual studio下的情况
首先括号代表表达式,如果表达式内容可以作为左值,返回的是表达式结果的引用,如果不能作为左值返回的是临时常量。
可以试一试 int a = 2; (a) = 3; a的结果是 3;
返回值优化的意思是return的内容直接和接收函数的变量对接,不经历中间的临时常量。比如 int fun(){int a = 1;return a;} int b = fun(); 如果没有返回值优化,fun()返回的内容是 临时常量(不妨叫c),在返回的过程中执行了 int c = a; b= c; 如果有返回值优化 则直接执行 b= a;