C++ 拷贝构造函数的一个疑问

G++版本

lee-Macbook-Air:51cpp-exception lee$ g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

源代码

/*
 * C++ 异常展示
 * 2016年12月20日16:16:57
*/

#include <iostream>
using namespace std;

class Test
{
public:
    Test() : n_(0)
    {
        cout << "The Test construct!" << endl;
    }
    Test(const Test& other)
    {
        this->n_ = other.n_;
        cout << "The Test Copy Construct" << endl;
    }
    ~Test()
    {
        cout << "~Test" << endl;
    }

    void Display()
    {
        cout << "The Test" << endl;
    }

private:
    int n_;
};

Test func()
{
    Test t; // 调用构造函数
    return t; // 应该调用拷贝构造函数,但是没有调用,然后调用析构函数
    // 如果返回引用的话,那就直接返回了一个在栈空间创建的局部变量,此时会有警告

    // return Test();
}

int main()
{
    func();
    cout << "The main end" << endl;
    return 0;
}

/*
 * output:
The Test construct!
~Test
The main end
*/

在func函数,返回的时候,没有调用拷贝构造函数,我表示很困惑

拷贝构造函数,使用引用减少一次拷贝构造

#include <iostream>
using namespace std;

class Test
{
public:
    Test()
    {
        cout << "Test() Construction" << endl;
    }

    Test(const Test& other)
    {
        this->n_ = other.n_;
        cout << "Test() Copy Construction" << endl;
    }

    ~Test()
    {
        cout << "~Test() Desconstruction" << endl;
    }

    void Display() const
    {
        cout << "The Test() Display" << endl;
    }

private:
    int n_;
};

//void Say(const Test t) // 调用拷贝构造函数
void Say(const Test& t) // 使用引用即使用同一空间,不会调用拷贝构造函数
{
    t.Display();
}

int main()
{
    Test t; // 调用构造函数
    Say(t);
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部