前言

本教程旨在提取最精炼、实用的C++面试知识点,供读者快速学习及本人查阅复习所用。本文配套精简版本《C++面试宝典》已整理,免费领取地址:https://pan.quark.cn/s/c991f40d40a7

一、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仅用于预处理需求(如条件编译)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