一个c++题目引发的思考
来源:互联网 发布:c语言windows代码 编辑:程序博客网 时间:2024/04/30 05:58
0x00:之前有个小学弟在群里问了这个题目,由于自己是c++菜逼一枚,就看了看。
code:
#include<iostream>using namespace std;class A{ public: A(){val=0;cout<<"A():"<<val<<endl;} A(int v){val=v;cout<<"A()"<<val<<endl;} private: int val; };class B:public A{ public: B(int v1,int v2):A(v1),objA(v2){ cout<<"B()"<<endl; } B(B &objB){ cout<<"copy B()"<<endl; } private: A objA; };int main(){ B objB1(2,3); B objB2(objB1);
return 0;
result:
A()2
A()3
B()
A():0
A():0
copy B()
为什么会有这样的结果呢。
首先class B是继承于class A的。所以在初始化构造B的时候,首先需要初始化构造A,然而对于构造函数在执行的时候,先按照初始化列表初始化成员变量,再执行函数体。所以对于B(int v1,int v2):A(v1),objA(v2)这条语句,第一条语句用来初始化基类,再构造派生类,所以输出顺序为2,3。
B objB2(objB1)初始化的基类和其成员变量objA使用的都是默认构造函数构造,所以输出为0.
0 0
- 一个c++题目引发的思考
- 一个十几行简单的C程序引发的思考
- 一个“笑话”引发的思考
- 一个细节引发的思考
- 一个苹果引发的思考
- 一个问题引发的思考
- 一个帖子引发的思考
- 一个程序员引发的思考
- 一个测试引发的思考
- 一个BUG引发的思考
- 一个空格引发的思考
- 一个demo引发的思考
- 一个案例引发的思考
- 一个帖子引发的思考
- 一个问题引发的思考
- 一个JavaBean引发的思考
- 一个字符引发的思考
- 一个电风扇引发的思考
- 苹果开发 笔记(33)常用组件笔记
- touch事件的派发与传递
- ITOO之精妙设计(一)——大道至简
- json和jsonp的联系和区别(转载)
- 2015百度之星 初赛2 连接的管道 最小生成树
- 一个c++题目引发的思考
- Web前端开发规范手册
- java中runnable和thread的区别
- C语言知识结构
- String拼接的问题
- Docker解析及轻量级PaaS平台演练(四)--Fig相关介绍
- 仿iOS猎豹垃圾清理(实现原理+源码)
- 评教有感
- 评教——一个让我得到锻炼的平台