C++对无名对象申明问题
学习C++转换运算符函数重载时碰到一个问题,就是网上一搜一堆的管宁的转换运算符函数重载代码
- C/C++ code
#include <iostream> using namespace std; class Test { public: Test(int a = 0) { cout<<this<<":"<<"载入构造函数!"<<a<<endl; Test::a = a; } Test(Test &temp) { cout<<"载入拷贝构造函数!"<<endl; Test::a = temp.a; } ~Test() { cout<<this<<":"<<"载入析构函数!"<<this->a<<endl; cin.get(); } operator int()//转换运算符,去掉则不会调用 { cout<<this<<":"<<"载入转换运算符函数的内存地址:"<<this->a<<endl; return Test::a; } public: int a; }; int main() { Test b=Test(99);//注意这里 cout<<"b的内存地址"<<&b<<endl; cout<<b.a<<endl; system("pause"); }
这段代码我在调试过程中并没发现如作者所说的临时对象,如下图所示:
是因为C++类库进行调整造成的吗?
初学C++一月多,很多问题不懂!
[解决办法]
我觉得是在=的时候调用的copy constructor,产生临时对象
抄错了吧,怎么有两个public:
[解决办法]
编译器优化掉了。
[解决办法]
Test(int a = 0)和operator int()的调用形式是一样的,存在二义性.explicit Test(int a = 0)这样就不会调用 operator int()了,不过仍然不会产生临时对象。在这里也确实没有产生临时对象的必要性,VC把子Test b=Test(99)当成Test b(99)处理了。
[解决办法]
帮顶。