C++中继承、传参、函数返回问题
class AA{
CC c;
public:
AA(){std::cout<<"cos AA"<<std::endl;};
virtual ~AA(){std::cout<<"de AA"<<std::endl;};
virtual void out(int i = 0){std::cout<<"AA i = " <<i<<std::endl;};
};
class BB:public AA{
DD d;
int a;
public:
BB():a(10000){std::cout<<"cos BB"<<std::endl;};
// BB(const BB& b):a(10000){std::cout<<"cos copy BB"<<std::endl;};
virtual ~BB(){std::cout<<"de BB"<<std::endl;};
int getA(){return a;};
void setA(int a){this->a = a;};
virtual void out(int i = 10){std::cout<<"BB i = " <<i<<std::endl;};
};
#include <iostream>
#include "B.h"
#include "A.h"
#include "BB.h"
#include "AA.h"
BB& test() {
BB b;
return b;
}
int main(int argc, const char * argv[]){
BB b1 = test();
b1.out();
return 0;
}
不定义BB拷贝构造函数时为什么输出结构为这个
cos CC
cos AA
cos DD
cos BB
de BB
de DD
de AA
de CC
BB i = 10//没有基类AA的构造方法?
de BB
de DD
de AA
de CC
定义了BB拷贝构造函数时正常调用AA的构造方法
cos CC
cos AA
cos DD
cos BB
de BB
de DD
de AA
de CC
cos CC
cos AA
cos DD
cos copy BB
BB i = 10
de BB
de DD
de AA
de CC
这两个类的定义为什么会有这么大的差别呢?
在调用test的时候是不是b已经释放了呢,这样调用是不是会出现风险?
###########################################华丽的分割###############################################
如果改成这样,为什么不像书上说的“当将类型的对象传递给函数或从函数返回改类型的对象时,将隐式的适用复制构造函数”。C++ Primer P406第二段,最后一句话。
BB test() {
BB b;
return b;
}
void test2(BB b){
}
int main(int argc, const char * argv[]){
// BB b1 = test();//为什么没有隐式调用BB的copy consructor
//
// b1.setA(1000);
// b1.out();
// std::cout<<b1.getA()<<std::endl;
test2(BB());//为什么没有隐式调用BB的copy consructor
return 0;
}
test()输出
#####XP VS2005
cos CC
cos AA
cos DD
cos BB
cos CC
cos AA
cos DD
cos copy BB
de BB
de DD
de AA
de CC
BB i = 10
1000
de BB
de DD
de AA
de CC
#####MAC OS X10.8.2 XCode4.5.1
cos CC
cos AA
cos DD
cos BB
BB i = 10
1000
cos CC
cos AA
cos DD
cos BB
de BB
de DD
de AA
de CC
de BB
de DD
de AA
de CC
test2()
输出:
cos CC
cos AA
cos DD
cos BB
de BB
de DD
de AA
de CC
以上程序均在MAC OS X 10.8.3 ,XCode4.5.1上运行实现。
以上程序均在XP ,VS 2005上运行实现。
如何查看文件编译后的汇编代码XCode和VS2005.?