返回类型只是决定分一块什么类型的内存来存储该返回值。
返回值不管是不是外部传入还是内部定义,只要不是返回引用,在函数执行到 } 时会拷贝生成一份匿名对象到外部函数栈。
同样的,形参只要不是引用类型,传入参数也会执行一次拷贝,该拷贝从外部函数栈,拷贝到被调用函数栈。
VS编译器会做一些优化,减少拷贝次数。直接将要返回的匿名对象构造在外部函数栈。省去一次构造和析构。
如下:
#include <cstdio>
class Integer
{
public:
Integer(int i): m_i(i)
{
printf("构造函数\n");
}~Integer()
{
printf("析构函数\n");
} Integer(const Integer &rhs)
{
printf("拷贝构造\n");
m_i = rhs.m_i;
}
// 第一个const:返回常对象,禁止对返回值赋值
// 第二个const:支持常对象形式的右操作数
// 第三个const:支持常对象形式的左操作数
const Integer operator+(const Integer &rhs) const
{
return Integer(m_i + rhs.m_i);
} const Integer operator-(const Integer &rhs) const
{
Integer tmp(m_i - rhs.m_i);
return tmp;
} private:
int m_i;
};
int main(void)
{
Integer a(1);
Integer b(2);
printf("--------------\n");
Integer c(b - a);
printf("--------------\n");
Integer d(b + a);
return 0;
}
结果如下:
构造函数
构造函数
--------------
构造函数
拷贝构造
析构函数
--------------
构造函数