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

这篇具有很好参考价值的文章主要介绍了C++程序设计期末考试复习试题及解析 3(自用~)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.题目及分析

1.对象数组的析构顺序

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

#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;
}

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

2.浅拷贝的隐患

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


#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;
}

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

可以很清楚看到浅拷贝所造成的错误:在析构的时候会重复析构,这是由于浅拷贝时,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;
}

C++程序设计期末考试复习试题及解析 3(自用~)
改为深拷贝后,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;
}

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

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

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

类似的题,自行查阅

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

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所属类

C++程序设计期末考试复习试题及解析 3(自用~)
B
cin 属于 istream类
cout 属于 ostream类

6.重载

C++程序设计期末考试复习试题及解析 3(自用~)
A
类模板不可以重载,但是函数模板可以重载。

7.静态数据成员

C++程序设计期末考试复习试题及解析 3(自用~)
静态数据成员指的是 static修饰的数据成员
A

8.多态

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

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

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

8.联编

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

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

9.内联函数

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

10.引用

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

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

11.static

C++程序设计期末考试复习试题及解析 3(自用~)
static修饰的数据成员为该类的所有对象_共享___

12.构造Complex类

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

#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;
}

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

13.静态成员函数

C++程序设计期末考试复习试题及解析 3(自用~)
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;
}

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

14.抽象类

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

#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;
}

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

15.标识符

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

16.指针数组

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

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

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

18.可见性 、存在性

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

19.虚函数

C++程序设计期末考试复习试题及解析 3(自用~)
虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

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;
}

C++程序设计期末考试复习试题及解析 3(自用~)
虽然在子类中声明了private,但其实仍然可以调用虚函数

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

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

21.虚析构函数

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

22.重载、覆盖

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

23.继承

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

24.类与对象

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

25.友元关系

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

A

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

25.公有继承

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

只可访问公有成员

26.多态

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

27.

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

28.面向对象

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

29.四要素

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

30.嵌套

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

31.public 、 private、 protected访问控制属性

public: 声明公有类型成员,公有类型定义了类的外部接口
private:声明私有类型成员,只允许本类的函数成员访问,而类外部的任何访问都是非法的
即 私有成员隐藏在类中,类外部无法看到,实现了对访问控制权限的有效控制

protected:声明保护类型成员,保护类型与私有类型的性质类似,其差别在于继承和派生时派生类的成员函数可以访问基类的保护成员

32.构造函数、析构函数、拷贝构造函数

构造函数的作用就是在对象被创建时,利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象有区别于其他对象的特征,完成从一般到具体的过程,构造函数在对象创建时由系统自动调用

析构函数与构造函数的作用几乎相反,他是用来完成对象被删除前的一些清理工作,即专门做扫尾工作。一般情况下,析构函数是在对象的生存期即将结束时,由系统自动调用,在调用完成之后,对象即消失,相应的内存空间也被释放

拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,作用是使用一个已经存在的对象,去初始化一个新的同类的对象。
三种情况:用类的一个对象去初始化该类的另一个对象;函数形参为类对象,调用函数进行形实参结合时;函数的返回值为类对象,函数调用完成返回时

33.类的3种继承 public 、 private、 protected

不同的继承方式会导致不同访问属性的基类成员在派生类中的访问属性也有所不同

对于公有继承,基类的public、ptrotected在派生类中不变,而基类的private成员不可访问
对于私有继承,基类的public 、protected以private出现,private不可访问
对于保护继承,基类的public、protected以protected出现,private不可访问

34.派生类构造函数的执行次序

(1.如果该类有直接或间接的虚基类,按照被继承时声明的顺序执行虚基类的构造函数)
2. 调用基类的构造函数(按照被继承时声明的顺序)
3. 按照类定义出现的顺序,调用成员对象的构造函数
4. 执行派生类函数体中的内容

35.虚基类

当某类的部分或全部直接基类是从另一个基类共同派生而来时,这些直接基类中,从上一级基类继承而来的成员就拥有相同的名称,派生类的对象这些同名成员在内存中同时拥有多个拷贝,可以用作用域分辨符来唯一标识并访问他们,也可以将直接基类的共同基类设置为虚基类,这时,从不同路径继承过来的该类成员在内存中只有一份拷贝,解决了同名成员的唯一标识问题
声明虚基类后,虚基类成员在进一步派生过程中,和派生类一起维护一个内存数据拷贝

