C++面经|小林coding|(1)

常量指针和指针常量的区别是什么?

区别就在与const常量这个概念到底是修饰谁的

首先,有一个概念,const常量就是不能修改的量

常量指针

cpp 复制代码
const int * p;
int const * p;

const int c_var = 8;
const int *p = &c_var; 
*p = 6 ; 错误


const修饰的就是int,也就是c_var的值8。这个值不能改

指针常量

cpp 复制代码
const int var;
int * const c_p = &var;
const修饰的是c_p,也就是整个c_P,是&var。不能指向别的地址

.

.

.

函数指针和指针函数的区别是什么?

函数指针落脚点是指针。指向一个函数的指针

cpp 复制代码
int fun1(int temp1,int temp 2)
{
}

int (*fun)(int x,int y);
fun = fun1;

指针函数落脚点是函数。返回值是指针的函数(因为并不常见,所以赐名)

.

.

.

参数传递时,值传递、引用传递、指针传递的区别?

函数调用时,会触发传值,传地址(传指针),传引用。

传值会触发 拷贝构造,会造成巨大浪费。传引用就不会。

cpp 复制代码
class Person {
public:
    string name;
    int age;
};

void printPerson(Person p) {
		
}

int main()
{
	Person alice;
	 printPersone(alice); // 触发拷贝构造!而且因为是进行了大型对象的拷贝,造成了巨额的额外开销,不如引用。
}

C++全局变量、局部变量、静态全局变量、静态局部变量的区别?

我们从作用域的角度区别。

首先,静态static关键字的作用就是 修饰过的变量具有文件作用域。就是在整个文件中不会死。
全局变量、局部变量、静态全局变量、静态局部变量的区别

.

.

.

全局变量定义在头文件中有什么问题?

需要用到extern关键字。

cpp 复制代码
extern int a = 666;//只声明,不定义

sizeof(1==1) 在 C 和 C++ 中分别是什么结果?

c中没有内置的bool类型,用int型的1表示true,0表示false;

c++中内置了bool类型,sizeof(bool)为1;

C 和 C++ struct 的区别?

c++中的struct是"抽象"数据类型

这个抽象不是指"难以理解",而是通过"隐藏(private)/暴露(public)成员变量或者成员函数"

C++ 中 struct和Class区别是什么?

巧计:struct()死dr科特 这个人是开放的 是pubilic 所以对象都可以访问。

struct 和 union 的区别是什么?

union是在{ }中挑一个需要的数据类型

计算union的size 1.必须是最大那个数据类型的倍数 2.如果我从中挑了一个数据结构,那么size必须比它大

struct的size 1.内存对齐原则 2.VS中默认的对⻬数为8(必须是8的倍数)

define 和 typedef 的区别是什么?

define用作定义常量

cpp 复制代码
#define PI 3.1415926
#define MAX_SIZE 100

用作定义宏函数

cpp 复制代码
#define SQUARE(x) ((x) * (x))
#define MAX(a,b) ((a) > (b) ? (a) : (b))

typedef则是类型重定义

void*是什么?为什么它不能直接进行解引用操作?

它是 '无指针类型'(不是空指针类型)

因为不知道它的数据类型,就不好解引用

explicit 的作用是什么?

用来声明 类构造函数是显示的被调用,而非隐式调用,可以阻止调用构造函数时进行隐式转换。

为什么一般将析构函数设置为虚函数?

  1. 当基类的析构函数不是虚函数时
cpp 复制代码
 ~Shape() {
  cout << "Shape destroyed" << endl; 
  }  // ❌ 非虚析构函数!


	 main()函数中:
	 Shape* shape1 = new Circle();  // 基类指针指向派生类对象
 	 delete shape1;                 // 危险操作!

delete shape1 直接 调用~shape

  1. 当基类的析构函数是虚函数时
cpp 复制代码
virtual ~Shape() {
 		cout << "Shape destroyed" << endl; 
 }  // ✅ 虚析构函数

delete shape1 会先在circle的虚函数表中 &Circle::~Circle(),再调用 ~shape().

Shape虚函数表:

┌─────────────────┐

│ &Shape::~Shape() │ ← 虚析构函数地址

│ &Shape::draw() │

└─────────────────┘

Circle虚函数表:

┌─────────────────┐

│ &Circle::~Circle()│ ← 覆盖了基类析构函数

│ &Circle::draw() │

└─────────────────┘

为什么构造函数不写为虚函数?

只需牢记一点基类的构造函数不用写虚函数,析构函数需要

硬记住即可!!!

C++的编译过程介绍一下?

源码

预处理(单纯文本替换,将 cout 的声明插入源码)

链接

汇编

链接

静态链接库和动态链接库有什么区别?

静态链接库在链接时,会被完整链接到可执行文件中

动态链接库在链接时,有OS的帮忙,会挑选有用链接到可执行文件中。

头文件与标准库的区别?

头文件#include

头文件iostream中只有std::cout的声明

cpp 复制代码
// iostream 头文件内容(简化版)
namespace std {
    extern ostream cout;  // 这只是声明!
    // 告诉编译器:cout 存在,但实现在别处
}

标准库libstdc++.so

标准库中则是std::cout的定义

cpp 复制代码
// libstdc++.so 中的实际实现(简化概念)
namespace std {
    ostream cout;  // 真正的定义和实现
    
    // 包含 cout.operator<< 的具体实现代码
    // 包含字符缓冲、系统调用等复杂逻辑
}

C++中的多态怎么实现的?

是通过继承和虚函数来实现的!

首先Base1 *p = new Derive(),通过基类指针操作派生类对象,这是多态最重要的特点。

其次 我们来拆解这段代码。

  1. shape1被函数的参数接收。
  2. shape1指向Circle对象。 (重点)此时不是shape的对象!是circle对象
  3. Circle对象中有虚函数表指针,再才是Circle特有数据
  4. 函数中shape->draw()是 虚函数表中的draw( )函数,把基类的覆盖掉了。

什么是虚函数?什么是纯虚函数?

含有纯虚函数的类被称为抽象类。抽象类不能被实例化,只能作为接口使用。这个类只是一个算法的骨架,延迟在其派生类中实现!

Base1 *p = new Derive()的含义?

不是基类指针 指向 派生类实例

而是基类指针 操作 派生类实列。

那为什么要用 基类指针 操作 派生类实列?不用 派生类指针 呢?

因为 ​基类指针是"万能接口" ,可以访问各式各样的派生类

相关推荐
HY小海2 小时前
【C++】map和set的使用
开发语言·c++
我是Feri2 小时前
机器学习之线性回归下的数据预处理:数据清洗的艺术(食材筛选指南)
开发语言·python·机器学习
进击的圆儿2 小时前
【学习笔记02】C++面向对象编程核心技术详解
c++·笔记·学习
卷Java2 小时前
预约记录关联查询接口说明
java·开发语言·spring boot·python·微信小程序
byte轻骑兵3 小时前
Windows 安全分割利器:strtok_s () 详解
c语言·开发语言·windows·安全
ajassi20003 小时前
开源 C++ QT QML 开发(七)自定义控件--仪表盘
c++·qt·开源
奔跑吧邓邓子3 小时前
【C++实战(71)】解锁C++音视频开发:FFmpeg从入门到实战
c++·ffmpeg·实战·音视频
geilip3 小时前
知识体系_scala_利用scala和spark构建数据应用
开发语言·spark·scala
笑口常开xpr4 小时前
【c++】面 向 对 象 与 抽 象 数 据 类 型
开发语言·c++·抽象数据类型