【C++入门】类和对象(下)——初始化列表、static成员、友元、内部类与匿名对象,一篇搞定!
前言类和对象的最后一篇来了这篇我们学习初始化列表、隐式类型转换、static静态成员、友元、内部类、匿名对象以及编译器对对象拷贝的优化。这些知识点虽然零散但面试和写代码时经常遇到。 目录一、初始化列表二、隐式类型转换三、static静态成员四、友元五、内部类六、匿名对象七、对象拷贝的编译器优化一、初始化列表1.1 什么是初始化列表之前我们实现构造函数时主要在函数体内赋值。构造函数还有一种初始化方式——初始化列表// 以冒号开始每个成员变量后跟括号中的初始值逗号分隔classTime{public:Time(inthour):_hour(hour)// 初始化列表{coutTime()endl;}private:int_hour;};1.2 必须在初始化列表初始化的成员以下三种成员必须放在初始化列表位置否则编译报错引用成员变量const成员变量没有默认构造函数的类类型成员classDate{public:Date(intx,intyear1,intmonth1,intday1):_year(year),_month(month),_day(day),_t(12)// Time没有默认构造必须在初始化列表初始化,_ref(x)// 引用成员必须初始化,_n(1)// const成员必须初始化{}private:int_year;int_month;int_day;Time _t;// 没有默认构造int_ref;// 引用constint_n;// const};1.3 初始化顺序初始化列表中成员按照在类中声明的顺序初始化跟初始化列表中出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致避免出问题。来看一个经典面试题classA{public:A(inta):_a1(a),_a2(_a1)// 注意先声明的是_a2所以_a2先初始化{}voidPrint(){cout_a1 _a2endl;}private:int_a22;// 先声明_a2先初始化int_a12;};intmain(){Aaa(1);aa.Print();// 输出 1 随机值return0;}答案_a2先初始化用未初始化的_a1是随机值_a1后初始化为1。所以输出1 随机值。1.4 C11的缺省值C11支持在成员变量声明位置给缺省值这个缺省值是给没有显示在初始化列表初始化的成员使用的classDate{public:Date():_month(2){}private:int_year1;// 缺省值初始化列表没给就用1int_month1;// 初始化列表给了2就用2int_day;// 没有缺省值初始值随机};注意声明位置给的不是初始化是缺省值最终还是要走初始化列表。二、隐式类型转换2.1 内置类型转类类型C支持内置类型隐式类型转换为类类型对象前提是有相关内置类型为参数的构造函数classA{public:A(inta1):_a1(a1){}private:int_a1;};intmain(){A a11;// 1先构造一个A的临时对象再用临时对象拷贝构造a1// 编译器遇到连续构造拷贝构造会优化为直接构造return0;}2.2 explicit关键字构造函数前面加explicit就不再支持隐式类型转换classA{public:explicitA(inta1):_a1(a1){}private:int_a1;};intmain(){// A a1 1; // 编译报错explicit禁止了隐式转换Aa1(1);// 这样可以显式构造return0;}2.3 类类型之间的转换类类型对象之间也可以隐式转换需要相应的构造函数支持classA{public:A(inta11,inta22):_a1(a1),_a2(a2){}intGet()const{return_a1_a2;}private:int_a1;int_a2;};classB{public:B(constAa):_b(a.Get()){}private:int_b;};intmain(){A aa3{2,2};// C11支持多参数隐式转换B baa3;// A对象隐式转换为B对象return0;}三、static静态成员3.1 静态成员变量用static修饰的成员变量称为静态成员变量静态成员变量一定要在类外进行初始化为所有类对象所共享不属于某个具体对象不存在对象中存放在静态区classA{private:staticint_scount;// 类里面声明};intA::_scount0;// 类外面初始化3.2 静态成员函数用static修饰的成员函数称为静态成员函数静态成员函数没有this指针只能访问静态成员不能访问非静态成员因为没有this非静态成员函数可以访问静态成员3.3 访问方式突破类域就可以访问静态成员有两种方式// 1. 类名::静态成员coutA::GetCount()endl;// 2. 对象.静态成员couta1.GetCount()endl;静态成员也是类的成员受public、protected、private访问限定符限制。3.4 经典例子计算创建了多少个对象classA{public:A(){_scount;}A(constAt){_scount;}~A(){--_scount;}staticintGetCount(){return_scount;}private:staticint_scount;};intA::_scount0;intmain(){coutA::GetCount()endl;// 0A a1,a2;Aa3(a1);coutA::GetCount()endl;// 3return0;}四、友元4.1 友元是什么友元提供了一种突破类访问限定符封装的方式分为友元函数友元类使用friend关键字把友元声明放到类里面。4.2 友元函数外部友元函数可以访问类的私有和保护成员。友元函数只是一种声明不是类的成员函数。classA{friendvoidfunc(constAaa);// 友元声明private:int_a11;};voidfunc(constAaa){coutaa._a1endl;// 可以访问私有成员}4.3 友元类classA{friendclassB;// B是A的友元类private:int_a11;};classB{public:voidfunc1(constAaa){coutaa._a1endl;// B的成员函数可以访问A的私有成员}};4.4 友元的特性友元函数可以在类定义的任何地方声明不受访问限定符限制一个函数可以是多个类的友元函数友元关系是单向的A是B的友元不代表B是A的友元友元关系不能传递A是B的友元B是C的友元A不是C的友元友元增加了耦合度破坏了封装不宜多用五、内部类5.1 什么是内部类如果一个类定义在另一个类内部这个类就叫做内部类。内部类是一个独立的类外部类定义的对象中不包含内部类内部类默认是外部类的友元类内部类本质也是一种封装classA{private:staticint_k;int_h1;public:classB// 内部类默认是A的友元{public:voidfoo(constAa){cout_kendl;// OKcouta._hendl;// OK友元可以访问}private:int_b1;};};intA::_k1;intmain(){coutsizeof(A)endl;// 内部类不占外部类对象空间A::B b;// 内部类要通过外部类类域访问A aa;b.foo(aa);return0;}5.2 内部类的使用场景当A类跟B类紧密关联A类实现出来主要就是给B类使用那么可以考虑把A类设计为B的内部类。如果放到private/protected位置A类就是B类的专属内部类其他地方都用不了。六、匿名对象6.1 什么是匿名对象用类型(实参)定义出来的对象叫做匿名对象不取名字classA{public:A(inta0){coutA(int a)endl;}~A(){cout~A()endl;}};intmain(){A aa1;// 有名对象A();// 匿名对象A(1);// 匿名对象return0;}6.2 匿名对象的特点匿名对象生命周期只在当前一行下一行就自动调用析构函数一般临时定义一个对象当前用一下即可就可以定义匿名对象classSolution{public:intSum_Solution(intn){returnn;}};intmain(){// 匿名对象场景临时调用一下函数Solution().Sum_Solution(10);return0;}七、对象拷贝的编译器优化7.1 为什么要优化现代编译器为了尽可能提高程序效率在不影响正确性的情况下会尽可能减少一些传参和传返回值过程中可以省略的拷贝。7.2 常见优化场景场景1传值传参voidf1(A aa){}intmain(){A aa1;f1(aa1);// 构造拷贝构造f1(1);// 隐式类型转换连续构造拷贝构造 - 优化为直接构造f1(A(2));// 一个表达式中连续构造拷贝构造 - 优化为一个构造return0;}场景2传值返回Af2(){A aa;returnaa;}intmain(){f2();// 传值返回不优化会产生临时对象A aa2f2();// 连续拷贝构造拷贝构造 - 优化为一个拷贝构造aa1f2();// 一些编译器会进行跨行优化return0;}7.3 关闭优化linux下用g编译时可以用以下方式关闭构造相关的优化g test.cpp -fno-elide-constructors具体优化C标准没有严格规定不同编译器处理方式不同。VS2022比VS2019优化得更激进会进行跨表达式合并优化。类和对象的内容到这里就全部结束了从类的定义、构造析构、拷贝构造、运算符重载到初始化列表、static成员、友元、内部类这些都是C面向对象的基础。后面学习STL时会大量用到这些知识加油

