秋招算法岗c++面经

news2024/11/24 13:27:56

目录

1、指针与引用的区别

2.const关键字

3.重载和重写(覆盖)的区别

4.new和malloc的区别(new封装了malloc)

5.static和const的区别 

6. c++三大特性

7.虚函数

8.纯虚函数

 9.虚继承

10. 智能指针

11. 内存泄漏

12.c++的内存分布

13.STL介绍


1、指针与引用的区别

 指针存放的是某个对象的地址,指针本身也有自己的地址,而引用只是一个变量的别名,对引用的改变会直接影响原始值。指针可以重新赋值指向其他的地址,而引用一但初始化就不能改变其目标。指针可以有空值,而引用必须在声明的时候初始化,且不能为空。引用不占用额外的内存,但指针会额外占用,用于存放自己的地址。

2.const关键字

被他修饰的值不能改变,必须在定义的时候赋初值。

常量指针和指针常量

数据类型 const* 指针变量      是常量指针的形式,其指向的地址的值不能改变。

数据类型 *const 指针变量      是指针常量的形式,其指向的地址不能改变。

3.重载和重写(覆盖)的区别

重写一般用于子类继承父类时,重写父类的虚函数方法。override关键字是为了确保父子类的虚函数参数一致,否则弹出错误。

重写方法的参数列表,返回值要与被重写的一致。

静态方法不能被重写为非静态。被重写的方法不能为私有方法。

重载存在于一个类中,方法名称相同,而参数形式不同。

4.new和malloc的区别(new封装了malloc)

new分配内存失败时,会抛出异常,而malloc则是返回NULL。

new申请内存分配时,无需指定大小,而malloc则需要显式的指出。

new/delete支持重载,而malloc/free则不支持。

new/delete会调用对象的构造函数和析构函数,而malloc不会

new从自由存储区上分配内存,malloc从堆上分配

5.static和const的区别 

const修饰的变量,超出其作用域后会被释放,同时在定义时必须初始化,之后无法更改。而static在函数执行之后不会立即释放。static修饰成员函数称为静态成员函数,不依赖于任何实例,可以通过类名直接调用。因为其没有this指针,不能访问非静态成员变量或函数。同时不能声明为virtual,因为虚函数的调用是通过对象的虚函数表来实现的(里面存的指向各个虚函数的指针),而静态成员函数是与类相关联,而不是与类的对象相关联的。

  • static用于声明静态变量和静态函数,它们在内存中只有一份拷贝,与任何对象实例无关。

6. c++三大特性

在类的外部,只能通过对象访问public属性的成员。

继承:可以使用现有类的所有功能,并在无需重新编写原有类的情况下对这些功能进行扩充。

封装:把客观事物抽象成类,并对信息进行分享和隐藏。

多态:允许子类类型的指针赋值给父类类型的指针。重载实现编译多态,虚函数实现运行时多态。实现多态有两种方式,覆盖:子类重新定义父类的虚函数的做法。重载:多个同名函数,参数表不同。

class Base {
public:
    virtual void foo() {
        cout << "Base::foo()" << endl;
    }
};

class Derived : public Base {
public:
    void foo() override {   // 重写了基类的虚函数foo()
        cout << "Derived::foo()" << endl;
    }
};
Base* ptr = new Derived();
ptr->foo();  // 会调用Derived::foo()

7.虚函数

当基类希望派生类定义适合自己的版本,就将这些函数声明成虚函数。虚函数是动态绑定的,基类的指针指向谁的类,查询谁的类的虚函数表,这个机制保证派生类的虚函数被调用到。

虚函数实现多态:调用函数的对象必须是指针或者引用,同时被调用的函数必须是虚函数,且完成了虚函数的重写。

构造函数不能是虚函数,因为构造函数在对象被创建时调用,虚函数需要根据对象的动态类型来确定调用哪个函数版本,对象都没被创建完成,又怎么知道他的类型那。

析构函数可以是虚函数,当这个类作为基类实现多态时,基类指针指向派生类的对象,这时为了析构派生类对象,基类的析构函数必须是虚函数。

