确定对象被使用前已先被初始化——条款04

C++入门(7)数据类型与运算符3) (2)浮点数 了解了C++的各种整型之后,我们再来看看浮点数类型。浮点数可以代表带有小数部分的数字。 C++有两种表示浮点数的方法。第一种是标准小数表示法,比如0.212,3.2221,9982.031,1.0等。第二种是e表示法。这种也叫科学计数法。其类似于:2.2e10。其中e大小写均可。这个数表示2.2乘以10的10次方。其中,2.2指尾数,10指指数。毋庸置疑,e计数法适用于特别大或者特... 阅读详情

        在C++开发中经常会使用成员变量,有时候会看到既存代码中,在构造函数对内置类型的成员变量进行赋值操作,而没有使用成员初始列。有的甚至没有初始过成员变量,声明之后就直接使用了。

       有的人可能认为内置类型会被自动初始化,所以认为没必要,但是这个可能在某些平台开发时不会自动初始化,因此最好手动初始化所有成员,通常编程规范中也会有这种要求。

   下面主要区分一下赋值和初始化:

    例:   

class ABEntry {
    public:
        ABEntry(const std::string& name, const std::string& address);
    private:
        std::string theName;
        std::string theAddress;
};

ABEntry::ABEntry(const std::string& name, const std::string& address) {
        theName = name;              // 这些是赋值
        theAddress = address;       // 不是初始化
}

上述这种方法虽然也能实现给对象你所期望的值,但这不是最佳做法。

        C++规定,对象成员变量初始化动作发生在进入构造函数本体之前。上述成员变量都是被赋值。初始化发生的时间更早,发生于这些成员的default构造函数被自动调用之时(比进入ABEntry构造函数本体的时间更早)。

所以最佳写法:

ABEntry::ABEntry(const std::string& name, const std::string& address)
:theName(name)
,theAddress(address) 
{
    // 构造函数中不需要其它任何动作
}

        这个构造函数和上一个的最终结果相同,但通常效率较高。上述例子第一个方法,首先调用default构造函数为成员变量设初值,然后再立刻对它们赋值。default构造函数一切作为因此浪费了。

第二种方法就避免了这一问题。

        对大多数类型而言,比起先调用default构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数是比较高效的,有时甚至高效得多。

        初始化成员变量时注意顺序,class的成员变量总是以其声明次序被初始化。有时候成员变量初始化存在依赖关系,比如数组初始化时需要指定大小,因此代表大小的那个成员变量必须先有初值。

        有时候会遇到跨编译单元(两个不同文件成员变量)初始化时问题,这时候使用的技术是将每个non-local-static对象搬到自己的专属函数内(该对象在此函数内被声明为static)。这些函数返回一个reference指向它所含的对象。然后用户调研这些函数,而不直接指涉这些对象。

请记住

  • 为内置型对象进行手工初始化,因为C++不保证初始化它们。
  • 构造函数最好使用成员初始列,而不要在构造函数本体内使用赋值操作。初始列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
  • 为免除“跨编译单元初始化次序”问题,请以local static对象替换non-local static对象。

        在实际项目开发中通常项目编程规范都会明确提出成员变量初始化条款,所以平时开发过程中也需要注意这些细节问题,避免遇到成员变量初始化错误的情况。

C++计算e的x次 C++ 计算e的x次 代码片段 while (p>1e-6) { ex+=p; p=p*x/i; i+=1; } 立即下载

相关推荐

5个实战必备的多模态情感分析数据集(附下载链接与避坑指南)

本文精选了5个实战必备的多模态情感分析数据集,包括CMU-MOSEI、CH-SIMS、UR-FUNNY、MUStARD和IEMOCAP,并提供了详细的下载链接与避坑指南。文章重点介绍了如何高效获取、预处理这些数据集,并自然整合了多模态情感分析的核心热词,旨在帮助研究者和开发者快速启动项目,规避常见陷阱,聚焦模型创新。

yolo5detector的博客 280

C++之科学技术法e使用(一百七十二)

本篇目的:在Android代码中看到带e的科学计数法,分享给大家。

Android系统攻城狮 3532

水气泵控制原理,三角波发生电路,LM331M/TR芯片,高速运放芯片

气泵的控制采用闭环控制,根据气泵的FG反馈信号进行反馈调节,由于气泵的反馈信号是脉冲反馈,即频率改变,占空比不变,即需要通过F/V转换芯片转换成电压信号,变为电压与转速成正比,其电压进入比较器与基准电压进行比较,将比较结果进行运算并进行PWM控制信号。水泵的控制采用闭环控制,根据水泵的pwm信号进行反馈调节,水泵的反馈信号是脉冲反馈,即频率改变,占空比不变,即需要通过F/V转换芯片转换成电压信号,变为电压与转速成反比,其电压进入比较器与基准电压进行比较,将比较结果进行运算并对PWM控制信号。

m0_51010122的博客 2856

ec++的笔记(1) --- 让自己习惯C++

1. Widget w3 = w2; //调用copy构造函数;     w3 = w2;  //调用copy assignment函数;     值传递函数的参数是调用copy构造函数。 2. 视C++为一个语言联邦   C,Object-Oriented C++,Template C++, STL。 3. 对于单纯的常量,最好以const对象或enums替换#defi

kevin_liu11的专栏 794

半桥LLC谐振变换器及同步整流MATLAB仿真(一)

LLC工作原理详细解析,工作过程详细拆解

qq_55203246的博客 3万+

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