相关新闻

Agent-Reach:面向生产环境的LLM API治理与智能路由网关

Agent-Reach:面向生产环境的LLM API治理与智能路由网关

1. 项目概述:Agent-Reach 是什么,它解决的不是“能不能用”,而是“怎么用得稳、用得准、用得省”Agent-Reach 这个名字乍看像某个开源模型或框架,但结合它在 CLI、API、YouTube、Reddit 等关键词中的高频共现,再叠加近…

2026/10/7 14:14:10 阅读更多 →
OpenCode 高阶玩法:CLI 自动化、CI/CD 集成与远程协作

OpenCode 高阶玩法:CLI 自动化、CI/CD 集成与远程协作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:14:10 阅读更多 →
Codex 驱动 R 语言数据实战指南:把 auth.json 改到 TaoToken

Codex 驱动 R 语言数据实战指南:把 auth.json 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:14:10 阅读更多 →

最新新闻

从 Rule、Spec 到 Harness:AI Coding 渐进式建设路径的 TaoToken 实践

从 Rule、Spec 到 Harness:AI Coding 渐进式建设路径的 TaoToken 实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:53:44 阅读更多 →
期刊论文快速成文技巧:借助硕词AI提升发文效率

期刊论文快速成文技巧:借助硕词AI提升发文效率

