uacs2024

导航

C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错

C++类继承与类组合,默认与含参的构造先后顺序  易错

这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。

一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。

#include "bits/stdc++.h"
using namespace std;

class A{
public:
    A(){
        x = 10;
        cout << "A default constructor" << endl;
        cout<<"A:"<<x<<endl;
    }
    /*A(int i=10){
        x=i;cout<<"A:"<<x<<endl;
    }*/
    //原本是这样的。注意,这种自带默认形参的构造函数,如果对象创建时没有带入任何参数,就使用默认形参赋值,相当于一个默认构造函数
    //如果对象创建时带入了参数,就使用带入的参数赋值

    A(int i){
        x=i;
        cout << "A parameter constructor" << endl;
        cout<<"A:"<<x<<endl;
    }
    int x;
};

class B:public A{
public:
    B(int i = 8):A(i){
        x=i;
        cout << "B : " << x << " , " << "A::x = " << A::x << endl;
    }
    void show()  {cout << "A::x = " << A::x << " , x = " << x << " , B.a.x = " << a.x << endl; }
private:
    A a;
    int x;
};

int main(){
    B b(5);
    b.show();
    return 0;
}

结果发现。子类先利用参数初始化父类,即    A(i)   ,调用了父类含参构造。然后根据子类声明成员的顺序进行初始化。子类含有父类的成员a,如果要初始化,应该为  a(int)  ,但是没有。于是子类内含的父类成员就用默认值初始化。

初始化列表之后,然后执行大括号内的代码。

A parameter constructor
A:5
A default constructor
A:10
B : 5 , A::x = 5
A::x = 5 , x = 5 , B.a.x = 10

 这个是原始代码

#include "bits/stdc++.h"
using namespace std;

class A{
public:
    A(int i=10){ //
        x=i;cout<<"A:"<<x<<endl; //
    }
    int x;
};

class B:public A{
public:
    B(int i = 8):A(i){ //
        x=i;
        cout<<"B:"<<x<<","<<A::x<<endl;
    }
private:
    A a;
    int x;
};

int main(){
    B b(5);
    return 0;
}

结果

A:5
A:10
B:5,5

 

posted on 2024-03-22 17:55  ᶜʸᵃⁿ  阅读(6)  评论(0编辑  收藏  举报