C++面经

本文详细探讨了C++中引用与指针的区别,new和malloc内存管理,TCP客户端服务端通信,数组链表对比,以及TCP/UDP协议特性。深入理解了多态概念,包括静态与动态多态,纯虚函数、抽象类和虚析构。同时涵盖了二叉树性质、SQL查询和各种编程技术应用实例。
摘要由CSDN通过智能技术生成

C++面经

1 .引用和指针的区别

1. 指针和引用的定义和性质的区别:

(1)指针:指针是一个变量,变量存储的是一个地址,指向内存的一个存储单元;

​ 引用:和原来的变量本质上是同一个东西,只不过是给变量取别名

​ int a = 1; *p = &a; 该指针变量指向a的存储单元,即p的值是a存储单元的地址

​ int a = 1; int &b =a; 整形a和引用b事实上是同一个东西,在内存中占同一个存储单元

(2)引用不能为空,创建时必须初始化;指针可以是空值,在任何时候被初始化

(3)指针的值在初始化之后可以改变,即指向其他的存储单元;引用在初始化之后就不会改变

(4)可以有const指针,没有const引用

(5)指针可以有多级,但引用只能有一级

(6)“sizeof引用”得到的是所指向的变量(对象)的大小

​ “sizeof指针”得到的是指针本身的大小

  • 引用传递,不会为形参分配内存空间,形参只是实参的别名,形参的改变会影响实参的值,函数调用结束后形参不会被释放

  • 地址传递,形参为指针变量,将实参的地址传递给函数,可以在函数中改变实参的值,调用时为形参指针变量分配内存,结束时释放指针变量

2.new和malloc的区别

  1. new/delete是关键字,需要编译器的支持;malloc/free是函数,需要包含头文件;
  2. new和malloc都是在堆上开辟内存空间。new申请内存分配时无需指定内存块的大小,编译器会根据信息类型自动计算;malloc需要显示地指出所需内存的尺寸
  3. new申请内存分配成功后,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转化

​ malloc申请内存分配成功后返回的是void *,需要通过强制类型转换成我们需要的类型

  1. new内存分配失败后,抛出bac_alloc异常,malloc内存分配失败返回NULL

  2. new会先调用operator new函数,申请足够的内存空间,然后调用构造函数初始化成员变量,最后返回对象类型的指针。delete先调用析构函数,然后调用operator delete 释放内存。

    malloc/free是库函数,只能动态的申请和释放内存

  3. new/delete操作符能够重载,malloc不能重载

  4. new在自由存储区上为对象动态分配内存空间,malloc从对上动态分配内存空间

3.Tcp客户端与服务端的通信

  • 客户端调用connect函数,触发连接请求,向服务器发送一个SYN J包,这时connect进入阻塞
  • 服务器监听到连接请求之后,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞
  • 客户端收到服务器的SYN K ,ACK J+1,这时connect返回,并对SYN K进行确认;服务器接收到ACK K+1时,accept返回,三次握手完毕。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgkZqX0E-1605539712955)(C:\Users\52675\AppData\Roaming\Typora\typora-user-images\image-20201115214807972.png)]

服务端先初始化socket,然后与端口绑定,并对端口进行监听,然后调用accept函数阻塞等待客户端的连接。如果有客户端初始化socket,连接到服务器。如果连接成功,客户端与服务器的连接就建立了。客户端向服务器发送数据请求,服务器接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据之后,关闭连接,一次交互就完成了。

4. 数组和链表的区别

区别一:物理地址存储的连续性

数组元素在内存中是连续存放的

链表元素在内存中是非连续的

区别二:访问速度

数组的访问速度很快,因为数组可以根据下标进行快速定位

链表的访问速度很慢,因为链表访问数据需要移动指针

区别三:添加、删减元素速度
数组元素的增删速度很慢,因为需要移动大量数据

链表元素的增删速度很快,因为只需要修改指针

5.TCP和UDP的区别

  • TCP是面向连接的,UDP是面向无连接的
  • UDP结构比较简单
  • TCP是面向字节流的,UDP是基于数据报的
  • TCP保证数据正确性,UDP可能丢包
  • TCP保证数据顺序,UDP不保证

6.多态(函数名有多种形态表现出来)

6.1 多态的基本概念

多态分为两类

  • 静态多态:函数重载运算符重载属于静态多态,复用函数名
  • 动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态的区别:

  • 静态多态的函数地址早绑定 - 编译阶段确定函数地址
  • 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
#include <iostream>
using namespace std;

//多态

//动物类
class Animal
{
public:
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}

};
//猫类
class Cat:public Animal
{
public:
	void speak()
	{
		cout << "小猫在说话" << endl;
	}
};

