#include <iostream> #include <tr1/memory> using namespace std; class base { public: base(int id): id(id){cout << "base() " << id << endl;} base(const base& b): id(b.id){cout << "base(const base& b) " << id << endl;} ~base(){cout << "~base()" << endl;} base operator+(const base& b) { base tmp(0); tmp.id = id + b.id; return tmp; } void display(){cout << id << endl;} private: int id; }; int main() { base b1 = 1; base b2 = b1 + 2; b1.display(); b2.display(); return 0; }
这段代码的输出为
base() 1 base() 2 base() 0 ~base() 1 3 ~base() ~base()
gcc 4.8.4
问一下 b2 是怎么样初始化的啊?还有就是加号重载函数的返回是值传递,没有调用拷贝构造函数吗?
ps 假如把重载函数改成
base& operator+(const base& b) { base tmp(0); tmp.id = id + b.id; return tmp; }
输出是:
base() 1 base() 2 base() 0 ~base() base(const base& b) 3 ~base() 1 3 ~base() ~base()
解决方案
20
编译的时候用了std=c++11么
40
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
ROV:http://www.programlife.net/cpp-return-value-optimization.html
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
ROV:http://www.programlife.net/cpp-return-value-optimization.html