读书人

C++中继承、传参、函数返回有关问题

发布时间: 2013-04-09 16:45:09 作者: rapoo

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.?

读书人网 >C++

热点推荐