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