某公司的一道笔试题

hahano1 2007-10-24 02:28:04
#include<stdio.h>
class A{
public:
A(){printf("A\n");}
~A(){printf("~A\n");}
};
class B{
public:
//B(A &a):_a(a){printf("B\n");} //---------------1
B(A &a){printf("B\n");_a = a;} //---------------2
~B(){printf("~B\n");}
private:
A _a;
};
void main(){
A a;
B b(a);
}
如果分别用1和2,各自的输出是?
希望哪位大牛帮忙解释一下
...全文
109 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahano1 2007-10-24
  • 打赏
  • 举报
回复
//------------
因为_a是b的成员变量,构造b之前先要构造a
//------------
恩,了解了
thank you CoffeeCN
hahano1 2007-10-24
  • 打赏
  • 举报
回复
如果把第二句改成下面的话为什么还可以输出A A B...
B(A &a){printf("B\n");}
形参A &a不是引用吗?直接就是上面定义的A a了吧,为什么还要重新调用A的构造函数来显示A?
我想的是输出A B..
CoffeeCN 2007-10-24
  • 打赏
  • 举报
回复
因为_a是b的成员变量,构造b之前先要构造a
CoffeeCN 2007-10-24
  • 打赏
  • 举报
回复
按龟定来
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。

2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。

3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。

4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。
CoffeeCN 2007-10-24
  • 打赏
  • 举报
回复
调用顺序是按入栈顺序决定的,后入先出的原理
构造顺序
A a
A _a
B b
析构则相反
hahano1 2007-10-24
  • 打赏
  • 举报
回复
B(A &a){printf("B\n");_a = a;}
A的一般构造,_a必须再次调用A(){printf("A\n");} 构造函数

第二种输出A A B ~B ~A ~A

既然这样的话为什么是先输出A,后输出B呢?
B(A &a){printf("B\n");_a = a;}
明明是先打印出B然后才_a = a;赋值呀

我对类成员变量及类构造函数等的初始化顺序不清楚,还有类析构的顺序,请大牛解答



xiantongyuan 2007-10-24
  • 打赏
  • 举报
回复
楼上正解。
ouyh12345 2007-10-24
  • 打赏
  • 举报
回复
1是拷贝构造
2是赋值
CoffeeCN 2007-10-24
  • 打赏
  • 举报
回复
B(A &a):_a(a){printf("B\n");}
A的拷贝构造,就是说调用A的默认拷贝构造函数把a拷贝到_a, _a不调用A(){printf("A\n");}
默认的拷贝构造是A(A &a){}这种形式,如果程序员没给出,编译器会自动分配一个拷贝构造函数

B(A &a){printf("B\n");_a = a;}
A的一般构造,_a必须再次调用A(){printf("A\n");} 构造函数

第一种输出A B ~B ~A ~A
第二种输出A A B ~B ~A ~A

你自己可以试一下在A里面加上代码 A(A &a){printf("COPY A\n");}

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