期刊论文发表是科研成果输出的重要渠道,相较于学位论文,期刊文稿更看重选题新颖、观点凝练、逻辑紧凑、语言精炼。很多科研人员研究成果充足,却因写作效率低、表述不精炼、内容冗余、格式不达标,导致反复退稿、返修,错…

2026/10/7 14:53:44 阅读更多 →
硬件I2C与软件I2C谁更坑?嵌入式通信选型与避坑指南

硬件I2C与软件I2C谁更坑?嵌入式通信选型与避坑指南

1. 从一根线说起:为什么I2C总让人又爱又恨搞嵌入式的人,几乎都绕不开I2C。两根线,一根SCL时钟,一根SDA数据,挂上一堆设备,EEPROM、OLED、传感器、数字电位器、DAC,甚至某些电源管理芯片的反馈调…

2026/10/7 14:53:44 阅读更多 →
基于SSM的汽车售后服务管理系统:数据库设计到项目部署全解析

基于SSM的汽车售后服务管理系统:数据库设计到项目部署全解析

简介:一套基于SSM框架实现的汽车售后服务管理系统,面向正在筹备毕业设计的计算机专业学生,以及需要快速搭建Web管理后台的Java初学者。系统采用B/S架构,后端由Spring、SpringMVC、MyBatis整合,前端使用JSP,…

2026/10/7 14:53:43 阅读更多 →
无感FOC低速高频注入:Ud/Uq与控制频率的硬约束

无感FOC低速高频注入:Ud/Uq与控制频率的硬约束

1. 从一次电机启动失败说起:为什么Ud/Uq和注入频率值得单独拎出来讲 前阵子帮朋友调一块无感FOC驱动板,板子跑的是比较常见的滑模观测器方案,低速段一直不太稳。他的现象很典型:给一个固定频率的方波做高频注入,电机在…

2026/10/7 14:53:43 阅读更多 →
五类机器人嵌入式岗位差异全解析:从AMR到人形机器人的技能转型指南

五类机器人嵌入式岗位差异全解析:从AMR到人形机器人的技能转型指南

1. 五类机器人嵌入式岗位的真实差异 1.1 为什么同样叫“嵌入式”,薪资和门槛能差出一倍 我做了十多年嵌入式,从最早的8位机裸跑到后来带Linux BSP团队,再到这两年密集接触机器人项目,最大的感受就是: “嵌入式”这三…

2026/10/7 14:52:43 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →