C++ 复制构造函数与函数返回对象

C++ 复制构造函数与函数返回对象

函数返回内部局部对象,例如:

A fun1()
{
    A a(20); // 调用自定义构造函数,构造a对象
    return a;
}

函数调用时,自动调用复制构造函数,赋值给左端对象.例如:

// 调用复制构造函数,把fun1()的返回值拷贝给a1. 本语句结束,调用析构函数,销毁函数返回对象
A a1 = fun1();  

附完整示例代码

#include "stdafx.h"
#include <iostream>
#include <cstdlib>

using namespace std;
class A
{
public:
    A() :n(0)  // 默认构造函数
    {
        cout << "默认构造函数:" << n << endl;
    }
    A(int n) :n(n) // 自定义构造函数
    {
        cout << "自定义构造函数:" << n << endl;
    }
    A(const A& a) :n(a.n) // 复制构造函数
    {
        cout << "复制构造函数:" << n << endl;
    }
    const A& operator=(const A& r) // 重载操作符=
    {
        n = r.n;
        return(*this);
    }
    ~A()
    {
        cout << "析构函数:" << n << endl;
    }
    int n;
};

A fun1()
{
    A a(20); // 调用自定义构造函数,构造a对象
    return a;
}

// 【非法】虽然程序能执行,但是返回一个局部变量的地址是不可取的
A& fun2()
{
    A a(30);   // 调用自定义构造函数,构造a对象
    return a;  // warning C4172 : 返回局部变量或临时变量的地址: a
}

void fun3()
{
    // 调用复制构造函数,把fun1()的返回值拷贝给a1. 本语句结束,调用析构函数,销毁函数返回对象(n=20)
    A a1 = fun1();  
    cout << a1.n << endl;
    a1.n = 30;

    A aa; // 调用默认构造函数,构造aa对象
    aa = a1; // 调用操作符=重载
    aa.n = 40;

    // error C2440: “初始化”: 无法从“A”转换为“A &”
    // note: 非常量引用只能绑定到左值
    //A& a2 = fun1(); 
    //cout << a2.n << endl;

    // 以下调用不推荐
    // A a3 = fun2();
    // cout << a3.n << endl;
}

int main()
{
    fun3(); // 本语句结束,调用析构函数,销毁fun3()中的a1对象(n=30)
    system("pause");
    return 0;
}

程序执行结果
自定义构造函数:20 fun1()中构造局部对象a
复制构造函数:20 fun1()返回对象复制给a1
析构函数:20 销毁函数返回对象
20
默认构造函数:0 构造aa对象
析构函数:40 销毁aa对象
析构函数:30 销毁a1对象

猜你喜欢

转载自blog.csdn.net/weixin_42993054/article/details/82079420