class 派生类名:virtual 继承方式 基类名

36.组合与继承?

组合和继承它们都使已有对象成为新对象的一部分,从而达到代码复用的目的,组合和继承其实反映了两种不同的对象关系
组合反应的是“有一个”(has-a)关系,如果类B中存在一个类A的内嵌对象,表示的是每一个B类型的对象都“有一个”A类型对象,A类型对象与B类型对象是部分与整体的关系
继承反应的是“是一个”(is-a)关系,如果类A是类B的公有基类,那么这表示每一个B类型都“是一个”A类型的对象,B类型的对象与A类型的对象是特殊和一般的关系

37.二义性

调用不同基类的同名成员时会产生二义性,在多重继承情况下,派生类有多个基类,如果这些基类有有同名成员,那么在派生类和派生类的对象中调用同名成员时,可能产生二义性

38.基类与派生类对象、指针、引用

派生类指针/引用可隐含转换为基类指针/引用
(从特殊到一般的指针转换是安全的,因此允许隐含转换;从一般到特殊的指针是不安全的,所以只可显式转换)
基类对象不可转换为派生类对象,派生类对象可转换为基类对象

当涉及多重继承时,基类指针转换为派生类指针,有时需要调整指针所存储的地址值
当涉及虚继承时,假设类A为类B的虚基类,则类B的指针可隐含转换为A类指针,而A类指针无法隐含转换为B类指针

39.多态

同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象

C++多态:强制、重载、参数、包含

40.抽象类

带有纯虚函数的抽象类
作用是:为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性
抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,需要派生类自己给出
抽象类的派生类并非一定要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,那么这个派生类仍然是抽象类

41.虚构造函数、虚析构函数

C++不可声明虚构造函数,多态是不同对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要针对对象的,而构造函数是在对象产生之前运行的,则虚构造函数无意义

C++中可声明虚析构函数,析构函数地作用是在该类对象消亡前,进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么由它派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就可调用适当的析构函数针对不同的对象进行清理工作

42.虚函数实操

#include <iostream>
using namespace std;
class BaseClass {
public:
	virtual void fn1() { cout << "BaseClass::fn1()" << endl; }
	void fn2() { cout << "BaseClass::fn2()" << endl; }
};

class DerivedClass:public BaseClass {
public:
	void fn1() { cout << "DerivedClass::fn1()" << endl; }
	void fn2() { cout << "DerivedClass::fn2()" << endl; }
};
int main()
{
	DerivedClass d;
	BaseClass* pb = &d;
	DerivedClass* pd = &d;
	
	pb->fn1();  //d
	pb->fn2(); // b
	puts("");

	//要想访问BaseClass的虚函数fn1(),只可加上作用域分辨符来标识
	pb->BaseClass::fn1();   //b
	puts("");

	pd->fn1(); //d
	pd->fn2(); //d
	return 0;
}

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

43.虚析构函数实操

当用派生类指针析构时,并不会发生错误

#include <iostream>
using namespace std;

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

int main()
{

	Derived* pd = new Derived;
	delete pd;

	return 0;
}

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

但当用基类指针析构时,会发生无法析构派生类的错误,为了使基类指针也可以调用派生类的析构函数,所以要将其设置为虚析构函数

#include <iostream>
using namespace std;

class Base {
public:
	virtual ~Base() { cout << "Base" << endl; }
};
class Derived :public Base {
public:
	~Derived() { cout << "Derived" << endl; }
};

int main()
{

	//Derived* pd = new Derived;
	//delete pd;

	Base* pb = new Derived;
	delete pb;

	return 0;
}

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

2.更新日志

2022.11.19 整理

欢迎交流、讨论、指正~
不正确、不理解之处欢迎评论留言~
文章来源地址https://www.toymoban.com/news/detail-494226.html

