)
本篇核心知识预处理指令、宏定义、条件编译、文件包含、C 面向对象、类与对象、访问权限、成员函数、this 指针、const 成员、头文件管理、内联函数、封装特性一、预处理指令编译前执行概念预处理指令以#开头编译前执行不生成机器码只做文本替换、文件包含、条件控制。特性预处理时机编译之前语法检查之前直接替换文本。三大核心指令#define、#include、条件编译。1#define 宏定义概念用名字替换固定文本分无参宏、带参宏仅替换、无类型、无语法检查。特性无参宏#define 宏名 替换内容纯文本替换末尾不加分号。可定义常量、关键字、代码片段。带参宏#define 宏名(参数) 表达式仅替换不是函数无类型检查、执行更快。表达式建议加括号防优先级错误。多行宏末尾用\换行不可空格。宏 undef#undef 宏名取消宏定义。代码示例// 无参宏 #define MAX 100 #define PI 3.14159 #define PRINT_HELLO cout Hello\n // 带参宏加括号防错 #define SQR(x) ((x)*(x)) #define MAX2(a,b) ((a)(b)?(a):(b)) // 多行宏 #define PRINT_INFO() \ cout 姓名张三\n; \ cout 年龄20\n int main() { int a SQR(5); // 替换为((5)*(5)) PRINT_HELLO; PRINT_INFO(); return 0; }2#include 文件包含概念将头文件内容完整复制到当前位置实现代码复用。特性#include 文件名优先查系统库目录用于系统头文件。#include 文件名先查当前项目目录再查系统目录用于自定义头文件。重复包含问题同一头文件多次包含会报错需加保护。代码示例// 系统头文件 #include iostream // 自定义头文件 #include myhead.h3条件编译概念按条件选择性编译代码常用于调试、版本控制、跨平台、防重复包含。特性#if / #elif / #else / #endif按常量表达式判断。#ifdef如果宏已定义。#ifndef如果宏未定义。#endif结束条件块必须配对。防重复包含#ifndef HEAD_H #define HEAD_H // 头文件内容 #endif // 或简化#pragma onceVS支持代码示例#define DEBUG // 调试模式输出 #ifdef DEBUG cout 调试变量值 10 endl; #else cout 发布模式 endl; #endif // 版本控制 #define VERSION 2 #if VERSION 1 cout V1.0 endl; #elif VERSION 2 cout V2.0 endl; #else cout 未知版本 endl; #endif拓展宏与函数区别宏编译前替换、无类型、速度快、无栈开销、易出错。函数编译后调用、有类型、有栈开销、安全、可调试。二、C 面向对象OOP基础概念面向对象以类模板和对象实例为核心将数据和行为封装模拟现实实体具备封装、继承、多态、抽象几大特性。特性面向对象 vs 面向过程面向过程关注步骤、函数、流程适合简单程序。面向对象关注实体、属性、行为适合复杂项目、易维护复用。四大特性封装隐藏内部细节暴露安全接口保证数据安全。继承子类复用父类代码扩展功能减少冗余。多态同一接口不同实现灵活扩展。抽象提取核心属性 / 行为忽略无关细节。代码示例// 面向对象定义人类类 class Person { // 属性成员变量私有 char name[20]; int age; public: // 行为成员函数公有 void init(const char* n, int a) { strcpy(name, n); age a; } void show() { cout 姓名 name 年龄 age endl; } }; // 创建对象实例 int main() { Person p1; p1.init(张三, 20); p1.show(); return 0; }三、类的定义与结构概念类是自定义复合类型描述一组对象共同的属性和行为。特性类的组成成员变量属性描述对象状态。成员函数行为描述对象操作。访问权限控制成员访问范围。定义格式class 类名 { // 访问权限 成员变量; 成员函数声明; }; // 末尾必须加分号对象定义类名 对象名;分配独立内存。代码示例// 类定义 class Student { private: // 私有成员变量 int id; double score; public: // 成员函数声明 void setInfo(int i, double s); void showInfo(); }; // 定义对象 Student s1, s2;四、访问权限控制封装核心概念控制类成员的可见范围实现数据隐藏、安全访问。特性public公有任意位置类内、外、子类可访问用于接口。protected保护类内、子类可访问外部不可用于继承。private私有仅类内可访问外部、子类不可用于隐藏数据。默认权限class默认 privatestruct默认 public。代码示例class Person { private: int age; // 私有外部不可直接访问 protected: char gender; // 保护子类可访问 public: char name; // 公有任意访问 void setAge(int a) { age a; } // 公有接口 }; int main() { Person p; p.name 李四; // 合法公有 // p.age 25; // 非法私有 p.setAge(25); // 合法通过接口 return 0; }拓展权限设计原则数据成员默认 private通过 public 接口访问修改保证数据安全。五、成员函数定义与实现概念类中描述对象行为的函数分内部实现、外部实现。特性内部实现直接写在类内默认内联函数编译时展开无调用开销。外部实现类内声明、类外定义需加作用域符::格式返回值 类名::函数名(参数) { 函数体 }内联函数inline修饰空间换时间适合短小高频函数。代码示例class Student { private: int id; public: // 内部实现默认内联 inline void setId(int i) { id i; } // 外部声明 void showId(); }; // 外部实现加:: void Student::showId() { cout 学号 id endl; }拓展内联函数注意禁止递归、复杂循环编译器可能忽略inline。六、this 指针概念类成员函数的隐藏常量指针指向当前调用对象区分不同对象成员。特性类型类名* const指向不可改值可改。作用区分成员变量与局部 / 形参同名冲突。返回当前对象链式调用。使用this-成员名访问成员。代码示例class Person { private: int age; public: void setAge(int age) { // this-age成员变量age形参 this-age age; } Person getSelf() { return *this; // 返回当前对象 } };拓展this 不能用于静态成员函数无对象七、const 成员只读保护概念用const修饰成员变量、成员函数、对象禁止修改保证数据只读。特性const 成员变量类内只读必须初始化构造函数初始化列表。const 成员函数格式返回值 函数名() const禁止修改成员变量只能调用 const 函数。const 对象const 类名 对象只能调用 const 成员函数,不可调用非 const 成员函数。普通对象无 const既能调用 普通函数也能调用 const 成员函数优先调用非 const 版本。代码示例class Test { public: int num 10; // const 成员函数 void show() const { cout const 函数 num endl; } // 非 const 成员函数 void show() { cout 非 const 函数 num endl; } }; int main() { // 1. 普通对象无const Test obj; obj.show(); // 调用 非const 函数 obj.show(); // 也能调用 const 函数普通对象全能调用 // 2. const 对象 const Test cobj; cobj.show(); // 只能调用 const 函数 //cobj.show();// 不能调用 非const 函数 }拓展const 修饰指针 / 引用const int*指向常量值不可改。int* const指针常量指向不可改。八、头文件与源文件分离概念大型项目中类声明放.h头文件实现放.cpp源文件便于管理、复用、编译。特性头文件.h类声明、函数声明、宏、全局声明只声明不定义。源文件.cpp类实现、函数定义、全局定义。头文件保护防止重复包含用#ifndef...#endif或#pragma once。代码示例// Person.h头文件 #pragma once class Person { private: char name[20]; public: void setName(const char* n); void showName() const; }; // Person.cpp源文件 #include Person.h #include cstring void Person::setName(const char* n) { // 声明外部实现 strcpy(name, n); } void Person::showName() const { cout 姓名 name endl; } // main.cpp #include Person.h int main() { Person p; p.setName(XXX); p.showName(); return 0; }九、结构体 vs 类对比概念结构体struct和类class都是复合类型默认权限不同。特性struct默认public仅数据早期 C 风格。class默认private数据 函数面向对象。本质C 中 struct 可写成员函数与 class 语法一致。代码示例// struct默认public struct Stu { int id; void show() { cout id; } }; // class默认private class StuC { int id; public: void show() { cout id; } };