C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)

张开发
2026/4/19 0:58:12 15 分钟阅读

分享文章

C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)
大家好我是网域小星球。本篇聚焦C 面试高频补充考点都是基础面试中大概率会问到、但容易遗漏的知识点 —— 静态成员、友元函数、const 成员衔接前 4 篇内容无冗余、纯干货代码可直接运行专门为面试突击准备吃透就能多拿面试分。目录一、核心学习目标面试导向二、静态成员static 修饰类成员面试高频1. 核心概念2. 静态成员变量重点核心特点面试必背代码示例面试常考写法面试坑点3. 静态成员函数重点核心特点面试必背代码示例面试常问三、友元friend面试常考理解即可1. 核心作用2. 友元函数最常用语法与示例3. 友元类核心特点语法示例面试坑点四、const 成员const 修饰类成员面试高频1. const 成员变量核心特点面试必背代码示例面试常考2. const 成员函数核心特点面试必背代码示例面试常问五、本章核心总结面试速记下期预告一、核心学习目标面试导向掌握静态成员变量、静态成员函数用法 面试坑点理解友元函数、友元类核心作用 面试常问场景熟练掌握const 成员变量、const 成员函数写法 权限控制牢记三大知识点的面试标准答案避免踩坑二、静态成员static 修饰类成员面试高频1. 核心概念用static修饰的类成员变量 / 函数称为静态成员属于整个类不属于某个具体对象所有对象共享同一份静态成员。2. 静态成员变量重点核心特点面试必背不属于任何对象属于类存储在全局 / 静态区生命周期贯穿整个程序必须在类外初始化类内只声明类外赋值可通过「类名静态成员名」直接访问无需实例化对象所有对象共享同一份静态成员变量修改一个对象的静态成员所有对象都受影响。代码示例面试常考写法#include iostream using namespace std; class Student { public: string name; static int count; // 类内声明静态成员变量统计学生人数 // 构造函数每创建一个对象count自增 Student(string n) { name n; count; } }; // 类外初始化静态成员变量必须写否则报错 int Student::count 0; int main() { Student s1(张三); Student s2(李四); Student s3(王五); // 三种访问方式 cout 学生总数类名访问 Student::count endl; // 推荐无需对象 cout 学生总数对象访问 s1.count endl; cout 学生总数对象访问 s2.count endl; return 0; }输出结果3 3 3三个对象共享 count面试坑点静态成员变量不能在类内初始化只能声明静态成员变量不占用对象内存属于类静态成员变量可以是私有private此时类外无法直接访问需通过静态成员函数访问。3. 静态成员函数重点核心特点面试必背用static修饰属于类不属于对象无需实例化即可调用只能访问静态成员变量、静态成员函数不能访问非静态成员无 this 指针可通过「类名静态成员函数名」直接调用。代码示例class Student { private: static int count; // 私有静态成员变量 public: Student() { count; } // 静态成员函数访问私有静态成员 static int getCount() { // 只能访问静态成员不能访问非静态成员如name return count; } }; int Student::count 0; int main() { // 无需实例化对象直接调用静态成员函数 cout 学生总数 Student::getCount() endl; Student s1, s2; cout 学生总数 Student::getCount() endl; return 0; }面试常问静态成员函数和非静态成员函数的区别答1. 静态成员函数无 this 指针非静态有2. 静态只能访问静态成员非静态可访问所有成员3. 静态无需对象即可调用非静态必须通过对象调用。三、友元friend面试常考理解即可1. 核心作用打破类的封装性让类外的函数 / 类可以直接访问类的私有private、保护protected成员解决特定场景下的访问问题如运算符重载。2. 友元函数最常用语法与示例#include iostream using namespace std; class Person { private: int age; // 声明友元函数该函数可访问当前类的私有成员 friend void showAge(Person p); public: Person(int a) { age a; } }; // 友元函数类外定义可直接访问Person的私有成员age void showAge(Person p) { cout 年龄 p.age endl; // 直接访问私有成员合法 } int main() { Person p(20); showAge(p); // 输出20 return 0; }3. 友元类核心特点一个类声明为另一个类的友元那么这个类的所有成员函数都可以直接访问另一个类的私有 / 保护成员。语法示例class A { private: int num; // 声明B为A的友元类 friend class B; public: A(int n) { num n; } }; class B { public: // B的成员函数可直接访问A的私有成员 void show(A a) { cout A的私有成员 a.num endl; } }; int main() { A a(100); B b; b.show(a); // 输出100合法 return 0; }面试坑点友元关系是单向的A 是 B 的友元不代表 B 是 A 的友元友元关系不可传递A 是 B 的友元B 是 C 的友元不代表 A 是 C 的友元友元会破坏封装性尽量少用面试只需掌握用法和特点即可。四、const 成员const 修饰类成员面试高频1. const 成员变量核心特点面试必背必须在构造函数初始化列表中初始化不能在构造函数体内赋值一旦初始化不可修改属于对象每个对象有独立的 const 成员变量。代码示例面试常考#include iostream #include string using namespace std; class Person { public: const string name; // const成员变量 int age; // 必须在初始化列表中初始化const成员变量 Person(string n, int a) : name(n), age(a) { // name n; // 错误不能在构造体内赋值 } }; int main() { Person p(张三, 20); // p.name 李四; // 错误const成员不可修改 cout p.name p.age endl; return 0; }2. const 成员函数核心特点面试必背函数声明末尾加const语法返回值 函数名() const不能修改类的非 const 成员变量可访问不可修改不能调用非 const 成员函数避免间接修改成员变量const 对象只能调用 const 成员函数。代码示例class Person { public: string name; int age; Person(string n, int a) : name(n), age(a) {} // const成员函数不能修改非const成员 void showInfo() const { cout name age endl; // age 30; // 错误不能修改非const成员 } // 非const成员函数可修改成员 void setAge(int a) { age a; } }; int main() { const Person p1(张三, 20); // const对象 p1.showInfo(); // 合法const对象可调用const成员函数 // p1.setAge(25); // 错误const对象不能调用非const成员函数 Person p2(李四, 22); p2.showInfo(); // 非const对象也可调用const成员函数 p2.setAge(25); // 合法 return 0; }面试常问const 成员函数为什么不能修改非 const 成员变量答const 成员函数会隐含一个const this指针this指针指向的对象是只读的因此不能修改非 const 成员变量。五、本章核心总结面试速记静态成员属于类共享资源类外初始化无 this 指针友元打破封装让类外函数 / 类访问私有成员单向不可传递const 成员变量构造初始化列表初始化不可修改const 成员函数末尾加 const不能修改非 const 成员、不能调用非 const 函数这三个知识点是 C 基础面试的补充重点大概率会结合类与对象一起提问。下期预告C 从 0 入门六C 面试必知运算符重载、异常处理、动态内存进阶收官补充

更多文章