到了这里,关于C++程序设计期末考试复习试题及解析 3(自用~)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 西安石油大学 C++期末考试 重点知识点+题目复习(下)

    析构函数的调用顺序与对象的创建和销毁顺序相反。 对于单个对象,当对象的生命周期结束时(例如离开作用域),会调用其析构函数。因此,析构函数会在对象销毁之前被调用。 对于类的成员对象,它们的析构函数的调用顺序与它们在类中的声明顺序相反。即,在类的析

    2024年02月11日
    浏览(55)
  • 西安石油大学 C++期末考试 重点知识点+题目复习(上)

    当使用 const 修饰变量、函数参数、成员函数以及指针时,以下是一些代码示例: 声明只读变量: 保护函数参数: 防止成员函数修改对象状态: 防止指针修改指向的值: 这些示例展示了如何使用 const 来声明常量、保护函数参数、防止成员函数修改对象状态以及防止指

    2024年02月11日
    浏览(41)
  • C++期末考试选择题题库100道&&C++期末判断题的易错知识点复习

    今天备考C++,看到了一些好的复习资料,整合一起给大家分享一下 对于常数据成员,下面描述正确的是 【 B 】 A. 常数据成员必须被初始化,并且不能被修改 B. 常数据成员可以不初始化,并且不能被修改 C. 常数据成员可以不初始化,并且可以被修改 D. 常数据成员必须被初始

    2024年02月10日
    浏览(58)
  • 西安石油大学期末考试C++真题解析

    1、一、类型、返回值类型 二、参数表、函数重载 2、一、实例化 二、实例化的类型或类 类是对象的蓝图,对象是类的实例化 3、const 4、一个 两个 5、一、公有继承 二、私有继承、保护继承 6、抽象类、实例化对象 7、函数模板、类模板 8、try、catch、throw 9、流插入运算符、流

    2024年02月11日
    浏览(47)
  • Java程序设计模拟测试(专用试题)

    Thread类中能运行线程体的方法是B.run( )。start( )方法会启动一个新的线程,init( )方法是构造器的一部分,resume( )方法是恢复一个暂停的线程。 如果要把容器空间分成东、西、南、北、中五个区域,应采用的布局是D.BorderLayout。BorderLayout类可以将容器分为五个区域:EAST,WEST,

    2024年02月04日
    浏览(38)
  • 《C语言程序设计》模拟试题

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1、已知字符’A’的ASCII码值为65,若变量x为char型,以下不能正确判断出x为大写字母的表达式是( )。 A、x = ‘A’ x = ‘Z’ B、!(x = ‘A’ || x = ‘Z’) C、(x + 32) = ‘a’ (x + 32) = ‘z’ D、x = 65 x = 90 2、下列关系表达式中,结果为“假”的是( )。

    2024年02月11日
    浏览(36)
  • Python程序设计期末作品完整版|代码和程序设计文档

    python程序设计作品,希望对您有帮助,希望您的一键三连! 1.爬取数据的意义 富豪榜的出现,体现了人们思想的变化:由保守藏富向正向面对财富的转变;由保守向文明开放(–说明了大众媒体的进步与教育的普及等思想工具的极大地提高);标志着人们对财富对经济正在走向新纪

    2024年02月11日
    浏览(50)
  • Python 程序设计期末大作业

    Python 程序设计期末大作业 学生信息管理系统(Python) 简介:基本信息管理和学生成绩管理。基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,学生成绩管理模块的主要功能有统计课程最高分、最低分和平均分。 一、功能模块: 基

    2024年02月12日
    浏览(50)
  • 【毕业设计】考试刷题小程序 基于微信小程序的考试刷题系统小程序

    💗博主介绍:✌全网粉丝10W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。 👇🏻 精彩专栏 推荐订阅👇🏻 计算机毕业设计精品项目案例-200套 🌟 文末获取源码+数据库+文档 🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编

    2024年04月13日
    浏览(40)
  • 【Python程序设计】——重点题目(期末不挂科)

    课本: 【例3-6】计算分段函数值。 y = { cos ⁡ x + x 2 + 1 ( x 0 ) x x + x ( x ⩾ 0 ) y=left{begin{array}{ll} cos x+sqrt{x^{2}+1} (x 0) \\\\ x sqrt{x+sqrt{x}} (x geqslant 0) end{array}right. y = { cos x + x 2 + 1 ​ x x + x ​ ​ ​ ( x 0 ) ( x ⩾ 0 ) ​ 【例3-7】简化PM 2.5空气质量提醒: 0~35为优,35~75为良,75以

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包