类和对象进阶:初始化列表的标准使用、隐式类型转换、static成员、友元型的使用、匿名对象、及小点:内部类与对象拷贝时的编译器优化
目录※一、初始化列表※初始化列表使用总结构造-析构顺序练习题二、类与对象中的隐式类型转换三、static修饰类成员四、友元类、友元函数五、匿名对象六、较少应用知识点内部类对象拷贝时的编译器优化前言在了解了类和对象的基本内容之后就可以深入了解一些类与对象的拓展使用方法~※一、初始化列表前言构造函数初始化的一种方法。集中实现变量、常量的初始化赋值(秩序性、简洁性)。标注※为复习重点格式在构造函数的下一行(可在末尾)以:开头后接初始化目标名字后接()内部值决定初始化目标的值 最后加{} () 。 ()内部可以为变量、计算式。示例class Date { public: Date(int year, int month, int day) :_year(year) ,_month(month) ,_day(day) { ; // 此处可以不加但是必须加{}!! } private: int _year; int _month; int _day; };对于初始化列表有以下规定(最后总结)※1.const 对象 引用对象 没有默认构造的类类型变量必须写入初始化列表。class Date { public: Date(int year, int month, int day, int x) :_year(year) , _month(month) , _day(day) ,_t(12) ,ref(x) //注意此处的引用必须要传入变量了 ,_n(x) { ; // 此处可以不加但是必须加{}!! } private: int _year; int _month; int _day; Time _t; //没有默认构造 int ref; //引用 const int _n;//const };2.尽量写入初始化列表因为即使变量你没有写入它仍会走初始化列表(假如你在定义时就进行了初始化那么调用此缺省值 如下)class Date1 { public: Date1(int year, int month) :_year(year) , _month(month) { ; // } private: ※private区域给予初始化 实际时缺省值在进行初始化列表时假如没有 那么调用此缺省值 int _year 2007; int _month 1; int _day 28; //自动缺省初始化为28 };3.初始化列表的初始化顺序是按照声明顺序执行的而非按照初始化列表中的顺序。推荐的构造函数初始化的基本格式class Date1 { public: Date1(int year 2007, int month 1, int day 28) :_year(year) ,_month(month) ,_day(day) { } void Print() const { cout _year / _month / _day endl; return; } private: int _year; int _month; int _day; };※初始化列表使用总结1.const 对象 引用对象 没有默认构造的类类型变量必须写入初始化列表。2.尽量写入初始化列表因为即使变量你没有写入它仍会走初始化列表(假如你在定义时就进行了初始化那么调用此缺省值 如下)3.初始化列表的初始化顺序是按照声明顺序执行的而非按照初始化列表中的顺序。构造-析构顺序练习题下⾯程序的运⾏结果是什么A. 输出 1 1B. 输出 2 2C. 编译报错D. 输出 1 随机值E. 输出 1 2F. 输出 2 1#includeiostream using namespace std; class A { public: A(int a) :_a1(a) , _a2(_a1) {} void Print() { cout _a1 _a2 endl; } private: int _a2 2; int _a1 2; }; int main() { A aa(1); aa.Print(); }答案D原因分析(按照声明顺序读代码)1.先进入主函数---类的初始化。2.由于先是_a2声明先初始化_a2初始化为_a1但是此时_a1未初始化是随机值。3._a1初始化为主函数传入的1。二、类与对象中的隐式类型转换功能方便构造1.内置类型转为类类型对象需要有相关内置类型为参数的构造函数。2.在构造函数前explicit[ɪkˈsplɪsɪt] (清晰的) 表示此构造函数不再支持隐式类型转换。3.类类型的对象之间也可以隐式转换需要相应的构造函数支持。(实用价值少……文章不涉及~)#include iostream using namespace std; class Date { public: // 单参数构造函数 - 允许隐式转换 Date(int year) : _year(year) , _month(1) , _day(1) { cout Date(int) 构造: year endl; } void print() const { cout _year - _month - _day endl; } private: int _year; int _month; int _day; }; void func(Date d) { d.print(); } int main() { // 隐式类型转换发生的地方 // 初始化时 Date d1 2024; // ✅ 隐式转换int → Date d1.print(); return 0; }若隐式转换中传入多个参数其格式有Date d1;d1 {2009, 9, 1};三、static修饰类成员前言static加上后表示静态性质——存储于内存的静态区不因在类内而隶属于某一对象。↓为所有对象所共享(都可访问)1.静态成员变量一定要在类外初始化。2.静态函数没有this指针。3.静态成员受类内访问限定符限制(private pritected public)。4.由于静态成员在类内 所以规定访问必须指定如Date::valuable。5.静态成员变量不能在声明位置给初始值进行初始化 静态成员不属于任意对象不走初始化列表初始化。四、友元类、友元函数1.友元提供了一种突破类访问限定符的封装方式友元分为友元函数与友元类在函数声明或类声明前加friend并且把友元声明放到一个类的里面。2.外部友元函数可以访问类的的私有和保护成员友元函数仅仅是一种声明他表示类的成员函数。3.友元函数可以在类的任何地方声明因为其的使用不受类访问限定符的限制。4.一个函数可以是多个类的友元函数(不推荐使用)。5.友元类中的成员函数都可以是另一个类的友元函数都可以定位另一个类中的私有和保护成员。6.友元关系是单向的不具有交换性即在A类中声明友元类B那么B类可以访问A类中的私有成员。但是A类不能访问B类的私有成员。代码如下7.友元关系不能传递如A是B的友元B是C的友元但是A不是C的友元。8.友元会增加耦合度破坏了封装所以友元不宜多用。//友元的单向性 class Date1; class Date { friend class Date1; //Date2类中定义友元类Date——Date2类的友元类是Date——Date2中可以访问Date中的数据 public: //void Print(Date1 d) //{ // cout d.m endl; //err 不能访问d.m 友元类 单向性的体现 //} int n 0; }; class Date1 { public: void Print(Date d) { cout d.n endl; //可以访问d.n } int m 0; private: static int max; //类内声明 };五、匿名对象1.使用类型(实参)定义出来的对象叫做匿名对象我们之前定义的类型 名称叫做有名对象。2.匿名对象的生命周期只在当前这一行这一行结束就会析构。//匿名对象 class Date { public: Date(int a 1) { int _a a; } void Print(const Date d) const //只读成员函数 { cout d._year endl; //err 为什么不可以访问 生命周期 } private: int _year; int _month; int _day; }; int main4() { //例一. Date(); //匿名对象 Date(2); //匿名对象 //例二. Date d1; Date().Print(d1); //使用匿名对象节省了空间 return 0; }六、较少应用知识点内部类1.如果一个类定义在另一个类的内部这个内部类就佳作内部类。内部类是一个独立的类跟定义在全局相比它只是受外部类类域限制和访问限定符限制所以外部类定义的对象不包含内部类。2.内部类默认是外部类的友元类。3.内部类的本质也是一种封装当A跟B类紧密相关A类实现出来主要就是给B类使用那么可以考虑把A类设计为B的内部类如果放到private/protected位置那么A类就是B类的专属内部类其他地方都用不了。对象拷贝时的编译器优化1.现代编译器为尽可能地提高程序的效率在不影响正确性的情况下会尽可能地减少一些传参和传值返回可以省略的拷贝。2.如何优化 程度如何C没有严格规定取决于编译器。

相关新闻

电力电子技术详解:交交变频电路Matlab模型与单相、三相交流调压电路研究,专业波形图解析,加...

电力电子技术详解:交交变频电路Matlab模型与单相、三相交流调压电路研究,专业波形图解析,加...

电力电子技术,交交变频电路matlab模型图,单相交流调压电路,三相交流调压电路,交交变频电路,数据已经调试好,可以直接出波形图,可用于电力电子的研究,想要点击加好友加好友我哈&#…

2026/7/5 11:57:21 阅读更多 →
汽车传感器防水用什么胶水?

汽车传感器防水用什么胶水?

乐泰406 在现代汽车,尤其是智能驾驶和新能源汽车高速发展的今天,传感器如同车辆的“感官神经”,遍布车身各处,传感器的结构因其功能(感知压力、温度、位置、速度等)收集关键信息。这些精密元件的稳定工作&a…

2026/7/5 11:55:19 阅读更多 →
该模型为PMSM的无传感器器控制,在低速时采用I/F启动方式,中高速切换至滑膜观测器估算PMSM位置

该模型为PMSM的无传感器器控制,在低速时采用I/F启动方式,中高速切换至滑膜观测器估算PMSM位置

该模型为PMSM的无传感器器控制,在低速时采用I/F启动方式,中高速切换至滑膜观测器估算PMSM位置,进而对PMSM进行调速控制。无传感器永磁同步电机控制这玩意儿,说难不难说简单也不简单。低速时转子位置难抓取这事儿搞过的人都懂&…

2026/7/6 7:36:40 阅读更多 →

最新新闻

Python自动化破解WIPO六宫格验证码:图像处理与网络请求实战

Python自动化破解WIPO六宫格验证码:图像处理与网络请求实战

1. 项目概述与核心痛点最近在做一个专利数据分析的小工具,需要从世界知识产权组织(WIPO)的专利数据库里批量抓取一些公开数据。本来以为用Python的requests库写个脚本,模拟登录后按部就班爬取就完事了,结果第一步就卡在…

2026/7/6 9:02:09 阅读更多 →
基于MCP协议为AI编程助手集成逆向分析能力:从静态反编译到动态Hook的完整实践

基于MCP协议为AI编程助手集成逆向分析能力:从静态反编译到动态Hook的完整实践

1. 项目概述:当AI编程助手学会“拆解”程序 想象一下,你正在分析一个加密的Android应用,试图找到它的网络通信密钥。传统流程是:打开IDA Pro反汇编引擎库,在十六进制视图中搜索可疑字符串;同时启动Frida&am…

2026/7/6 9:00:06 阅读更多 →
AI模型测试:从确定性断言到统计判定的工程实践

AI模型测试:从确定性断言到统计判定的工程实践

1. 项目概述:当AI的“不确定性”撞上测试的“确定性” 干了这么多年测试,从功能、性能到安全,感觉什么大风大浪都见过了。但最近两年,随着公司业务里AI驱动的功能越来越多,比如智能客服的意图识别、内容平台的个性化推…

2026/7/6 9:00:06 阅读更多 →
ai模特mj生成一次搞定,批量电商图也能轻松制作

ai模特mj生成一次搞定,批量电商图也能轻松制作

在电商视觉内容日益多元化的趋势下,高效生成高质量ai模特mj已成为诸多商家提升转化率的关键。不同平台在ai图片生成和模特创作方面,功能、适用场景与效率表现各异,下面我将结合近期实操体验进行详细测评分析。 作图鸟 作图鸟地址&#xff1…

2026/7/6 9:00:06 阅读更多 →
AI驱动软件测试自动化:核心原理、十大工具解析与落地实践

AI驱动软件测试自动化:核心原理、十大工具解析与落地实践

1. 项目概述:当AI遇见软件测试自动化如果你和我一样,在软件测试领域摸爬滚打了十几年,就会深刻感受到一个趋势:测试工作正从“体力密集型”向“智力密集型”转变。过去,我们花大量时间编写和维护那些冗长、脆弱、一有风…

2026/7/6 9:00:06 阅读更多 →
Hertz-Dev:实现超低延迟AI音频生成的流式TTS架构与实践

Hertz-Dev:实现超低延迟AI音频生成的流式TTS架构与实践

1. 项目概述:当AI对话不再“卡顿”,Hertz-Dev带来了什么? 如果你尝试过市面上那些需要“思考”几秒才能回答的AI语音助手,或者用过那些生成一句话音频要等上半天的工具,那你一定对“延迟”这个词深恶痛绝。那种感觉就像…

2026/7/6 8:56:02 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