[OC]C++计算e(自然常数)

一篇博客让你了解自然常数e

OC溥哥999 4715

【WLAN】【基础知识】WIFI那些事儿之信道和频谱(涵盖2.4G、5G、6G,全网最全)

- 从事WIFI相关开发或测试工作,经常要和信道、频宽、频率等打交道,本文仅将平时涉及的2.4G、5G、6G的信道、频宽、频率等做一总结。 - 一图胜万言,本文汇总了工作中经常用到的频谱图,保证全网最全!!! - 本博客地址,https://blog.youkuaiyun.com/qxhgd,欢迎各位关注,转发请注明出处。

一介草民,只为生活。 1万+

E c++ 笔记

今天看了E c++总结如下:(1) 别让异常逃离析构函数(2) 自定义类型要考虑自我赋值的处理方法(3)singleton模式处理初始化问题(4) 不想编译器的默认行为要明确拒绝(5)应对资源管理的copying行为的四种方式这几个点感觉让我学到很多东西,下面一一详细介绍如下:第一:别让异常逃离析构函数的应用场合是析构函数在执行时抛出异常的时候会导致必要的操作没有做。比如释放资源,关闭数据库连接等等。。。class DBConnection {public: ...static DBConnection c

zhangtonghe的专栏 514

python读取并可视化npy格式的深度图文件以及将其保存为jpg图片的方法

  npy文件是无法直接打开的,它里面包含的是一个矩阵格式的数据,可以用于存储图像。为了对其进行可视化,需要将其转换为图像。这里需要用到numpy包以及matplotlib包,没有的话就pip install一下吧。现进入包含有npy文件的目录(我的该目录下有一个名为0000.npy的文件),然后打开一个终端,执行python进入pythn命令行模式,依次输入如下代码即可: import numpy as np import matplotlib.pyplot as plt depthmap = np.lo

zeeq的博客 5万+

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5849

条款04:确定对象被使用前已先被初始化

Effective C++条款04条款04:确定对象被使用前已先被初始化类构造函数的初始化和赋值区别non-local static对象讨论总结 条款04:确定对象被使用前已先被初始化 永远在使用对象之前先将它初始化。至于内置类型之外的任何其他东西,确保每一个构造函数都将对象的每一个成员初始化。 类构造函数的初始化和赋值区别 #include<iostream> #include<string> using namespace std; class ABEntry { public

weixin_38688399的博客 286

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

条款 04:确定对象被使用前已先被初始化

一、对于

qq_43556776的博客 256

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

条款04:确定对象被使用前先被初始化

Make sure that objects are initialized before they're used 通常如果你使用C part of C++(见条款1)而且初始化可能招致运行期成本,那么不保证发生初始化。一旦进入non-C parts of C++,规则有些变化。这就很好地解释了为什么array(来自C part of C++)不保证其内容被初始化,而vector却有此保证。...

qu1993的博客 200

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Effective C++之条款04:确定对象使用前已先被初始化

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款04:确定对象使用前已先被初始化 Make sure that objects are initialized before they're used. 直接进入正题。 关于“将对象初始化”这事,最佳的处理办...

HakunaMatata的博客 227

Effective C++ 条款 04:确定对象被使用前已先被初始化

使用成员初值列初始化对象的成员变量,避免在构造函数体内进行赋值。确保内置类型的成员变量手动初始化,避免未定义行为。初始化顺序应与成员变量在类中的声明顺序一致。使用局部静态对象替代非局部静态对象,避免跨编译单元的初始化顺序问题。

weixin_42255569的博客 421

条款04:确定对象被使用前已经先被初始化

为内置类型对象手工初始化,因为C++不保证初始化他们 构造函数最好使用构造函数初始值列表,而不要在构造函数体内使用赋值操作,初值列列出的成员变量其次序应该与类中声明次序相同 为了免除‘’跨编译单元之初始化次序‘’问题,请以local static对象替换non-local static对象读取未初始化值会导致不明确行为: int x;在不同位置会出现不同行为,对于内置类型来说,如果在全局作用域声明,

maxwell1990 345

EffectiveC++-条款04:确定对象使用前已先被初始化

确定对象使用前已先被初始化 1. 初始化的烦恼 读取未初始化的变量,会导致不明确的行为。在某些情况下,仅仅是读取未初始化的值,就会让你的程序崩溃。也有可能,读入一些“半随机”的bits,导致你的程序执行不可预测的路线。最终使得自己陷入不愉快的Debug过程。 2. 保证初始化 先谈谈最佳的解决方法:永远在使用对象之前先将他初始化。对于无任何成员的内置类型,你得手动的完成这件事。 以下是例子 int x=100; const char* y="HelloWorld"; double z; std::cin&g

MoOtA 1041

Effective C++条款04:确定对象被使用前已先被初始化

条款04:确定对象被使用前已先被初始化 在这一条款中,我们学到的最重要的一点就是,一定要在定义变量时进行初始化。因为读取未初始化的值会导致不明确的行为。 其实,在这一条款中,我们应该注意到的是,初始化和赋值的区别。在对象的成员函数中,我们常常将赋值和初始化的行为混淆。初始化是发生在对象调用构造函数之前,在构造函数内对变量的操作都是赋值操作。其中,构造函数中进行初始化的方法也就是最重要的初始化列...

Dylan的博客 256
上一篇: 尽量以const、enum、inline替换 #define——条款02
下一篇: 了解C++默默编写并调用哪些函数——条款05
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值