常量指针和指针常量的区别是什么?
区别就在与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 的作用是什么?
用来声明 类构造函数是显示的被调用,而非隐式调用,可以阻止调用构造函数时进行隐式转换。
为什么一般将析构函数设置为虚函数?
- 当基类的析构函数不是虚函数时
cpp
~Shape() {
cout << "Shape destroyed" << endl;
} // ❌ 非虚析构函数!
main()函数中:
Shape* shape1 = new Circle(); // 基类指针指向派生类对象
delete shape1; // 危险操作!
delete shape1 直接 调用~shape
- 当基类的析构函数是虚函数时
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 存在,但实现在别处
}
标准库中则是std::cout的定义
cpp
// libstdc++.so 中的实际实现(简化概念)
namespace std {
ostream cout; // 真正的定义和实现
// 包含 cout.operator<< 的具体实现代码
// 包含字符缓冲、系统调用等复杂逻辑
}
C++中的多态怎么实现的?
是通过继承和虚函数来实现的!
首先Base1 *p = new Derive(),通过基类指针操作派生类对象,这是多态最重要的特点。
其次 我们来拆解这段代码。

- shape1被函数的参数接收。
- shape1指向Circle对象。 (重点)此时不是shape的对象!是circle对象
- Circle对象中有虚函数表指针,再才是Circle特有数据
- 函数中shape->draw()是 虚函数表中的draw( )函数,把基类的覆盖掉了。
什么是虚函数?什么是纯虚函数?
含有纯虚函数的类被称为抽象类。抽象类不能被实例化,只能作为接口使用。这个类只是一个算法的骨架,延迟在其派生类中实现!
Base1 *p = new Derive()的含义?
不是基类指针 指向 派生类实例
而是基类指针 操作 派生类实列。
那为什么要用 基类指针 操作 派生类实列?不用 派生类指针 呢?
因为 基类指针是"万能接口" ,可以访问各式各样的派生类