g++ -fno-elide-constructors tmpObj.cpp -o tp
/*
* tmpObj.cpp
*
* Created on: 2021年6月1日
* Author:
*/
#include <iostream>
using namespace std;
class A {
public:
int m_k;
int m_t;
A() {
cout << "A() construct...." << endl;
m_k = 0;
m_t = 0;
}
A(int k, int t) :m_k(k), m_t(t) {
cout << "param construct...." << endl;
}
~A() {
cout << "destruct...." << endl;
}
A(const A &a) {
cout << "copy construct..." << endl;
}
};
// 如果函数返回值是一个对象,要考虑return语句的效率
A getObj() {
/************** 返回本地对象 ****************/
/* 以下这种写法实际上执行了三步:
1. 构造本地对象a
2. 调用拷贝构造,将本地对象a拷贝到外部存储器
3. 调用析构函数析构本地对象a
*/
/******************************************/
A a(3, 4);
return a;
}
// 如果函数返回值是一个对象,要考虑return语句的效率
A getDirectObj() {
/*********** 直接返回临时对象 *************/
// 编译器直接把临时对象创建并初始化在外部
// 存储单元(主调函数的栈帧上)中,省去了拷
// 贝和析构的花费,提高了效率
/*****************************************/
return A(3, 4);
}
class B{
public:
int val;
public:
B(int val):val(val) {}
};
int main() {
// A a0 = getObj(); // 外部存储单元
// A a = getDirectObj();
// param construct....
// copy construct...
// destruct....
// destruct....
// getObj(); // 外部存储单元
getDirectObj();
// B& b1 = B(3); // 报错
const B& b2= B(3); // 正确
return 0;
}
标签:cout,区别,对象,int,cpp,返回值,tmpObj From: https://www.cnblogs.com/tryst/p/18001604