C++程序设计期末考试复习试题及解析 3(自用~)

news2025/7/7 13:58:47

DDL

  • 1.题目及分析
    • 1.对象数组的析构顺序
    • 2.浅拷贝的隐患
      • delete p 还是 delete[]p ?
      • 类似的题,自行查阅
    • 3.常数据成员的初始化
    • 4.默认构造函数
    • 5.cin、cout所属类
    • 6.重载
    • 7.静态数据成员
    • 8.多态
    • 8.联编
    • 9.内联函数
    • 10.引用
    • 11.static
    • 12.构造Complex类
    • 13.静态成员函数
    • 14.抽象类
    • 15.标识符
    • 16.指针数组
    • 17.不可嵌套定义,可嵌套调用
    • 18.可见性 、存在性
    • 19.虚函数
    • 20.子类重写虚函数的权限
    • 21.虚析构函数
    • 22.重载、覆盖
    • 23.继承
    • 24.类与对象
    • 25.友元关系
    • 25.公有继承
    • 26.多态
    • 27.
    • 28.面向对象
    • 29.四要素
    • 30嵌套
  • 2.更新日志

1.题目及分析

1.对象数组的析构顺序

在这里插入图片描述

#include <iostream>
using namespace std;

class T {
public:
	~T() { cout << "Destroying..." << i << endl; }

	void Setij(int a, int b) { i = a, j = b; }
	int GetMuti() { return i * j; }
protected:
	int i, j;
};
int main()
{
	T* p = new T[5];
	for (int j = 0; j < 5; ++j) p[j].Setij(j, j);
	for (int k = 0; k < 5; ++k) cout << "Multi[" << k << "] is:" << p[k].GetMuti() << endl;

	//程序结束并不会隐式地调用析构函数,需要显式调用析构函数
	//析构顺序与构造顺序相反
	delete[]p;
	return 0;
}

在这里插入图片描述

2.浅拷贝的隐患

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


#include <iostream>
using namespace std;

class Vector {
public:
	Vector(int s = 100);
	~Vector();

	int& Elem(int idx);
	void Display();
	void Set();
protected:
	int size;
	int* buffer;
};


Vector::Vector(int s)
{
	buffer = new int[size = s];    //巧妙1: 初始化size的同时也初始化了buffer
}
Vector::~Vector()
{
	cout << "扫尾工作..." << endl;
	delete []buffer;
}

int& Vector::Elem(int idx)
{
	if (idx < 0 || idx >= size)
	{
		cout << "error in index" << endl;
		exit(-1);
	}
	return buffer[idx];
}

void Vector::Display()
{
	for (int i = 0; i < size; ++i)
		cout << Elem(i) << endl;
}

void Vector::Set()
{
	for (int i = 0; i < size; ++i)
		Elem(i) = i + 1;    //巧妙2: 利用返回值为引用,直接修改了buffer(i)
}

int main()
{	
	Vector a(10);
	Vector b(a);
	a.Set();
	b.Display();
	return 0;
}

在这里插入图片描述

可以很清楚看到浅拷贝所造成的错误:在析构的时候会重复析构,这是由于浅拷贝时,b的buffer指针和a的buffer指针指向的是同一片空间

如何更改?
换为深拷贝!
即弃用默认拷贝构造函数,自己写一个拷贝构造函数

#include <iostream>
using namespace std;

class Vector {
public:
	Vector(int s = 100);
	Vector(const Vector& v);   //拷贝构造函数
	~Vector();

	int& Elem(int idx);
	void Display();
	void Set();
protected:
	int size;
	int* buffer;
};


Vector::Vector(int s)
{
	buffer = new int[size = s];    //巧妙1: 初始化size的同时也初始化了buffer
}
Vector::Vector(const Vector& v)
{
	//照猫画虎 重新开辟空间,使得通过调用拷贝构造函数创建的对象的buffer指向另一片空间
	this->buffer = new int[this->size = v.size];
	//拷贝数据  [也可不加this指针进行访问]
	for (int i = 0; i < size; ++i)
		buffer[i] = v.buffer[i];
}
Vector::~Vector()
{
	cout << "扫尾工作..." << endl;
	delete []buffer;
}

int& Vector::Elem(int idx)
{
	if (idx < 0 || idx >= size)
	{
		cout << "error in index" << endl;
		exit(-1);
	}
	return buffer[idx];
}

