【c++】一道关于继承和析构的笔试题

题目如下,求输出结果

    class A
    {
    public:
        A()  {    cout<<"A"<<endl;    }
        ~A() {    cout<<"~A"<<endl;   }
    }; 

    class B:public A
    {
    public:
        B(A &a):_a(a)
        {
            cout<<"B"<<endl;
        }
        ~B()
        {
            cout<<"~B"<<endl;
        }
    private:
        A _a;
    }; 

    int main(void)
    {
        A a;
        B b(a);
        return 0;
    } 

这里先给出答案:

[root]$ ./class
A
A
B
~B
~A
~A
~A

你可能会觉得奇怪,为什么少调了一次A的构造函数。其实这是由于使用初始化列表,初始化列表在初始化类的对象的时候,使用的是拷贝构造函数。

修改代码,增加拷贝构造函数的打印。

    class A
    {
    public:
        A()  {    cout<<"A"<<endl;    }
        ~A() {    cout<<"~A"<<endl;   }
        A(const A& a) {cout << "copy" << endl;}
    }; 

    class B:public A
    {
    public:
        B(A &a):_a(a)
        {
            cout<<"B"<<endl;
        }
        ~B()
        {
            cout<<"~B"<<endl;
        }
    private:
        A _a;
    }; 

    int main(void)
    {
        A a;
        B b(a);
        return 0;
    }   

再看运行结果,这样构造和析构的次数就一致了。

[root]$ ./class
A
A
copy
B
~B
~A
~A
~A
时间: 2024-08-05 10:40:24

【c++】一道关于继承和析构的笔试题的相关文章

48行代码解一道亚马逊的在线笔试题

这题是我从这里看到的一道亚马逊的在线笔试题,具体规则请前往该文章查看,下面贴出我的解题代码: 其中11,12,13,14分别代表J,Q,K,A; class CardCompare { private int[] cards = new int[] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; public bool CompareCards(int[] cards1, int[] cards2) { return cardsScore(card

一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)

数学中一元n次多项式可表示成如下的形式: Pn(x)=p0+p1x+p2x^2+…+pnx^n     (最多有 n+1 项,n +1 个系数唯一确定她) (1)请设计一套接口用以表示和操作一元多项式 (2)根据上述设计实现一元n次多项式的加法运算 (3)根据上述设计实现一元n次多项式的乘法运算 分析:  题目大概意思: 数学里常见的一元 n 次表达式,设计出加减乘除的函数(方法),同时提供对外接口,把内部实现封装起来,而 n 的大小没有指定. 问题的本质: 就是一系列的单个未知数 x,指数和系

多线程关于腾讯笔试题

今天在头条上看到一道据说是腾讯的笔试题,闲来无事,准备验证一下! 题目如下: 有一个变量int a=0:两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()? 根据我的理解答案不唯一,最大是两百,最小是2吧.直接上代码: class MyThread implements Runnable { static volatile long i = 0; public void run() { for (int m = 0; m < 100; m++) { i++; } } }; p

js原型链的一些发现----来自一道笔试题

1.开篇 1.1本文目标 这是我真正意义上的博客,一是想记录下自己学到的东西,二是想写博客也是对自己的一种历练,自己的一次新的尝试. 废话不多说,说下这次写这篇东东的原因.js的原型链是让我很头疼的事情,每次碰到一些相关的题目和代码都让我有点不知所措.最近的一次笔试碰到了一道相关的题目,不出所料,没有答出来.回来对此钻研一通,不断地查资料测试代码,终于有了点收获,正好最近开始玩博客,所以写了这篇记录. PS:我基础并不好,所以这篇文章可能不会是那种大牛级的专业博客.如果有幸让大神们看到这篇文章,

Java中有关构造函数的一道笔试题解析

Java中有关构造函数的一道笔试题解析 1.具体题目如下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与class同名 C. constructor在一个对象被new时执行 D.一个class只能定义一个constructor 2.解析说明 (1)class中的构造函数是可以省略的 /** * @Title:User.java * @Package:com.you.user.model * @Descrip

0810------笔试题----------腾讯2012年的一道笔试题

1.题目要求 a)b[i] = a[0] *a[1] *a[2]*….a[n-1]/ a[i],求出数组b: b)要求不能用除法,除循环控制变量以外,不许额外申请其余变量,时间复杂度为O(n),空间复杂度为O(1). 2.程序思路 a)假设 N = 5,那么 b[0] =      a[1]*a[2]*a[3]*a[4];            b[1] = a[0]*     a[2]*a[3]*a[4];            b[2] = a[0]*a[1]*     a[3]*a[4];

关于阿里的一道笔试题分析

其题目如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #pragma pack(2) class A { public:     int i;     union U     {         char buff[13];         int i;     }u;     void foo() {    }     typedef char* (*f)(void*);     enum{red, green, blue} color; }a; class A

好玩的一道笔试题

/*实现函数: void f(int a, int b, int c) 编码中不允许出现燃和if,switch,for,while之类的关键词以及"?:"表达式,并要求: a=1时,打印b+c的值: a=2时,打印b-c的值: a=3时,打印b*c的值: a=4时,打印b/c的值. */ 下面是我的解答,哈哈: #include <iostream> int cal(int a,int b, int c){ int res = 0; (!(a^1) && (

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp