C++复习之路十二——类继承的构造函数和析构函数执行的顺序问题

一般定义类的时候,我们都会定义构造函数和析构函数,如果我们也想继承这些类,就得知道基类和派生类的构造函数的调用顺序,以及析构函数的调用顺序。(以public继承方式为例)

一、构造函数的调用顺序

我们先来定义两个类,Child类通过public继承Parent类。

class Parent
{
public:
	Parent(int a, int b);
	~Parent();
	void printP();
private:
	int m_a;
	int m_b;
};

class Child : public Parent
{
public:
	Child( int a, int b,  int c, int d);
	~Child();
	void printC();
private:
	int m_c;
	int m_d;
	int m_aa;
	int m_bb;
};

Parent类里面有两个私有成员变量,m_a, m_b, 还有三个共有的成员函数,分别是构造函数,析构函数,还有一个打印函数。

Child类通过public方式继承了Parent里面的成员,但是没有继承基类的构造函数和析构函数。除了继承的基类的成员还有它自己的一些私有成员变量。通过上一篇博客我们知道通过public继承之后的基类的所有属性保持不变。

我们先声明一个Child的对象。

Child c(1,2,3,4); 

因为我们在声明基类的时候基类定义了一个有两个参数的构造函数,所以我们必须在声明的时候给基类传两个参数,由于我们Child又是继承Parent类的,所以我们在定义Child类的构造函数时,需要调用Parent类的构造函数。因此我们需要这样来定义子类的构造函数。