void Vector::Display()
{
	for (int i = 0; i < size; ++i)
		cout << Elem(i) << endl;
}

void Vector::Set()
{
	for (int i = 0; i < size; ++i)
		Elem(i) = i + 1;    //巧妙2: 利用返回值为引用,直接修改了buffer(i)
}

int main()
{	
	Vector a(10);
	Vector b(a);
	a.Set();
	b.Display();
	return 0;
}

在这里插入图片描述
改为深拷贝后,a、b对象不会相互影响,由于b未调用set()函数,所以其buffer里面的数据仍为随机值

delete p 还是 delete[]p ?

#include <iostream>
using namespace std;
int main()
{
	int* p1 = new int(5);  //只分配一个int类型的空间,并初始化为5
	cout << *p1 <<" "<< p1[0] << endl;
	delete p1;

	int* p2 = new int[5];  // 指向数组
	p2[0] = 1;
	p2[1] = 10;
	cout << *p2 << " " << p2[0] << " " << p2[1] << endl;
	delete[] p2;  //依次销毁p2所指向的完整完整空间

	return 0;
}

在这里插入图片描述

delete []p 是指 释放p所指向的完整空间

记清楚两者的适用条件即可

类似的题,自行查阅

在这里插入图片描述
在这里插入图片描述

3.常数据成员的初始化

常数据成员名只可在初始化列表中进行
(上机在VS2019尝试后,发现在定义时初始化也能编译通过,但并不建议这样做)

4.默认构造函数

默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。
它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义

class T{
public:
	T(){}
protected:
	int x;
}class T{
public:
	T(int xx = 0) {}
protected:
	int x;
}

5.cin、cout所属类

在这里插入图片描述
B
cin 属于 istream类
cout 属于 ostream类

6.重载

在这里插入图片描述
A
类模板不可以重载,但是函数模板可以重载。

7.静态数据成员

在这里插入图片描述
静态数据成员指的是 static修饰的数据成员
A

8.多态

在这里插入图片描述
A

多态分为4类: 重载多态 、 强制多态、参数多态、包含多态
前两种又被称为专用多态
后两种又被称为通用多态

前三种的绑定工作在编译连接阶段即可完成
包含多态的绑定工作在程序运行阶段才可完成

8.联编

在这里插入图片描述
B
在这里插入图片描述

多态分为静态多态(编译时多态、静态联编、早绑定)和动态多态(运行时多态、动态联编、晚绑定)

9.内联函数

在这里插入图片描述
正确
在这里插入图片描述

10.引用

在这里插入图片描述

在这里插入图片描述

11.static

在这里插入图片描述
static修饰的数据成员为该类的所有对象_共享___

12.构造Complex类

在这里插入图片描述

#include <iostream>
using namespace std;

class Complex {
public:
	Complex(double rr = 0.0 ,double ii = 0.0):r(rr),i(ii){}
	void show() { cout << r << " " << i << endl; }
	Complex operator+(const Complex& c) {
		return Complex(this->r + c.r, this->i + c.i);
	}
private:
	double r, i;
};

int main()
{
	Complex c1(-1, 4), c2(2, 5);
	c1.show();
	c2.show();
	Complex c3 = c1 + c2;
	c3.show();
	return 0;
}

在这里插入图片描述

13.静态成员函数

在这里插入图片描述
B

#include <iostream>
using namespace std;

class T {
public:
	static void show_x() { return this->x; }  //错误,this指针只存在于非静态函数内部
private:
	static int x;
};

int T::x = 1;  //静态数据成员类外初始化

int main()
{
	return 0;
}

在这里插入图片描述

14.抽象类

在这里插入图片描述

#include <iostream>
using namespace std;
#include <algorithm>

const double PI = acos(-1);

class CShape {
public:
	virtual double GetLength() const = 0;
};

class CSqure :public CShape {
public:
	CSqure(double x, double y):x(x),y(y){}
	double GetLength()const { return 2 * (x + y); }
private:
	double x, y;
};

class CCircle :public CShape {
public:
	CCircle(double r):r(r){}
	double GetLength()const { return 2 * PI * r; }
private:
	double r;
};

int main()
{
	CSqure c1(1, 2);
	cout << c1.GetLength() << endl;

	CCircle c2(1);
	cout << c2.GetLength() << endl;
	return 0;
}

在这里插入图片描述

15.标识符

在这里插入图片描述

16.指针数组

在这里插入图片描述

17.不可嵌套定义,可嵌套调用

在这里插入图片描述

18.可见性 、存在性

在这里插入图片描述

19.虚函数

在这里插入图片描述
虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

20.子类重写虚函数的权限

#include <iostream>
using namespace std;

class B {
public:
	B(){}
	B(int i) { b = i; }
	virtual void virfun()
	{
		cout << "B::virfun() called.\n";
	}
private:
	int b;
};

class D :public B {
public:
	D(){}
	D(int i, int j) :B(i) { d = j; }
private:
	int d;
	void virfun()
	{
		cout << "D::virfun() called.\n";
	}
};


void fun(B* obj)
{
	obj->virfun();
}

int main()
{
	D* pd = new D;
	fun(pd);
	return 0;
}


虽然在子类中声明了private,但其实仍然可以调用虚函数

虚函数编译时的访问权限仅仅是和调用者(指针、引用)的类型有关,编译器只要知道这个类型有一个可以访问的虚函数就行了,并不查看具体对象类型中该虚函数的访问权限

简而言之,基类是public权限即可成功调用虚函数

21.虚析构函数

在这里插入图片描述

22.重载、覆盖

在这里插入图片描述
在这里插入图片描述

23.继承

在这里插入图片描述

24.类与对象

在这里插入图片描述

25.友元关系

在这里插入图片描述

A

友元关系破坏了封装性,可提高程序的运行效率

25.公有继承

在这里插入图片描述
C

只可访问公有成员

26.多态

在这里插入图片描述
在这里插入图片描述

27.

在这里插入图片描述
在这里插入图片描述

28.面向对象

面向对象将数据和对数据的操作作为一个相互依赖,不可分割的整体,采用了数据抽象和信息隐蔽技术。

29.四要素

抽象性、封装性、继承性和多态性

30嵌套

在C++中,函数的定义不可以嵌套,类的定义可以嵌套。

2.更新日志

2022.11.19 整理

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[一篇读懂]C语言二讲:运算符与表达式

[一篇读懂]C语言二讲&#xff1a;运算符与表达式1. 算术运算符与关系运算符1 运算符分类2 算术运算符及算术表达式3 关系运算符与关系表达式【例】关系运算符的使用。4 运算符优先级2. 逻辑运算符与赋值运算符&#xff0c;求字节运算符1 逻辑运算符与逻辑表达式【例】逻辑运算符…

k8s基于kubectl命令管理资源并分配

文章目录一、资源管理介绍二、资源管理方式1、命令式对象管理2、命令式对象配置3、声明式对象配置一、资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过master节点操作资源来管理kubernetes。 &#xff08;1&#xff09;kubernetes的本…

数据结构串和数组练习题

串和数组 一 填空题 不包含任何字符&#xff08;长度为0&#xff09;的串称为 空串 &#xff1b;由一个或多个空格&#xff08;仅由空格符&#xff09;组成的串称为 空白串。 设S“A;/document/Mary.doc”&#xff0c;则strlen(s) 20 , “/”的字符定位的位置为 3 。 子串的…

Windows内核--CreateProcess到内核NtCreateProcess(2.3)

CreateProcessA vs CreateProcessW A和W后缀代表ANSI和UNICODE版本。早期&#xff0c;Windows为了兼容之前ANSI版本&#xff0c;为了推广UNICODE版本&#xff0c;所以做出了两套API. 注意&#xff0c;并不是所有Windows API都有*A和*W两套&#xff0c;只有API参数包含"字符…

[附源码]java毕业设计社区生鲜电商平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

linux文件上传和下载、别名设置以及环境变量

一、文件上传和下载 1.sftp &#xff08;1&#xff09;它类似于ftp传输协议&#xff0c;属于ssh&#xff0c;但它进行加密传输&#xff0c;相对FTP来讲有更高的安全性 &#xff08;2&#xff09;用法 [rootserver ~]# ssh root10.0.0.3 The authenticity of host 10.0.0.3 …

虚基类设计 c++

