【C++类与对象·下】高级类特性:运算符重载与静态成员实战

📅 发布时间:2026/7/16 16:04:31 👁️ 浏览次数:
【C++类与对象·下】高级类特性:运算符重载与静态成员实战
一、初始化列表构造函数的“正确打开方式” 什么是初始化列表 初始化列表以冒号开头后跟逗号分隔的成员初始化列表每个成员后跟括号中的初始值或表达式代码语言javascriptAI代码解释Date(int x, int year, int month, int day) : _year(year), _month(month), _day(day), _t(12), _ref(x), _n(1) { // 函数体用于逻辑处理**不用于初始化** }⚠️ 三类成员必须用初始化列表否则编译报错引用成员int _ref→ 引用必须在定义时绑定const 成员const int _n→ const 只能初始化不能赋值无默认构造的自定义类型如Time _t→ 编译器无法先默认构造再赋值 踩坑示例代码语言javascriptAI代码解释class Time { public: Time(int hour) : _hour(hour) {} private: int _hour; }; class Date { public: Date(int x, int year 1, int month 1, int day 1) : _year(year), _month(month), _day(day), _t(12), _ref(x), _n(1) {} private: int _year, _month, _day; Time _t; // 没有默认构造 int _ref; // 引用 const int _n; // const };❌ 若不用初始化列表编译器报错error C2512: “Time”: 没有合适的默认构造函数可用error C2530: “Date::_ref”: 必须初始化引用 初始化顺序真相与初始化列表书写顺序无关严格按类中声明顺序初始化。代码语言javascriptAI代码解释class A { int _a2 2; int _a1 2; public: A(int a) : _a1(a), _a2(_a1) {} void Print() { cout _a1 _a2 endl; } }; A aa(1); aa.Print(); // 输出1 随机值原因先初始化_a2此时_a1未初始化建议声明顺序 初始化列表顺序避免陷阱。C11 成员缺省值代码语言javascriptAI代码解释class Date { int _year 1900; Time _t 12; // 调用 Time(12) const int _n 1; int* _ptr (int*)malloc(12); public: Date() : _month(2) {} // 未初始化的成员用缺省值 void Print() const { cout _year - _month - _day endl; } private: int _month 1, _day; };✅ 缺省值本质是“初始化列表的后备方案”优先级显式初始化 成员缺省值 默认行为二、explicit禁止隐式类型转换的“安全锁”C 允许用单参数构造函数进行隐式转换代码语言javascriptAI代码解释class A { public: A(int a1) : _a1(a1) {} private: int _a1 1, _a2 2; }; A aa1 1; // 隐式转换1 → A(1) 使用explicit禁止隐式转换代码语言javascriptAI代码解释explicit A(int a1) : _a1(a1) {} // A aa1 1; // ❌ 编译错误 A aa1(1); // ✅ 必须显式构造 多参数隐式转换C11 起支持代码语言javascriptAI代码解释A aa3 {2, 2}; // 需要构造函数支持建议所有单参数构造函数默认加上explicit除非明确需要隐式转换如string s hello三、static 成员类级别的“共享内存”✅ 核心特性静态成员变量属于类不属于任何对象存于静态区必须在类外定义并初始化哪怕有缺省值静态成员函数无this指针只能访问静态成员访问方式类名::成员或对象.成员受访问权限控制private 的 static 不能在类外直接访问