内联函数不能为虚函数,因为inline在编译时并不知道对象的类型,而虚函数则需要知道对象的类型才知道调用哪个虚函数,所以没法在编译时进行内联函数展开。这里再讲一下inline函数,他一般写在函数定义和声明的前面,是为了解决一些频繁调用的小函数而大量消耗栈内存的问题。一般用于小的频繁调用的函数体。inline函数只是对编译器的一个建议,如果它感觉函数太大了,也可以不作为内联函数使用。

inline int add(int x, int y); //声明时
inline int add(int x, int y) {
    return x + y;
}//定义时

静态函数也不能成为虚函数,因为静态成员没有this指针,而虚函数一定要通过对象来调用,有隐藏的this指针。

8.纯虚函数

纯虚函数是在基类中声明的,没有具体实现的虚函数,它只提供接口,需要派生类自己实现。使用纯虚函数的类是抽象类,不能实例化。所以派生类必须重写纯虚函数,不然他也是抽象类,不能实例化。

class AbstractBase {
public:
    virtual void pureVirtualFunc() = 0;  // 纯虚函数声明
};

class Derived : public AbstractBase {
public:
    void pureVirtualFunc() override {
        // 派生类提供的纯虚函数实现
    }
};

AbstractBase* ptr = new Derived();
ptr->pureVirtualFunc();  // 调用派生类对象的纯虚函数实现
delete ptr;  // 删除派生类对象

 9.虚继承

虚继承是为了解决多继承时的菱形继承问题,防止出现二义性。

//间接基类A
class A{
protected:
    int m_a;
};

//直接基类B
class B: virtual public A{  //虚继承
protected:
    int m_b;
};

//直接基类C
class C: virtual public A{  //虚继承
protected:
    int m_c;
};

//派生类D
class D: public B, public C{
public:
    void seta(int a){ m_a = a; }  //正确
    void setb(int b){ m_b = b; }  //正确
    void setc(int c){ m_c = c; }  //正确
    void setd(int d){ m_d = d; }  //正确
private:
    int m_d;
};

int main(){
    D d;
    return 0;
}

10. 智能指针

智能指针是为了解决动态分配内存导致内存泄漏和多次释放同一内存所提出的。放在<memory>头文件。包括共享指针,独占指针,弱指针

shared_ptr:是一种引用计数的智能指针,其通过一个计数器来追踪有多少个智能指针共享同一资源,当为计数为0时,释放资源。也就是当没有智能指针指向这个资源时,这个资源会被释放。

#include <memory>

std::shared_ptr<int> ptr1 = std::make_shared<int>(42); //第三种构造方式
std::shared_ptr<int> ptr2 = ptr1; // 共享所有权

'''
这两种不常用
int* a = new int(4);
std::shared_ptr<int> ptr3(a); //第一种构造方式
std::shared_ptr<int> ptr1(new int); //第二种构造方式
'''

 只有ptr1和ptr2都被销毁时,才释放int型资源。

unique_ptr:是一种独占所有权的智能指针,不能与其他共享管理权,也就是不支持普通的拷贝和赋值,当其销毁时,它管理的资源也会销毁。

#include <memory>

std::unique_ptr<int> ptr = std::make_unique<int>(42);

weak_ptr :是为了配合shared_ptr而引入的,像旁观者那样观察资源的使用情况,但它没有共享资源,他的构造不会引起指针引用计数增加。

11. 内存泄漏

堆内存泄露:是指程序中使用malloc和new等从堆中分配一块内存,用完之后忘记用free或delete删除。

系统资源泄露:指程序使用系统分配的资源,但并没有调用相应的函数释放掉,导致系统资源浪费。

没有将基类的析构函数定义为虚函数:当基类的指针指向子类的对象时,如果基类的析构函数不是虚函数,那么子类的析构函数将不会被调用,造成内存泄漏。

如何防止内存泄漏?将内存的分配封装在类中,构造函数分配内存,析构函数释放内存。使用智能指针。

12.c++的内存分布

栈区存放的局部变量和函数的参数值。从高地址到低地址。

堆区存放的动态申请的内存。

全局区存放的全局变量和静态变量。在程序编译时内存就已经分配好了

13.STL介绍

容器:各种数据结构,如pair,vector,list,deque,set,map等。

适配器:queue和stack,他们的底层都是deque实现的。

