请教一个C++问题 (300分)

教父

Unregistered / Unconfirmed
GUEST, unregistred user!
#include <iostream>
using namespace std;
class test
{
public:
test(){cout<<"test"<<endl;}
~test(){cout<<"~test"<<endl;}
};
class test1 : public test
{
public:
test1(){cout<<"test1"<<endl;}
~test1(){cout<<"~test1"<<endl;}
};
void main(void)
{
test1 ttt;
test tt = ttt;
}
很简单的一段代码,但是输出结果却出乎我的意料。
当初朋友问我这段代码时,我认为结果应该是
test
test1
test
~test
~test1
~test
但是实际上运行的结果却是
test
test1
~test
~test1
~test
也就是说 test tt = ttt;
这一句并没有调用test的构造函数,但是在这种赋值的过程应该是
先调用构造函数构造出一个对象后,再调用赋值函数进行赋值的,这也是C++推荐采用拷贝
构造函数的原因。
经过试验发现,如果test tt = ttt;
改为 test tt;
tt = ttt;
就会调用构造函数,我想
会不会是编译器优化的结果?
以上代码在VC6和BC3.1下编译运行的结果相同,在我的BCB6里头居然没有通过,呵呵,不
知道怎么回事。
还请各位高手多多指点,谢了!
 
在VC中有没有办法看到这段代码的汇编代码?
 
>>汇编代码
设置断点..F5..Alt+8
Debuging...
 
tt没有使用test()和test1()构造函数,而使用了默认的拷贝构造函数,默认的就是二进制对
属性赋值。
 
试试用operator重载拷贝构造函数看看.
另外,我一直奇怪为什么C++不支持构造函数为虚函数.
 
听听!
好像有了这个:
讨论区:其它语言 待答问题数 已答问题数 版主 版主
C++ Builder 4 李衍智
Visual C++ 2
C# 3
ASP.NET 1
 
看来至少在VC的编译器中,如果不显式的写 CMyClass AObject;
编译器是不会调用它的构造函数的。
——相比之下,还是指针方便。
 
test tt = ttt时并不是没有调用构造函数,只不过调用的是缺省的copy constructor.
 
以前一直以为只有用 Test tt(ttt);这样的赋值方式才是调用拷贝构造函数,而
test tt = ttt;
则是先用构造函数创建一个对象,再调用赋值函数来赋值,昨晚
仔细查了书和资料才发现错了。
在《C++编程思想》中有一段:当从一个对象产生一个新对象时就会拷贝构造函数。
在林锐博士的《高质量C++编程指南》中说:
拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被
创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三个语句和
第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋值函数吗?
String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成 c(a);
c = b;
// 调用了赋值函数
本例中第三个语句的风格较差,宜改写成String c(a) 以区别于第四个语句。
所以,这个问题还是我学艺不精,呵呵,惭愧惭愧!
 
多人接受答案了。
 
来玩了,不过又上了一课。
 
顶部