关于函数的返回值与返回类型

返回类型只是决定分一块什么类型的内存来存储该返回值。

返回值不管是不是外部传入还是内部定义,只要不是返回引用,在函数执行到 } 时会拷贝生成一份匿名对象到外部函数栈。

同样的,形参只要不是引用类型,传入参数也会执行一次拷贝,该拷贝从外部函数栈,拷贝到被调用函数栈。

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;
}

结果如下:

构造函数
构造函数
--------------
构造函数
拷贝构造
析构函数
--------------
构造函数

猜你喜欢

转载自blog.csdn.net/u013566722/article/details/79742032