pair:里面的元素调用a->first, a->second,插入pair时,insert({first, second})或insert(pair<类型,类型>(数据1,数据2));

vector:在堆中分配了一段连续的内存空间。他的扩容是每次翻倍,容量不够就翻倍。capacity永远大于size。底层实现是数组。

操作:push_back,emplace_back,pop_back, clear,

  • insert(position, value):在指定位置插入一个元素。
  • erase(position):移除指定位置的元素。
  • erase(first, last):移除指定范围内的元素

 list:内存空间是不连续,通过指针来进行数据的访问。通常用来随即插入删除操作。是双向链表。

deque:双端队列,由于需要内部跳转,所以随机访问没有vector快。由于deque的迭代器要比vector的复杂,对deque排序时,可以先把deque复制到vector里再排序,再放回deque。操作:push_back,pop_back,push_front,pop_front

stack和queue被称为适配器,底层是deque。操作:push,pop,empty,size。此外队列还有front,back,栈还有top

map和set:底层采用红黑树实现,查找的复杂度为log(n).

unordered_map和unordered_set:底层实现是哈希表,查找复杂度为1

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

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

相关文章

【Web3】认识NFT

NFT&#xff08;非同质化代币&#xff09;在Web3中扮演着重要的角色。Web3是指下一代互联网&#xff0c;它建立在区块链技术之上&#xff0c;旨在实现更加去中心化、透明和用户掌控的互联网。 NFT在Web3的一些重要作用&#xff1a; 唯一性和可证明稀缺性&#xff1a;NFT是一种…

vscode突然不能输入中文句号,怎么办

vscode突然不能输入中文句号&#xff0c;怎么办? 敲代码敲得好好的&#xff0c;突然无论打句号&#xff0c;出来的都是英文的句号&#xff0c;无法打出中文的句号&#xff0c; 让人着实着急。。。 记录一下解决办法&#xff1a; Ctrl 句号&#xff0c;然后再测试一下&…

JavaWeb 速通HTML(常用标签汇总及演示)

目录 一、拾枝杂谈 1.网页组成 : 1 结构 2 表现 3 行为 2.HTML入门 : 1 基本介绍 2.基本结构 : 3.HTML标签 : 1 基本说明 2 注意事项 二、常用标签汇总及演示 1.font标签 : 1 定义 2 演示 2.字符实体 : 1 定义 2 演示 3.标题标签 : 1 定义 2 演示 4. 超链接标签 : 1…

香薰市场分析:天猫香薰销售额近7.2亿,市场增长潜力大

在Z世代崛起的背景下&#xff0c;香薰作为能够调节情绪&#xff0c;提升生活品质的产品&#xff0c;备受市场青睐。作为一种健康、美容、舒缓压力的新兴行业&#xff0c;香薰市场也形成了自己的特色和竞争力&#xff0c;其发展前景十分广阔。 根据鲸参谋电商数据分析平台的相关…

Redis集群主从复制哨兵

环境配置&#xff1a; 一主二从 从机配置 主机查看 真实的主从配置应该在配置文件中配置&#xff0c;才是永久的 没哨兵的情况下&#xff0c;主机断开后。从机不会默认升级为主节点。需要手动配置。主机在启动后。依赖可以正常使用。从机断开后&#xff0c;期间主机写入东西&am…

探索HTML的黑科技:让你的网页变得无与伦比!

文章目录 1. 使用语义化标签2. 嵌套标签正确闭合3. 使用无障碍&#xff08;Accessibility&#xff09;特性4. 利用表单验证5. 使用内联 SVG6. 优化图像加载7. 优化 CSS 和 JavaScript8. 使用响应式设计9. 使用嵌入式视频和音频10. SEO 优化 以下是十个常用的 HTML 技巧&#xf…

SpringBoot整合Redis哨兵模式

文章目录 1、Redis哨兵复习2、整合3、简单举例4、RedisTemplate详解5、补充 1、Redis哨兵复习 Redis哨兵主要有三点作用&#xff1a; 监控&#xff1a;不断检查master和slave是否正常运行通知&#xff1a;当被监控的主从服务器发生问题时&#xff0c;向其他哨兵和客户端发送通…