一个例子 首先大家看一个定义的一个虚基类 所谓的虚基类&#xff0c;是指类内包含virtual关键字定义的成员函数 class Abstract_base { public:virtual ~Abstract_base();virtual void interface() const 0;virtual const char* mumble() const {return m_mumble;} protect:ch…

Echarts:制作词云

Echarts是一个开源的可视化图表库&#xff0c;支持丰富的图表&#xff0c;官网中还有大量示例可以选择使用、参考。 其中比较好玩、有趣的是词云&#xff0c;词云就是用关键词组成的一朵云&#xff0c;更广泛的定义是&#xff0c;由关键词组成的任意一种图案均称为词云。因此&…

opencv 空域变换

图像变换是基于像素的映射&#xff0c;区别是像素是怎么映射的。灰度变换的话是通过点对点的映射&#xff0c;也就是变换后的像素点之和当前的像素点有关&#xff08;gramma变换、对数变换等等&#xff09;&#xff0c;依次来进行对比度拉伸。而空间滤波变换后的像素点是和当前…

LeetCode - 354 俄罗斯套娃信封问题

题目来源 354. 俄罗斯套娃信封问题 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个…

GreenPlum6.x之测试数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、generate_series是什么&#xff1f;二、使用步骤1.建张测试表2.插入简单的测试数据3.查看数据分散情况4.通过SQL测试性能总结前言 提示&#xff1a;这里可以…

浅谈一下:Java当中的构造方法

从前面的所学的知识&#xff0c;我们可以发现&#xff1a;实列化一个对象以后&#xff0c;如果要为这个对象的属性赋值&#xff0c;那么必须直接访问对象的属性或者调用setXxx()方法&#xff0c;如果需要在实列化对象的同时就为这个对象的属性进行赋值&#xff0c;可以通过构造…

【考研复试】计算机专业考研复试英语常见问题四(优缺点/观点/观念篇)

相关链接&#xff1a; 【考研复试】计算机专业考研复试英语常见问题一&#xff08;家庭/家乡/学校篇&#xff09;【考研复试】计算机专业考研复试英语常见问题二&#xff08;研究方向/前沿技术/本科毕设篇&#xff09;【考研复试】计算机专业考研复试英语常见问题三&#xff0…

程序员这个身份,比你想象的还值钱!

看到这个标题先别急着喷我&#xff01; 虽然现在“程序员”已经被吐槽饱和了&#xff0c;但目前小厂依旧求贤若渴&#xff0c;大厂一些门槛比较高的算法岗还是抛出了不少HC&#xff01; 并且年年薪水涨&#xff0c;年年新人倒挂&#xff0c;校招白菜总包薪资近40w的不在少数&am…

从入门到项目实战 - vue2 与 vue3 中实现全局事件总线

VUE组件跨通信vue2 与 vue3 中实现全局事件总线上一节&#xff1a;《Vue中的 虚拟 Dom 》| 下一节&#xff1a;《Vue 组件常见的数据访问方式总结 》jcLee95 邮箱 &#xff1a;291148484163.com CSDN 主页&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.300…

【物理应用】基于Matlab模拟极化雷达回波

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

服务器安装Ubuntu20及系统扩容

文章首发及后续更新&#xff1a;https://mwhls.top/4060.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 参考&#xff1a;Ubuntu20.04安装详细图文教程&#xff08…

C++初阶作业 String类作业详解

作者&#xff1a;小萌新 专栏&#xff1a;C初阶作业 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;会梳理一遍博主做过了String类题目 并且较为详细的讲解出来 _ String类的特性和使用 题目一 考察c_str&#xff08;&#xff09;…

黑塞矩阵理解

文章目录1&#xff1a;一元泰勒展开公式2&#xff1a;二元泰勒展开公式3&#xff1a;二元函数的黑塞矩阵4&#xff1a;多元函数的黑塞矩阵其他链接1&#xff1a;一元泰勒展开公式 举例&#xff1a;f(x) 3x 2x 5 在x0或x1处的泰勒展开 当x0时&#xff1a; 当x1时&#xff…

m基于MATLAB的上行链路MIMO关键技术的研究与性能分析

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 多输入多输出(MIMO)天线技术的巨大潜力为新一代无线通信技术的研究提供了广阔的舞台。近年来&#xff0c;多用户的MIMO研究逐渐成为热点问题。针对多用户的MIMO&#xff0c;天线选择和用…