求一道C++迷惑题目的解答
//请问以下的代码输出的c1,c2,c3的结果,// 恳请给点解释,非常感谢。
//我尝试过编译运行,在编译器通过,在“建立”的时候报错。
#include <iostream>
using namespace std;
int c1=0, c2=0, c3=0;
class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};
const A foo(const A c)
{
A ab= A(c);
return ab;
}
int main()
{
A a;
A d = foo(a);
cout<<c1<<""<<c2<<""<<c3<<endl;
return 0;
} //哪位大虾帮忙看看这个调用的时候,里面的过程是怎么样的?
//请给点解释,谢谢
#include <iostream>
using namespace std;
class A{
public:
A(){f();}
virtual void f(){printf("A");}
};
class B: public A{
public:
B(){f();}
virtual void f(){printf("B");}
};
int main()
{
B myB;
A *myBP;
B *myBP2;
myBP=new B();
myBP2=new B();
delete myBP;
delete myBP2;
return 0;
} 能力有限,第一题还没想通 你可以在A d = foo(a);处设置个断点 单步调试看下程序的执行过程.
第二题过程如下
因为B由A派生而来,在生成B的实例的时候会先调用父辈的构造函数,
由于f()为虚函数,所以A,B构造函数中对f()的调用均为自己的f()函数,
那么 B myB 会先调用 A的构造函数 打印 A 然后调用自己的构造函数 打印 B
后面两个new B()过程也是如此. class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};
现在C++支持一个类里两个构造函数了?EMB_06 原帖由 极品黑公子 于 2009-12-23 12:02 发表 http://www.eimhe.com/bbs/images/common/back.gif
class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};
现在C++支持一个类里两个构造函数了?EMB_06
构造函数可以重载啊 EMB_10 第二题有人回答了...
我答第一题好了..
首先..这个程序我直接复制到vs2005里面..是可以运行的..连接的话你看看项目设置有没有问题吧..
输出是1 3 2
首先1,就是这个程序在 A a;的时候,调用了一次class A的无参构造函数.
然后3,是复制构造函数.
由于const A foo(const A c)函数的参数不是引用,所以A d = foo(a);时需要值复制,一次
A ab= A(c);两次
由于const A foo(const A c)的返回值也不是引用,所以 return ab;需要复制值,三次
最后是2,析构函数调用次数
const A foo(const A c)
{
A ab= A(c);
return ab;
}
参数const A c和局部变量A ab都需要在这个函数执行完毕时析构,故两次..
受教了。
谢谢共享资料....
页:
[1]