当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估

第一章 理论基础与研究热点分析 1. 生态系统服务与生态系统服务价值介绍 ​ 2. 生态系统服务价值研究方法 3. 生态系统服务价值研究热点 Citespace文献可视化分析 VOSviewer文献可视化分析 第二章 空间数据来源及预处理 1. 空间数据简介 2. ArcGIS Pro数据采集与分析 数…

直流运算放大器-----四种反馈电路(一)

目录 电压串联负反馈 电路图 计算公式 仿真 电压并联负反馈 电路图 计算公式 仿真 电流串联负反馈 电路图 计算公式 仿真 电流并联负反馈 电路图 计算公式 仿真 电压电流&#xff0c;串联并联反馈区分 电压串联负反馈 电路图 计算公式 仿真 因为是二倍放大&#x…

Spring boot +React集成ChatGPT 智能AI

在这里插入代码片import {Button, Input, Radio,Alert,Modal } from antd; import Marquee from react-fast-marquee; import {ChromeOutlined,WifiOutlined,AimOutlined } from ant-design/icons; import React, {useEffect, useState, useRef} from react; import chatgptPn…

MIT 6.S081 Lab Seven -- 多线程

MIT 6.S081 Lab Seven -- 多线程 引言MultithreadingUthread: switching between threads (moderate)代码解析补充 Using threads (moderate)代码解析 Barrier(moderate)代码解析 引言 本文为 MIT 6.S081 2020 操作系统 实验七解析。 MIT 6.S081课程前置基础参考: 基于RISC-V…

【C++初阶】12. Stack(栈)和Queue(队列)

1. 栈和队列的介绍 栈的介绍 队列的介绍 2. 栈和队列的使用 最小栈 栈的压入、弹出序列 逆波兰表达式求值 拓展&#xff1a;如何从中缀变为后缀 3. 两种设计模式 设计模式目前分为26种&#xff0c;这里就只介绍两种 适配器模式迭代器模式 在日常生活中&#xff0c;我们常…

Vue生态及实践 - Vue Router(1)

目录 路由 Vue-Router Mode Hash Mode HTML5 Mode 代码实操 目标是替换掉原版的vue-router 路由 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。 ——wikipedia Vue-Router 传统web开发路由是后端控制的 随着ajax技术的…

【代理服务器】Squid 反向代理与Nginx缓存代理

目录 一、Squid 反向代理1.1工作机制1.2反向代理实验1.3清空iptables规则&#xff0c;关闭防火墙1.4验证 二、使用Nginx做反向代理缓存服务器三CDN简介3.1什么是CDN3.1CDN工作原理 一、Squid 反向代理 如果 Squid 反向代理服务器中缓存了该请求的资源&#xff0c;则将该请求的…

基于Surprise协同过滤实现短视频推荐

前言 前面一文介绍了通过基础的web项目结构实现简单的内容推荐&#xff0c;与其说那个是推荐不如说是一个排序算法。因为热度计算方式虽然解决了内容的时效质量动态化。但是相对用户而言&#xff0c;大家看到的都是几乎一致的内容&#xff08;不一样也可能只是某时间里某视频的…

准确率 99.9% 的离线IP地址定位库

Ip2region 是一个离线 IP 地址定位库&#xff0c;准确率高达 99.9%&#xff0c;搜索性能为 0.0x 毫秒。DB 文件只有几兆字节&#xff0c;其中存储了所有 IP 地址。 支持 Java、PHP、C、Python、Nodejs、Golang、C#、lua 等查询绑定。查询算法使用二叉树、B树和内存搜索算法。 …

基于Java乡镇篮球队管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

探索小程序的世界(专栏导读、基础理论)

文章导读 一、为什么要学习小程序开发1.1 低门槛1.2 市场需求1.3 创业机会1.4 技术发展趋势 二、专栏导读2.1 实战系列2.2 工具系列2.3 游戏系列2.4 插件系列 三、基础理论3.1 微信小程序简易教程框架组件API工具 开发者工具项目结构 3.2 app.json配置pageswindowtabbar 3.3 Ap…

Android Studio实现内容丰富的安卓自行车租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号105 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

Linux centos7.6下查看下线指定用户(实操)

Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系统…