C++高频面试题总结01
·
前言
一、struct与class的区别
1.默认访问权限
struct:成员默认是public
class:成员默认是private
// struct 成员默认 public
struct Point {
int x; // 默认 public
void print() {} // 默认 public
};
// class 成员默认 private
class Circle {
int radius; // 默认 private
void draw() {} // 默认 private
};
2.默认继承方式
struct:默认public继承
class:默认private继承
class Base {
public:
int a;
protected:
int b;
private:
int c;
};
// struct 默认 public 继承
struct DerivedStruct : Base {
void access() {
a = 1; // 允许:public 继承
b = 2; // 允许:protected 成员仍可访问
// c = 3; // 错误:private 成员不可访问
}
};
// class 默认 private 继承
class DerivedClass : Base {
void access() {
// a = 1; // 错误:private 继承后,public 成员变为 private
b = 2; // 允许:protected 成员仍可访问
// c = 3; // 错误:private 成员不可访问
}
};
3.模板参数
模板参数声明:
模板参数列表中只能用class关键字
template <class T> // 不能用 struct
void print(T value) { cout << value << endl; }
4.总结
| 特性 | struct | class |
| 默认访问权限 | public | private |
| 默认继承方式 | public | private |
| 模板参数声明 | 不支持 | 支持 |
二、define和const的区别
1.主要区别
| 特性 | #define | const |
| 处理阶段 | 预处理阶段(文本替换) | 编译阶段(类型检查) |
| 类型安全 | 无类型检查 | 有类型检查 |
| 内存分配 | 不分配内存 | 分配内存 |
| 调试支持 | 不可调试 | 可调试 |
| 作用域 | 无作用域(全局替换) | 有作用域 |
2.案例
2.1预处理 vs 编译
#define
在预处理阶段进行简单文本替换,编译器看不到宏的定义
#define PI 3.14159
double area = PI * r * r; // 预处理后变为:double area = 3.14159 * r * r;
const
在编译阶段处理,编译器会进行类型检查
const double PI = 3.14159;
double area = PI * r * r; // 编译器会检查 PI 的类型
2.2 类型安全
#define
无类型检查,可能导致意外错误
#define VALUE 100
int arr[VALUE] = {0}; // 合法
// 但如果误用:
float f = VALUE * 0.5; // 预处理后:float f = 100 * 0.5;(可能不符合预期)
const
有类型检查,更安全
const int VALUE = 100;
float f = VALUE * 0.5; // 编译器会确保类型匹配
2.3 内存分配
#define
不分配内存,只进行文本替换
#define MAX 100
// 预处理后,所有 MAX 被替换为 100,没有内存占用
const
分配内存
const int MAX = 100;
// 编译器会在内存中存储 MAX 的值
2.4 调试支持
#define
宏在预处理后消失,调试时,看不到宏名
#define VERSION "1.0"
// 调试时只能看到字符串 "1.0",看不到 VERSION
const
符号表中有记录,调试时可查看变量名
const char* VERSION = "1.0";
// 调试时可以看到 VERSION 变量
3.总结
const 更安全
#define仅用于预处理需求(如条件编译)
更多推荐

所有评论(0)