类初始化方法

news2025/5/14 21:55:36

一、类初始化方法

成员初始化列表
class Point {
    int x, y;
public:
    Point(int a, int b) : x(a), y(b) {}
};
就地初始化(C++11+)
声明时初始化。
class Widget {
    int size = 10; // 类内成员初始化
    vector<int> data{1,2,3};
};
特殊情况:静态成员初始化
class Logger {
    static int count; // 声明
    inline static int a = 1; // C++17后支持内联静态
};
int Logger::count = 0; // 类外定义
构造函数中初始化
委托构造函数(C++11+)
class Circle {
    double radius;
public:
    Circle() : Circle(1.0) {} // 委托给带参构造
    Circle(double r) : radius(r) {}
};

二、初始化顺序规则

1. 类成员初始化顺序
  • 声明顺序优先:成员变量按类内声明顺序初始化(与初始化列表顺序无关)
class Danger {
    int a = b + 1; // 未定义行为!
    int b = 2;
};
2. 继承体系顺序
  1. 虚基类(按继承图拓扑顺序)
  2. 直接基类(按声明顺序)
  3. 成员变量(按声明顺序)
  4. 构造函数体执行
3. 静态成员初始化
  • 在main函数前初始化(存在静态初始化顺序问题)
  • C++17支持内联初始化:
class Config {
    inline static string path = "/default"; // C++17
};

三、各初始化方法的优势对比

方法优点适用场景
成员初始化列表避免二次赋值,支持const/引用成员复杂对象构造
就地初始化统一默认值,避免构造函数重复多构造函数的类
构造函数内初始化能够申请资源需要额外申请资源的情况
委托构造函数减少代码重复构造函数存在公共逻辑
静态成员类外初始化明确初始化位置非constexpr静态成员

四、关键优势解析

  1. 效率优化
    成员初始化列表直接构造成员,避免默认构造+赋值的双重消耗:
// 低效方式
Student::Student(string n) {
    name = n; // 先执行string的默认构造,再operator=
}

// 高效方式
Student::Student(string n) : name(n) {} // 直接调用拷贝构造
  1. 强制正确性
    对const成员和引用成员必须使用初始化列表:
class ConstDemo {
    const int id;
    int& ref;
public:
    ConstDemo(int n, int& r) : id(n), ref(r) {}
};
  1. 规避初始化顺序陷阱
    通过声明顺序控制依赖关系:
class SafeInit {
    Database db;      // 先初始化数据库连接
    DataCache cache;  // 再初始化缓存(依赖数据库)
public:
    SafeInit() : db(), cache(db) {}
};
  1. 多态基础保障
    基类先于派生类初始化:
class Base {
public:
    Base() { cout << "Base init\n"; }
};

class Derived : public Base {
public:
    Derived() { cout << "Derived init\n"; }
};
// 输出顺序:Base init → Derived init

五、特殊场景处理

1. 虚继承初始化
class A { public: A() { cout << "A"; } };
class B : virtual public A { public: B() { cout << "B"; } };
class C : virtual public A { public: C() { cout << "C"; } };
class D : public B, public C {};

D d; // 输出顺序:A B C(虚基类只初始化一次)
2. 异常安全

在构造函数中抛出异常时,已构造的成员会自动销毁:

class FileHandler {
    FILE* f;
    Mutex m;
public:
    FileHandler(const char* name) 
        : f(fopen(name, "r")), m(Mutex()) {
        if(!f) throw runtime_error("Open failed");
        // 若此处抛出异常,已构造的m会被正确销毁
    }
};

六、最佳实践建议

  1. 优先使用成员初始化列表,特别是对于:
    • const成员
    • 引用成员
    • 没有默认构造的类成员
  2. 严格保持声明顺序与初始化列表顺序一致,避免误解
  3. 复杂对象使用二次初始化
class ImageProcessor {
    vector<Filter> filters;
public:
    ImageProcessor() {
        // 分步骤初始化复杂成员
        filters.reserve(10);
        filters.emplace_back(FilterType::BLUR);
        filters.emplace_back(FilterType::SHARPEN);
    }
};
  1. 静态成员采用Meyer’s Singleton模式(C++11+):
class GlobalConfig {
public:
    static Config& instance() {
        static Config cfg; // 线程安全初始化
        return cfg;
    }
};

掌握类初始化的正确方法,能够有效避免资源泄漏、提升程序性能,并为复杂对象系统奠定可靠基础。实际开发中应结合具体需求,灵活选择最适合的初始化策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV】imread函数的简单分析

目录 1.imread()1.1 imread()1.2 imread_()1.2.1 查找解码器&#xff08;findDecoder&#xff09;1.2.2 读取数据头&#xff08;JpegDecoder-->readHeader&#xff09;1.2.2.1 初始化错误信息&#xff08;jpeg_std_error&#xff09;1.2.2.2 创建jpeg解压缩对象&#xff08;…

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …

【笔记】BCEWithLogitsLoss

工作原理 BCEWithLogitsLoss 是 PyTorch 中的一个损失函数&#xff0c;用于二分类问题。 它结合了 Sigmoid 激活函数和二元交叉熵&#xff08;Binary Cross Entropy, BCE&#xff09;损失在一个类中。 这不仅简化了代码&#xff0c;而且通过数值稳定性优化提高了模型训练的效…

关于Go语言的开发环境的搭建

1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程&#xff0c;类似于java的开发环境搭建&#xff0c;我们都是需要去安装这个开发工具包的&#xff0c;也就是俗称的这个SDK&#xff0c;他是对于我们的程序进行编译的&#xff0c;不然我们写的这个代码也是跑不起来…

Flutter PIP 插件 ---- 为iOS 重构PipController, Demo界面,更好的体验

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自动进入PIP Mode 项目地址 PIP&#xff0c; pub.dev也已经同步发布 pip 0.0.3&#xff0c;你的加星和点赞&#xff0c;将是我继续改进最大的动力 在之前的界面设计中&#xff0c;还原动画等体验一…

数据库管理-第325期 ADG Failover后该做啥(20250513)

数据库管理325期 2025-05-13 数据库管理-第325期 ADG Failover后该做啥&#xff08;20250513&#xff09;1 故障处置2 恢复原主库3 其他操作总结 数据库管理-第325期 ADG Failover后该做啥&#xff08;20250513&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&a…

SQLi-Labs 第21-24关

Less-21 http://127.0.0.1/sqli-labs/Less-21/ 1&#xff0c;抓个请求包看看 分析分析cookie被base64URL编码了&#xff0c;解码之后就是admin 2&#xff0c;那么这个网站的漏洞利用方式也是和Less-20关一样的&#xff0c;只是攻击语句要先base64编码&#xff0c;再URL编码&…

PVE WIN10直通无线网卡蓝牙

在 Proxmox VE (PVE) 中直通 Intel AC3165 无线网卡的 **蓝牙模块**&#xff08;通常属于 USB 设备&#xff0c;而非 PCIe 设备&#xff09;需要特殊处理&#xff0c;因为它的蓝牙部分通常通过 USB 连接&#xff0c;而 Wi-Fi 部分才是 PCIe 设备。以下是详细步骤&#xff1a; …

第六节第二部分:抽象类的应用-模板方法设计模式

模板方法设计模式的写法 建议使用final关键字修饰模板方法 总结 代码&#xff1a; People(父类抽象类) package com.Abstract3; public abstract class People {/*设计模板方法设计模式* 1.定义一个模板方法出来*/public final void write(){System.out.println("\t\t\t…

在另一个省发布抖音作品,IP属地会随之变化吗?

你是否曾有过这样的疑惑&#xff1a;出差旅游时在外地发布了一条抖音视频&#xff0c;评论区突然冒出“IP怎么显示xx省了&#xff1f;”的提问&#xff1f;随着各大社交平台上线“IP属地”功能&#xff0c;用户的地理位置标识成为公开信息&#xff0c;而属地显示的“灵敏性”也…

卷积神经网络-从零开始构建一个卷积神经网络

目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…

uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘

uniapp-文件查找失败&#xff1a;‘dcloudio/uni-ui/lib/uni-icons/uni-icons.vue’ 今天在HBuilderX中使用uniapp开发微信小程序时遇到了这个问题&#xff0c;就是找不到uni-ui组件 当时创建项目&#xff0c;选择了一个中间带的底部带选项卡模板&#xff0c;并没有选择内置u…

Vue2.x 和 Vue3.x 对比-差异

Vue3的优点 diff算法的提升 vue2中的虚拟DOM是全量的对比&#xff0c;也就是不管是写死的还是动态节点都会一层层比较&#xff0c;浪费时间在静态节点上。 vue3新增静态标记&#xff08;patchflag &#xff09;&#xff0c;与之前虚拟节点对比&#xff0c;只对比带有patch fla…

MacOS 用brew 安装、配置、启动Redis

MacOS 用brew 安装、配置、启动Redis 一、安装 brew install redis 二、启动 brew services start redis 三、用命令行检测 set name tom get name

agentmain对业务的影响

前面一篇已经说了java agent技术主要有premain和agentmain两种形式&#xff0c;如果大部分业务已经在线上运行的话&#xff0c;不方便用premain的方式来实现&#xff0c;所以agentmain的方式是更加通用、灵活的 由于RASP是与用户业务运行在同一个jvm中的 &#xff0c;所以RASP…

uniapp小程序轮播图高度自适应优化详解

在微信小程序开发过程中&#xff0c;轮播图组件(swiper)是常用的UI元素&#xff0c;但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程&#xff0c;特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…

基于ESP32控制的机器人摄像头车

DIY Wi-Fi 控制的机器人摄像头车&#xff1a;从零开始的智能探索之旅 在当今科技飞速发展的时代&#xff0c;机器人技术已经逐渐走进了我们的生活。今天&#xff0c;我将带你一起探索如何制作一个 Wi-Fi 控制的机器人摄像头车&#xff0c;它不仅可以远程操控&#xff0c;还能通…

基于STM32的LCD信号波形和FFT频谱显示

一、项目准备 主要利用LCD驱动中的画点和画连线函数&#xff0c;驱动是正点原子给我写好了的画点和画线的函数等些相关函数 void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //画圆 void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //画线 二、画波形图函数实…

(9)被宏 QT_DEPRECATED_VERSION_X_6_0(“提示内容“) 修饰的函数,在 Qt6 中使用时,会被编译器提示该函数已过时

&#xff08;1&#xff09;起因是看到 Qt 的官方源代码里有这样的写法&#xff1a; #if QT_DEPRECATED_SINCE(6, 0) //里面的都是废弃的成员函数QT_WARNING_PUSHQT_WARNING_DISABLE_DEPRECATEDQT_DEPRECATED_VERSION_X_6_0("Use the constructor taking a QMetaType inst…

关于mac配置hdc(鸿蒙)

关于mac配置hdc(鸿蒙) 在最开始配置的hdc -v时候老是出现格式不匹配 于是乎在网上找官网也不行&#xff0c;最后在csdn上找到了这篇文章Mac配置hdc才有的头绪 环境变量的问题 自己做一个简单的总结 首先在访达里面打开ide 打开之后输入下面的命令&#xff0c;一步一步的找…