首页 > 编程语言 >C++—八股文总结(25秋招期间一直更新)

C++—八股文总结(25秋招期间一直更新)

时间:2024-08-22 20:28:00浏览次数:12  
标签:25 const 函数 常量 int C++ cast 秋招 指针

1、const

1.1 指针常量和常量指针

说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点。
const int *a==int const *a;  //可以通过 a 访问整数值,但不能通过 a 修改该整数的值,指针本身是可变的,可以指向不同的整数
const int a;  //a变量变成常量,不可修改
int *const a;  //a的值可以更改,但是指向它的指针不能更改
int const *const a;  //a本身和指向它的指针都不能更改

1.2 const成员函数

常函数内不能修改成员变量
对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

1.3 const和#define的区别

1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。
而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
(2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
(3)#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
(4)#define定义的常量不分配内存,而const定义的常量会分配在常量存储区中。

具体可看以下博客7.5小节

C++入门基础(二)_c语言最小体重-CSDN博客文章浏览阅读387次。初学C++,每周更新自己所学!_c语言最小体重https://blog.csdn.net/qq_56896418/article/details/127675418?spm=1001.2014.3001.5502

2、 虚函数

2.1 作用

父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

2.2 实现

每个虚函数都会有一个与之对应的虚函数表,该虚函数表的实质是一个指针数组,存放的是每一个对象的虚函数入口地址。对于一个子类来说,他会继承父类的虚函数表同时增加自己的虚函数入口地址,如果子类重写了基类的虚函数的话,那么继承过来的虚函数入口地址将被子类的重写虚函数入口地址替代。那么在程序运行时会发生动态绑定,将父类指针绑定到实例化的对象实现多态。每个类只有一个虚函数表,虚函数表是在编译的时候就确定的了。

2.3 纯虚函数

用户不能创建基类的实例,只能创建派生类的实例

2.4 虚函数调用时机

虚函数在运行时根据实际对象的类型来确定调用哪个函数,而不是根据指针或引用的类型来确定。当一个虚函数被定义为类的成员函数时,它会被标记为虚函数。在调用虚函数时,程序会查找该函数的实际类型,并在运行时调用该类型的实现。这就允许程序在运行时动态地选择执行哪个版本的虚函数,从而实现多态性。虚函数通常与父类指针或引用一起使用,可以实现父类指针或引用调用子类的函数。

2.5 大小

虚函数表是一个存储虚函数指针的数组,每个类有一个虚函数表,每个对象有一个指向虚函数表的指针。虚函数表的大小取决于类中有多少个虚函数,而对象中的虚函数表指针的大小取决于编译器和操作系统。一般来说,在32位系统下,指针占4个字节,在64位系统下,指针占8个字节。

2.6 C++哪些函数不能定义为虚函数

构造函数:构造函数不能被声明为虚函数。因为构造函数是用来创建对象的,而虚函数是根据对象的类型来动态调用的。如果构造函数是虚函数,那么在创建对象时就无法确定调用哪个版本的构造函数,会导致逻辑错误
友元函数:友元函数实际上并不属于类的成员函数,所以不能被定义为虚函数
普通函数:普通函数只能被重载,不能被重写。

2.7 为什么虚函数不能是模版函数

因为模板函数在编译时会被实例化为多个不同的函数,而虚函数需要在运行时才能确定调用哪个函数。在C++中,虚函数的实现依赖于虚函数表(vtable)和虚函数指针(vptr),而这些在编译时就需要确定下来。因此,虚函数不能是模板函数。

2.8 虚函数表既然希望类的所有对象共享为什么不放在全局区

虚函数表不能放在全局区,因为全局区是存放全局变量和静态变量的,而虚函数表不是变量,而是一组指向类成员函数的指针。如果放在全局区,会导致内存浪费和混乱。
混乱:虚函数表是在编译期就确定了大小和内容的,而全局区是在运行期才分配空间的。如果把虚函数表放在全局区,就需要在运行期动态地为每个类分配空间,并且要保证不同类之间不会发生冲突。这样就增加了程序的复杂度和出错的可能性。

C++核心编程-4、类和对象4—多态-CSDN博客文章浏览阅读287次。【代码】C++核心编程-4、类和对象4—多态。https://blog.csdn.net/qq_56896418/article/details/140632373?spm=1001.2014.3001.5502

3、菱形继承

菱形继承(Diamond Inheritance)是一种多重继承的情况,其中一个子类同时继承自两个直接或间接共同父类,而这两个父类又继承自同一个共同的父类。这样就形成了一种菱形的继承结构,因此称为"菱形继承"。
解决方法:虚继承,出现二义性通过添加作用域解决,而继承爷爷类的数据有两份,通过虚继承解决。

具体看博主下面这篇博客的菱形继承部分。
C++核心编程-4、类和对象3—继承-CSDN博客文章浏览阅读237次,点赞9次,收藏3次。在Son3中已经变为了私有,即使孙子类公共继承,依然不不能访问,仍是私有权限。然后我们采用VS自带的工具进行验证:Vs的开发人员命令提示符。https://blog.csdn.net/qq_56896418/article/details/140590494?spm=1001.2014.3001.5502

4、类型转换

4.1 static_cast

static_cast 用于执行非多态类型之间的类型转换,例如整型和浮点型之间的转换、基类和派生类之间的指针或引用转换、void 指针和其他指针类型之间的转换等。该转换在编译时完成,通常不会检查运行时错误。

4.2 dynamic_cast

dynamic_cast 用于在运行时进行多态类型的转换。它通常用于将基类指针或引用转换为派生类指针或引用,以及在类层次结构中进行下行转换

4.3 dynamic_cast与虚函数的区别

功能:虚函数: 实现运行时多态性,使得可以在基类指针或引用中调用派生类的方法。
dynamic_cast: 用于类型安全的向下转型或交叉转型,确保转换成功与否。
实现方式:虚函数: 通过虚表(vtable)机制实现动态绑定。
dynamic_cast: 依赖于运行时类型识别(RTTI)来安全地转换类型。
使用场景:虚函数: 用于实现和利用多态性。
dynamic_cast: 用于在复杂的类层次结构中进行安全的类型转换。

4.4 reinterpret_cast

reinterpret_cast 用于在不同的指针类型之间进行转换,**例如将一个指针转换为一个整数,或将一个整数转换为一个指针。**该转换通常不进行类型检查,因此潜在地不安全,只应在极少数特殊情况下使用。

4.5 const_cast

const_cast 用于在去除变量的 const 修饰符或 volatile 修饰符时使用。它可以将指向常量对象的指针或引用转换为指向非常量对象的指针或引用,或者将指向非常量对象的指针或引用转换为指向常量对象的指针或引用。

4.6 volatile关键字

在 C++ 中,关键字 volatile 用于声明一个变量是易变的(volatile variable),即该变量可能会在程序中的任意时刻被意外地改变。这意味着,当读取一个易变的变量时,编译器不会从缓存中读取该变量的值,而是每次都会从内存中重新读取该变量的值。同样地,当写入一个易变的变量时,编译器也不会将该变量的值存储在缓存中,而是立即将该变量的值写入内存中。

5、构造函数

标签:25,const,函数,常量,int,C++,cast,秋招,指针
From: https://blog.csdn.net/qq_56896418/article/details/141432313

相关文章

  • 从零开始学习C++之if判断语句
    当你想判断某个条件时,怎么办呢?当当当当(日常发疯),if语句就派上用场了。使用方法不多废话,使用格式如下:if(条件){ 代码}elseif(条件){ 代码}else{ 代码}注:elseif/else可以没有。这几个条件中只能满足一个。例:if(n==1){ cout<<1;}elseif(n==1)......
  • PCIe学习笔记(25)
    数据完整性PCIExpress的基本数据可靠性机制包含在数据链路层(dataLinkLayer)中,它使用32位的LCRC(CRC)码逐链路检测TLP中的错误,并采用逐链路重传机制进行错误恢复。TLP是一个数据和事务控制单元,由位于PCIExpress域“边缘”的数据源(如Endpoint或RootComplex)创建,可能通过......
  • sqli-labs靶场通关攻略 21-25
    主页有sqli-labs靶场通关攻略1-20第二一关less-21步骤一:输入Username:adminPassword:admin利用Burpsutie进行抓包步骤二:在Cookie后输入'报错,判断闭合方式为')#对所写代码进行如下操作:选中右击->Convertselection->Base64->Base64-encode步骤三:判断列数')order......
  • C/C++语言基础--指针三大专题详解3,完结篇(包括指针做函数参数,函数指针,回调函数,左右法
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是三,完结篇,介绍了指针做函数参数,函数指针,回调函数,左右法则解决复......
  • C++好用的特性以及STL
    C++中基于范围的for循环程序的基本结构包括三种:顺序结构,选择结构(也称分支结构)和循环结构(也称程序的基本控制结构包括三种:顺序结构、选择结重复结构)。循环结构的实现方法比较多,除了使用while()、dowhile()和for()循环之外,C++11还提供了一种称为基于范围(Rane-based)的fo......
  • 从零开始学习C++之变量
    变量没啥好讲的,讲下类型和格式得了。变量类型:int:整数类型;范围大约为\(-2147000000\sim2147000000\)。longlong:长整型;范围大约是\(-2^{63}\sim2^{63}-1\)。unsignedint/longlong:不包括负数,整数范围扩大一倍。double:小数类型(比float进度高),大约能包含\(1......
  • C++异常处理详解
    目录一、异常处理的基本概念1.1例外类型1.2异常处理流程二、C++异常处理的语法2.1抛出异常2.2捕获异常三、示例代码示例:简单的除法操作3.1代码解析四、注意事项五、小结        异常处理是程序的一种控制结构,用于处理在程序执行期间可能出现的错误......
  • 从零开始学习C++之循环
    本文讲解C++中循环的使用。C++中较常用的两种循环为for循环和while循环。for循环for循环主要用于实现两个区间中间的枚举。例如:从\(1\sim100\)中输出所有数就能使用for循环解决。这是for循环标准格式:/*for(变量类型变量名=左区间;循环退出条件(如:i<=......
  • C++ const的用法详解
    前言const在C/C++中是十分重要的,如果单纯理解为"常量"那么你的格局就小了,今天在这里给大家介绍一下const在C++中具体详细的用法。一const的基本概念const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的......
  • [小白入门]一文掌握C/C++中数组和循环结合(堵车问题、红绿灯问题)
    1.堵车问题假如现在给定从出发地到目的地的道路条数和每条路上的车辆情况为:第一条路第二条路第三条路第四条路第五条路第六条路90705278108120且车辆数大于50为轻度拥堵;大于70为中度拥堵;大于90为重度拥堵。那么如何存储这些数据?---很显然要用数......