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

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

时间:2024-03-22 18:13:12浏览次数:31  
标签:初始化 易错 先后顺序 10 子类 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

 

标签:初始化,易错,先后顺序,10,子类,C++,构造,父类
From: https://www.cnblogs.com/uacs2024/p/18090207

相关文章

  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......
  • 【C++ leetcode】双指针问题
    1.  611.有效三角形的个数题目给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。题目链接.-力扣(LeetCode)画图和文字分析判断是否是三角形要得到三边,由于遍历三边要套三层循环,时间复杂度很大,所以这里我们需要借助双指针思想,可......
  • 【C++从0到1-黑马程序员】类和对象(一)
     C++从0到1-黑马程序员 课程学习笔记课程链接: 16类和对象-封装-属性和行为作为整体_哔哩哔哩_bilibiliC++面向对象三大特性封装继承多态C++认为万事万物皆为对象,对象有其属性和行为1.封装1.1.封装的意义(1)将属性和行为作为一个整体,表现生活中的事物类中的属......
  • C++11新特性
    1、成员变量默认初始化:构建一个类的对象不需要用构造函数初始化成员变量。2、auto关键字:用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化);3、智能指针;4、空指针:空指针从指向NULL变为指向nullptr;通过将指针初始化为nullptr(nullptr直接代表指针空值类型),可......
  • 复试C++19真题_看程序写结果_前置++运算符重载 易错
    考察前置++运算符设置为友元函数,这题的坑在于,返回值是不是对象的引用,形参也不是对象的引用,导致自增离开了作用域以后就不在有任何效果。#include<iostream>usingnamespacestd;classC{private:intxx,yy;public:C(intx,inty):xx(x),yy(y){}friendC......
  • C++ Qt开发:QProcess进程管理模块
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess组件实现针对进程的控制管理等。当你在使用Qt进行跨平台应用程序开发时,经常需要......
  • UE5中简易的UI管理框架(c++版,UE5.1)
    需求说明:在UE项目开发中,当UI界面较多的时候,就需要有一个管理功能出现,负责UI的生成、销毁、禁用等功能。基于此需求,采用栈先进后出的数据接口,编写了一个简易的UI管理框架。功能说明:1.支持UI的自动创建2.支持UI的按开启顺序关闭3.支持一件关闭所有UI4.支持开启当前UI后,禁......
  • C++ Stacks(堆栈) 和 Queues(队列)的基本用法
    一、栈1.栈的定义        栈(stack)是限定仅在表的一端进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶(stacktop),另一端称为栈底(stackbottom),不含任何数据元素的栈称为空栈。        如图1-1所示,栈中有三个元素,插入元素(也称为入栈、进栈、压......
  • 九宫幻方(DFS实现)c++
    题目描述题目分析要完成这个问题,我们需要做这几步1.用1~9的数字替换掉输入中的0,且幻方中不能出现重复元素2.替换完成后,要判断是否为幻方判断是否为幻方boolcheck()//检查是否为幻方{ intsum=a[1][1]+a[2][2]+a[3][3];//左对角线的和 if(sum!=a[1][3]+a[2][2]+a[......
  • SQLiteC/C++接口详细介绍sqlite3_stmt类(一)
    返回目录:SQLite—免费开源数据库系列文章目录   上一篇:SQLiteC/C++接口详细介绍sqlite3_stmt类简介下一篇:SQLiteC/C++接口详细介绍sqlite3_stmt类(二)​序言:本文开始了SQLite的第二个类的详细介绍了,有兴趣的朋友可以关注更新一下。 1、sqlite3_prepare_v2()`sqlite3......