//狗类
class Dog :public Animal
{
public:
	void speak()
	{
		cout << "小狗在说话" << endl;
	}
};

//执行说话的函数
//地址早绑定 在编译阶段确定函数地址
//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,也就是地址晚绑定
void doSpeak(Animal & animal) //Animal & animal = cat;
{						      //父类的引用指向子类对象
	animal.speak();
}

void test()
{
	Cat cat;
	doSpeak(cat);

	Dog dog;
	doSpeak(dog);
}

int main()
{
	test();
	system("pause");
	return 0;
}

动态多态的满足条件:

  1. 有继承关系
  2. 子类重写父类的虚函数

动态多态的使用条件:

  1. 父类的指针或者引用指向子类的对象

**重写:**函数返回值类型 函数名 参数列表 完全相同

Animal类内部结构     vfptr - 虚函数指针
 vfptr				v - virtual
    |				f - function
    |				ptr - poniter
    |       	   vftable - 虚函数表 
	|				v - virtual
  vftable	  		f - funciton
    				table - table
//虚函数指针指向虚函数表
//表的内部记录虚函数的地址
    
Cat 类内部结构   
//当子类重写父类的虚函数时
//子类中的虚函数表 内部 会替换成 子类的虚函数地址

父类指针或引用指向子类对象时,发生多态     

6.2纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要是调用子类重写的内容

因为可以将虚函数改为纯虚函数

当类中有了纯虚函数,这个类也叫***抽象类***

抽象类:

  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
#include <iostream>
using namespace std;

//纯虚函数和抽象类

class Base
{
public:
	//纯虚函数
	//只要有一个纯虚函数,这个类也称为抽象类
	//抽象类特点:
	//1.无法实例化对象
	//2.子类必须重写父类中的纯虚函数,否则也属于抽象类
	virtual void func() = 0;

};

class Son :public Base
{
public:
	virtual void func()
	{
		cout << "func()函数调用这里是子类!" << endl;
	}

};

void test()
{
	//Son s;//子类必须重写父类中的纯虚函数,否则无法实例化对象
	Base * base = new Son;
	base->func();
}

int main()
{
	test();
	system("pause");
	return 0;
}

6.3 虚析构和纯虚析构

多态使用时,如果子类中有属性开辟在堆区,那么父类指针在释放时无法调用到子类的析构函数

解决方式:将父类中的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构共性:

  • 可以解决父类指针释放子类对象
  • 都需要具体的函数实现

虚析构和纯虚析构的区别:

  • 如果是纯虚析构, 该类属于抽象类,无法实例化对象
#include <iostream>
#include <string>
using namespace std;

//虚析构和纯虚析构

class Animal
{
public:
	Animal()
	{
		cout << "Animal的构造函数调用" << endl;
	}
	virtual void speak() = 0;

	//利用虚析构可以解决 父类指针释放子类对象不干净的问题
	//virtual ~Animal()
	//{
	//
	//	cout << "Animal的虚析构函数调用" << endl;
	//}

	//纯虚析构 需要声明也需要实现
	//有了纯虚析构之后,这个类也属于抽象类,不法实例化对象
	virtual ~Animal() = 0;
};

Animal::~Animal()
{
	cout << "Animal的纯虚析构" << endl;
}

class Cat :public Animal
{
public:
	Cat(string name)
	{
		cout << "Cat构造函数" << endl;
		m_Name = new string(name);
	}
	virtual void speak()
	{
		cout << *m_Name << "小猫在说话" << endl;
	}
	~Cat()
	{
		if (m_Name != NULL)
		{
			cout << "Cat的析构函数调用" << endl;
			delete m_Name;
			m_Name = NULL;
		}
	}
	string *m_Name;

};


void test()
{
	Animal * animal = new Cat("Tom");
	animal->speak();
	delete animal;
}

int main()
{
	test();
	system("pause");
	return 0;
}

总结:

  1. 虚析构或者纯虚析构都是用来解决父类指针释放子类对象
  2. 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构
  3. 拥有纯虚析构函数的类也属于抽象类

7.二叉树的性质

  1. 在二叉树的第i层至多有2(i-1)个结点
  2. 深度为k的二叉树至多有2(i)-1个结点\
  3. 对于任何一棵二叉树,如果其终端结点为n0,度为2的结点数为n2
  4. 具有n个结点的完全二叉树深度为[log2n]+1

8.SQL多表查询

SELECT table_a.id,table_a.name,table_a.time as time,COUNT(table_b.time) AS count
FROM table_a
LEFT JOIN table_b
on table_a.time = table_b.time
GROUP BY table_b.time
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值