首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-04-09 
C++中继承、传参、函数返回问题class AA{CC cpublic:AA(){std::coutcos AAstd::endl}virtual ~AA()

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

热点排行