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

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING : DETECTING HIGH ENERGY

🌊 🌉 🌊 心手合一 · 水到渠成

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| >>> ACCESS TERMINAL <<< ||
| 🦾 作者主页 | 🔥 C语言核心 |
| 💾 编程百度 | 📡 代码仓库 |


Running Process: 100% | Latency: 0ms


索引与导读

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 被覆盖,其余使用默认值
};

💻结尾--- 核心连接协议

警告: 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠


【📡】 建立深度链接: 关注本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。

【⚡】 能量过载分发: 执行点赞操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。

【💾】 离线缓存核心: 将本页加入收藏。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。

【💬】 协议加密解密:评论区留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。

【🛰️】 信号频率投票: 通过投票发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。



相关推荐
xieliyu.3 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
CryptoPP4 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫4 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
阳区欠5 小时前
【LangChain】LLM基础介绍
开发语言·python·langchain
Jinkxs6 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
晨曦中的暮雨7 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小小编程路7 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
Qt程序员7 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
qeen877 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
CRMEB系统商城7 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php