当前位置: 首页 > news >正文

Item4--确定对象被使用前已先被初始化

  1. 初始化 vs. 赋值

在 C++ 中,初始化 发生在对象获得其初值时,赋值 发生在对象已经存在后再给它赋新值。对于大多数用户自定义类型,初始化效率高于赋值。

初始化 (Initialization):通过构造函数或初始化列表完成。

std::string s("Hello"); // 调用 std::string(const char*) 构造函数

赋值 (Assignment):通过 operator= 完成。

std::string s;          // 先默认构造 (Initialization)
s = "Hello";            // 再调用 operator= (Assignment)

如果 s 是一个复杂对象,赋值操作会多出一次默认构造的开销,导致效率降低。

  1. 构造函数中初始化成员的正确方法

对于类成员变量,确保初始化的唯一方法是使用 成员初始化列表 (Member Initialization List)。

❌ 错误/低效的做法(赋值)

在构造函数体内部对成员进行赋值:

// 假设 Name 是一个复杂的类
class Person {
   std::string name;
public:
   Person(const std::string& n) {
       name = n; // ❌ 慢!先调用 name 的默认构造函数,然后调用 operator=
  }
};
✅ 高效且正确的做法(初始化列表)

成员变量会先根据初始化列表中的值进行构造:

class Person {
   std::string name;
   int age;
public:
   // ✅ 好!直接调用 std::string 的拷贝构造函数
   Person(const std::string& n, int a) : name(n), age(a) {}
};
⚠️ 成员初始化顺序陷阱

成员变量的实际初始化顺序只取决于它们在类中 声明 (Declaration) 的顺序,与初始化列表中的顺序无关。

这可能导致微妙的错误:

class MyClass {
   int y;
   int x; // ❌ x 在 y 之后声明

public:
   // 尽管列表里 x 在 y 前,但实际是先初始化 y,后初始化 x
   MyClass(int a) : x(a), y(x) {} // Bug: y 会使用一个未初始化的 x 来初始化
};

为了避免这种混淆,最佳实践是让初始化列表的顺序与成员变量的声明顺序保持一致。

3.局部静态对象解决方案

在设计模式/创建型设计模式/单例模式有详细解读

http://www.jsqmd.com/news/115896/

相关文章:

  • string_view
  • 当K3s遇见RustFS:轻量级边缘存储方案的探索与实践
  • 比话降AI靠谱吗?比话能降知网AI率吗? - 还在做实验的师兄
  • 树形背包
  • 八皇后问题
  • 好用做老房换新实用门窗品牌精选指南的机构
  • 基于MinIO Java SDK实现ZIP文件上传的方案与实践
  • 欧盟斥资亿欧元发布AI战略,加速产业应用与科研创新
  • 性价比高的老房换新实用门窗品牌精选指南排名
  • C++新特性
  • 快去尝试单尺作图内接正257边形吧
  • 互联网大厂Java面试:从Spring Boot到微服务架构的技术探讨
  • 使用自定义注解校验请求参数
  • 12月20日总结 - 作业----
  • python django flask嗨玩-旅游线路社区交流商城网站_mvyi06ne--论文
  • 熬夜刷手机不愿睡觉,这是一种心理问题吗?
  • 性价比高的循环水处理专业的源头厂家
  • 第10章 泛型算法
  • enum class
  • C020基于博途西门子1200PLC鸡饲料生产线控制系统仿真
  • 共享资源和实例数据-–-behaviac
  • 专业的康有利到家理疗小程序哪家好
  • 云计算IP大纲
  • 第9章 顺序容器
  • 回眸的狼耳圣女与荧光百合
  • 基于SpringBoot+Vue的乡镇农村建设用地管理系统的设计与实现
  • 空操作节点-–-behaviac
  • Git 与 SVN 区别 - 详解
  • 第四章 作业
  • 亲测十大灵活用工平台复盘