尧图精选

【C++】 类与对象 (三)(补充内容)

🕒 发布时间:2026/9/28 3:41:49 📁 来源:尧图网络
目录类型转换static 静态成员友元friend内部类匿名对象类型转换在原本的C语言中可以支持相对的类型的转换整形转换浮点型等C 内置了一个类型隐式转换对象但需要有内置类型为参数的构造函数补充构造函数如果在前面加上了explicit就不再支持隐式类型转换。类类型的对象之间也可以隐式转换需要相应的构造函数支持。class a { public: a(int x, int y) : _a1(x),_a2(y) {} a (int x) :_a1(x) {} int Get() const { return _a1 _a2; } private: int _a11; int _a21; }; class b { public: b(const a aa) : _b(aa.Get()) { } private: int _b0; }; int main() { a aa11; const a aa2 1; a aa3 { 2,2 }; b bb1 aa3;//类型转换 const b bb2aa3; return 0; }explicit 的作用static 静态成员一、核心本质不属于某个对象属于整个类普通成员每个对象独立一份拷贝 static 成员全类共享唯一一份内存不管创建多少对象、不创建对象都存在。存储位置全局静态存储区不在栈 / 堆程序启动分配、结束释放。二、静态成员变量 static 变量1. 声明与定义分离类内只是声明不分配内存类外必须初始化定义分配内存#include iostream using namespace std; class Person { public: int a; // 普通成员每个对象一份 static int num; // 静态成员 声明 }; // 类外初始化必须写 int Person::num 0; int main() { Person p1; Person p2; p1.num 100; cout p2.num endl; // 输出100共享同一份数据 // 无对象也能访问 cout Person::num endl; return 0; }2. 访问方式通过类名类名::静态变量推荐无对象也能用通过对象对象.静态变量/对象指针-静态变量3. 特殊const static 整型整型静态常量可类内直接初始化不用类外定义class A { public: const static int size 100; // int/short/char 允许类内赋值 // const static double pi 3.14; // 浮点不行仍要类外定义 };三、静态成员函数 static 函数1. 核心规则函数属于类无this指针关键区别普通成员函数只能访问静态成员静态变量 / 静态函数不能访问普通成员没有 this 拿不到对象普通变量同样支持 类名函数 () / 对象。函数 () 调用class Person { public: static int num; int age; // 静态函数 static void showStatic() { cout num endl; // ✅ 可以访问静态变量 // cout age; ❌ 报错无this不能访问普通成员 } void show() { cout num age; // 普通函数可以访问静态变量 } }; int Person::num 10; int main() { Person::showStatic(); // 无需创建对象直接调用 Person p; p.showStatic(); return 0; }2. 静态函数没有 this 指针原因this 是调用函数时传入当前对象地址静态函数不绑定任何对象不存在 this。四、static 成员的特点总结生命周期程序全程存在早于所有对象销毁晚于所有对象内存全类唯一多个对象共用一份初始化静态变量类外初始化const static int 除外静态函数限制仅操作静态成员无 this适用场景统计对象总数static count构造 、析构 --全局共享常量 / 配置工具函数无需实例化就能调用五、常见易错点忘记类外初始化 static 变量 → 链接报错静态函数读写普通成员变量 → 编译报错企图用this在静态函数内操作数据 → 报错误以为 static 成员随对象创建销毁 → 静态成员独立于对象存在友元friendprivate 等私有性不可访问的成员程序员不希望被别人访问但是极个别可以访问就设置了一个友元friend意思是其他人都不可以使用我的私有我指名道姓只能由他来访问我私有的空间。切记友元具有单向性。a-b不等于b-a;内部类定义定义在另一个类内部的类外层叫外部类内层是内部类。访问权限内部类能直接访问外部类所有成员包括 private外部类想访问内部类成员必须创建内部类对象。分类成员内部类外部类成员位置定义依赖外部类实例创建。静态内部类static 嵌套类加 static不依赖外部对象只能访问外部静态成员。局部内部类写在方法里仅当前方法可用。匿名内部类无类名用于快速重写方法。作用封装从属关系、实现多继承、简化回调 / 接口实现。友元关系内部类可以访问私有部分外部类外部类无法访问私有部分内部类匿名对象概括用完就释放没有变量名、临时生成、用完立刻销毁的对象。 语法类名(参数)class A{}; A(); // 匿名对象 A(10); // 带参匿名对象核心特点生命周期极短本行语句执行完马上析构释放。只适用于一次性使用不需要反复调用对象。可以直接调用成员函数A().func();两种特殊接收规则用普通对象接收匿名对象会拷贝构造匿名对象销毁变量留存A a A();用const 引用接收匿名对象延长生命周期到引用失效常用const A ref A();使用场景函数传参临时构造不定义变量函数返回值临时对象返回匿名只调用一次成员方法省去命名易错点// 不是匿名对象是函数声明 A a();
上一篇/下一篇内容由系统自动关联 返回资讯列表 →