Child::Child( int a, int b,  int c, int d):Parent(a,
<think>嗯,用户现在问的是结合近五年的计算机二级C++语言程序设计真题官方样题,详细罗列有关的考点,比如构造函数、运算符重载等的考查形式内容。我需要先回忆一下这些考试通常会考什么内容。 首先,构造函数的基础部分,可能考点包括默认构造函数、有参构造函数、拷贝构造函数,还有可能涉及深拷贝浅拷贝的区别。析构函数也是重点,特别是动态内存释放的情况。运算符重载的话,常见的如重载赋值运算符、输入输出运算符,可能还会涉及友元函数成员函数的重载区别。 然后,用户提到的是近五年的真题样题,所以需要确保信息是最新的,可能还要参考考试大纲的变化。比如,考试中是否新增了移动构造函数或者右值引用的内容?不过考虑到是二级考试,可能还是以基础为主,但需要确认。 接下来,考查形式可能包括选择题、填空题、程序改错题、编程题等。比如选择题可能问哪个是拷贝构造函数的正确形式,填空题让补全运算符重载的代码,改错题找出定义中的错误,编程题要求实现一个完整的,包括构造、析构、运算符等。 另外,需要总结每个考点的具体内容典型例题。比如构造函数的初始化列表,可能在改错题中出现未正确初始化成员变量的情况。运算符重载中,友元函数成员函数的区别,以及何时使用哪种方式,也是常见的考点。 还要注意一些易错点,比如重载赋值运算符时的自赋值检查,深拷贝的实现,避免内存泄漏。析构函数是否声明为虚函数的情况,可能在继承中考到。 可能用户是备考的学生,需要系统复习的相关知识点,了解考试重点题型,以便有针对性地准备。所以回答要结构清晰,分点列出考点,每个考点配上考查形式例题,这样用户复习起来更方便。 需要确保覆盖所有重要考点,并且例题贴近真实考试难度形式。同时,要使用正确的中文术语,避免技术错误,比如正确区分“拷贝构造函数“赋值运算符”的不同应用场景。 最后,总结部分要强调重点复习建议,帮助用户高效备考。可能还要提醒注意动态内存管理常考的错误型,如内存泄漏、指针悬挂等。</think>### 计算机二级C++语言程序设计考试——相关考点及考查形式(近5年真题分析) --- #### **一、核心考点分布** 根据近5年真题及官方样题,**(Class)**相关考点占考试总分值的**25%~30%**,主要围绕以下模块展开: 1. **构造函数析构函数** 2. **拷贝控制(拷贝构造、赋值运算符)** 3. **运算符重载** 4. **静态成员常成员** 5. **友元函数友元** 6. **模板基础** --- #### **二、详细考点解析考查形式** ##### **1. 构造函数析构函数** **高频考点**: - **默认构造函数**:自动生成的规则(当用户未定义任何构造函数时) - **带参构造函数**:初始化列表的使用(`:`语法) - **析构函数**:动态内存释放的场景(`delete`操作) **考查形式**: - **选择题**:判断构造函数调用顺序 ```cpp class A { public: A() { cout << "A默认构造"; } A(int x) { cout << "A带参构造"; } }; class B : public A { public: B(int x) : A(x) { ... } // 初始化列表调用构造 }; ``` - **填空题**:补全构造函数初始化列表 ```cpp class Student { string name; int age; public: Student(string n, int a) : ______, ______ { } // 补全name(n), age(a) }; ``` --- ##### **2. 拷贝控制** **高频考点**: - **拷贝构造函数**:深拷贝浅拷贝的区别 - **赋值运算符重载**:`operator=`的实现(处理自赋值、返回`*this`) **考查形式**: - **程序改错题**:指出浅拷贝导致的问题 ```cpp class String { char* data; public: String(const char* str) { data = new char[strlen(str)+1]; strcpy(data, str); } // 缺少拷贝构造函数赋值运算符重载(导致浅拷贝) }; ``` - **编程题**:实现一个包含深拷贝的(如动态数组) --- ##### **3. 运算符重载** **高频考点**: - **成员函数 vs 友元函数**:`+`、`<<`、`=`等运算符的实现方式 - **输入输出运算符重载**:`>>``<<`的友元函数形式 **考查形式**: - **选择题**:判断运算符重载的合法性 ```cpp class Complex { public: Complex operator+(const Complex& rhs); // 成员函数形式 friend Complex operator-(const Complex& a, const Complex& b); // 友元函数形式 }; ``` - **填空题**:补全运算符重载函数 ```cpp class Vector { int x, y; public: Vector operator*(int scalar) { return ______; // Vector(x * scalar, y * scalar) } }; ``` --- ##### **4. 静态成员常成员** **高频考点**: - **静态数据成员**:内声明、外初始化(需用`名::`限定) - **常成员函数**:`const`修饰符的作用(禁止修改成员变量) **考查形式**: - **程序阅读题**:分析静态成员计数器的结果 ```cpp class Counter { static int count; // 静态成员声明 public: Counter() { count++; } static int getCount() { return count; } // 静态成员函数 }; int Counter::count = 0; // 外初始化 ``` - **改错题**:在常成员函数中修改成员变量 ```cpp class Test { int value; public: int getValue() const { value = 10; // 错误:常成员函数不能修改成员变量 return value; } }; ``` --- ##### **5. 友元函数友元** **高频考点**: - **友元函数**:访问私有成员的权限控制 - **运算符重载中的友元应用**:如`<<`、`>>`的重载 **考查形式**: - **选择题**:判断友元函数的访问权限 ```cpp class Box { int width; friend void printWidth(Box b); // 友元函数声明 }; void printWidth(Box b) { cout << b.width; // 合法访问私有成员 } ``` - **编程题**:实现友元函数完成特定操作(如矩阵乘法) --- ##### **6. 模板基础** **高频考点**: - **模板声明实例化**:`template <typename T>`语法 - **模板成员函数**:在外定义时的语法格式 **考查形式**: - **填空题**:补全模板定义 ```cpp template <typename T> class Stack { T data[100]; int top; public: void push(T value) { ... } T pop() { ... } }; ``` - **程序阅读题**:分析模板的实例化结果 ```cpp Stack<int> s1; // 实例化为int型 Stack<double> s2; // 实例化为double型 ``` --- #### **三、真题题型统计** | **题型** | **出现频率** | **典型例题** | |----------------|-------------|--------------------------------------------| | 选择题 | 35% | 构造函数调用顺序、运算符重载合法性判断 | | 填空题 | 25% | 补全成员函数、初始化列表 | | 程序改错题 | 20% | 修正浅拷贝、常成员函数错误 | | 编程题 | 20% | 实现完整(包含构造、拷贝控制、运算符重载) | --- #### **四、备考建议** 1. **重点突破**:优先掌握**拷贝构造函数****赋值运算符重载**,这是动态内存管理题目的核心。 2. **真题训练**:完成近5年真题中所有相关的题目,注意总结易错点(如`const`修饰符遗漏)。 3. **模拟编程**:手动实现常见(如字符串、动态数组),确保能正确处理深拷贝资源释放。 4. **理解本质**:区分**成员函数****友元函数**重载运算符的适用场景(如`<<`必须用友元)。 通过系统练习知识点梳理,相关题目可成为提分关键模块!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值