【C++入门】Cyber深度漫游者的初始链路——【类与对象】初始化成员列表

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING \]: DETECTING HIGH ENERGY **🌊 🌉 🌊 心手合一 · 水到渠成** ![分隔符](https://i-blog.csdnimg.cn/direct/60a3de2294e9439abad47378e657b337.gif) |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | **\>\>\> ACCESS TERMINAL \<\<\<** || | [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) | | [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) | --------------------------------------- Running Process: 100% \| Latency: 0ms *** ** * ** *** #### 索引与导读 * * [C++ 对象初始化的几种方式](#C++ 对象初始化的几种方式) * [何为初始化成员列表?](#何为初始化成员列表?) * [1)初始化列表的基本语法](#1)初始化列表的基本语法) * [2)初始化列表的优势](#2)初始化列表的优势) * * [2.1)更高的效率](#2.1)更高的效率) * [2.2)某些情况必须使用初始化列表](#2.2)某些情况必须使用初始化列表) * [3)成员变量的初始化顺序](#3)成员变量的初始化顺序) * [4)流程图总结](#4)流程图总结) * [5)C++11 后的新特性:类内初始化](#5)C++11 后的新特性:类内初始化) * [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议) ### C++ 对象初始化的几种方式 > [🔗Lucy的空间骇客裂缝:]() *** ** * ** *** ### 何为初始化成员列表? 🚩**在构造函数参数列表之后、函数体大括号之前,以冒号 : 开头的一段代码** * **在`C++`中** ,**构造函数初始化列表**是一种更高效、更规范的初始化成员变量的方式 ### 1)初始化列表的基本语法 ```cpp class MyClass { private: int a; double b; std::string c; public: // 使用初始化列表的构造函数 MyClass(int x, double y, const std::string& z) : a(x), // 初始化a b(y), // 初始化b c(z) // 初始化c { // 构造函数体 // 这里可以进行其他操作,但成员变量已经初始化完成 } }; ``` ### 2)初始化列表的优势 * 相比于在构造函数体内赋值,**初始化列表**有以下几个重要优势: #### 2.1)更高的效率 初始化列表直接初始化成员变量,而构造函数体内赋值则是先默认初始化再赋值: ```cpp class Efficient { private: string name; public: Efficient(const string& n):name(n){ //直接调用string的拷贝构造函数 cout << "初始化对象成功" << endl; } }; class LessEfficient { private: string name; public: LessEfficient(const string& n) { name = n; // 先调用默认构造函数,再调用赋值运算符 cout << "初始化对象成功" << endl; } }; ``` *** ** * ** *** #### 2.2)某些情况必须使用初始化列表 * **a) 常量成员** ```cpp class ConstMember { private: const int constValue; public: ConstMember(int value) : constValue(value) { // 正确:在初始化列表中初始化常量 } }; ``` ❌以下代码会导致编译错误: ```cpp ConstMember(int value) { constValue = value; // 编译错误! cout << "初始化对象成功" << endl; } ``` * **b) 引用成员** ```cpp class RefMember { private: int& refValue; public: RefMember(int& value) : refValue(value) { // 正确:引用必须在初始化时绑定 } } ``` * **c) 没有默认构造函数的类成员** ```cpp class NoDefault { private: int value; public: NoDefault(int v) : value(v) {} // 只有带参构造函数,没有默认构造函数 // 没有 NoDefault() 构造函数 }; class Container { private: NoDefault member; public: Container(int v) : member(v) { // 必须使用初始化列表 } // 以下代码会导致编译错误: // Container(int v) { // member = NoDefault(v); // 错误:NoDefault没有默认构造函数 // } }; ``` * **d) 类类型成员(有参数的构造函数)** ```cpp class Base { private: int baseValue; public: Base(int v) : baseValue(v) {} }; class Derived : public Base { private: int derivedValue; public: Derived(int base, int derived) : Base(base), // 必须使用初始化列表调用基类构造函数 derivedValue(derived) { } }; ``` *** ** * ** *** ### 3)成员变量的初始化顺序 **注意:** 成员变量的初始化顺序只取决于它们在类中声明的顺序,而与它们在初始化列表中的排列顺序无关 ```cpp class Demo { int x; int y; public: Demo(int i) : y(i), x(y + 1) {} }; ``` **即使 y 写在前面,也会先初始化 x** **❗ 危险!此时 y 还没初始化,x 的值将是随机垃圾值** *** ** * ** *** ### 4)流程图总结 是 否 有 没有 成员变量走初始化列表的逻辑 是否在初始化列表中显式显示? 1. 按初始化列表中的值进行初始化 2. 类中声明位置是否有缺省值? 2.1 按声明处的缺省值初始化 2.2 变量类型分类 内置类型成员变量 可能是随机值, 也可能是默认值0等, 具体看编译器 自定义类型成员变量 调用该成员的默认构造函数 引用/const/无默认构造函数的成员 必须在初始化列表显式初始化, 或声明时有缺省值, 否则报错 *** ** * ** *** ### 5)C++11 后的新特性:类内初始化 你现在可以直接在类定义中给成员变量赋初值,而不需要在每个构造函数里都写一遍 * **语法:** 使用等号 `=` 或大括号 `{}`。 * **规则:** 如果构造函数的初始化列表中也提供了值,则构造函数的值会覆盖类内初始值 * **优点:** 极大地减少了冗余代码,并防止了"忘记初始化某个成员"导致的未定义行为 ```cpp class User { int id = 0; // 直接赋值 string name{"Guest"}; // 列表初始化 double balance = 100.0; public: User() {} // 使用默认值:0, "Guest", 100.0 User(int custom_id) : id(custom_id) {} // id 被覆盖,其余使用默认值 }; ``` *** ** * ** *** ## 💻结尾--- 核心连接协议 **警告:** 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠 *** ** * ** *** **【📡】 建立深度链接:** **关注**本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。 **【⚡】 能量过载分发:** 执行**点赞**操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。 **【💾】 离线缓存核心:** 将本页加入**收藏**。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。 **【💬】 协议加密解密:** 在**评论区**留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。 **【🛰️】 信号频率投票:** 通过**投票**发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。 *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57b03915c54b43a7a03fa92dbbfe57c3.gif) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0905dc972de8414bb602715de3f866ee.gif)

相关推荐
独自破碎E1 小时前
BISHI43 讨厌鬼进货
android·java·开发语言
mmz12072 小时前
逆序对问题(c++)
c++·算法
化学在逃硬闯CS2 小时前
Leetcode110.平衡二叉树
数据结构·c++·算法·leetcode
谢铭轩2 小时前
题解:P8035 [COCI 2015/2016 #7] Otpor
c++·算法
纯.Pure_Jin(g)2 小时前
【Python练习四】Python 算法与进阶特性实战:数组、序列化与位运算专项练习(3道经典练习带你巩固基础——看完包会)
开发语言·vscode·python
阿猿收手吧!2 小时前
【C++】模块:告别头文件新时代
开发语言·c++
星火开发设计2 小时前
虚析构函数:解决子类对象的内存泄漏
java·开发语言·前端·c++·学习·算法·知识
t198751282 小时前
MATLAB水声信道建模:方法、实现与应用
开发语言·matlab
闻缺陷则喜何志丹2 小时前
【拆位法】P9277 [AGM 2023 资格赛] 反转|普及+
c++·算法·位运算·拆位法