C++11 Object初始化问题

C++11之初始化列表 C++11引入了一项新功能:初始化列表。在C++98中,我们可以使用以下两种方法进行初始化:int i = 0; int j(0);引入“初始化列表”后,我们可以这样进行初始化:int i = {0}; int j{0};上述代码体现不出“初始化列表”的优越来,别着急,我们还可以这样用:std::vector<int> v{ 1, 2, 3, 4 }; std::map<int, float> m 阅读详情

C++11 中 类实例的初始化问题比较复杂。 这里涉及到实例的类型, (static vs non-static), 有没有自定义构造函数等等。

对于static类型(全局变量,namespace变量,类static数据成员,函数static局部成员),class内部的成员变量都会使用默认值初始化.

   //Struct S1 w/o constructor
  struct S1 {
        string a;
        int b;      
    };

    //global S1 object
    S1 s1;

    //S1 object in anonymous namespace
    namespace{ S1 s2; }

    //static member of a class
    struct S{
      static S1 mS;
    };

    S1 S::mS;

    //static local variable of a function
    void f()
    {
       static S1 fs;
       cout<<fs.b<<endl;
    }

   int main() {      

        cout<<s1.b<<endl;       //0

        cout<<s2.b<<endl;       //0

        cout<<S::mS.b<<endl;    //0

        f();                    //0

        return 0;
    }

对于non-static类型的变量,则如果是自定义类型,会调用默认构造函数,对于非用户自定义类型,则不会初始化。

 void f()
 {
      S1 fs;
      cout<<fs.b<<endl;      //输出随机数字
 }


 int main() {      

    S1 s;
    cout<<s.b<<endl;         //输出随机数字

    f();

    return 0;
}

对于non-static类型的变量,如果需要初始化内建类型,可以使用大括号来初始化:

void f()
 {
      S1 fs {};
      cout<<fs.b<<endl;   //0
 }

 int main() {      

    S1 s {};
    cout<<s.b<<endl;     //0

    f();

    return 0;
}

但是对于定义了默认构造函数的类型而言,使用空的大括号相当于调用了默认构造函数,如果用户自定义的默认构造函数没有初始化内建类型的成员变量,那么使用大括号仍然不能初始化内建类型:

//Struct S1 with default constructor
struct S1 {
    string a;
    int b;      
    S1() {}   //定义默认构造函数
};

void f()
 {
      S1 fs;              //调用默认构造函数
      cout<<fs.b<<endl;   //输出随机数字
 }

 int main() {      

    S1 s {};              //{}调用默认构造函数
    cout<<s.b<<endl;     // 输出随机数字

    f();

    return 0;
}

实际上这只是标准对于在这些情形下如何初始化各种类型的成员变量的规定,不同的编译器对于标准的执行会有所不一样,比如对于以上情形,gcc编译器的输出结果都是‘0’,而 VC++编译器的输出和标准也有一些出入,clang的输出则完全符合标准的定义。

Halcon C++ 两种数据结构(Hobject和HTuple) 该文档说明了在Halcon和C++之间如何相互引用数据的问题,即对内存的访问。 立即下载

相关推荐

教你搞懂RT-Thread的移植和配置ENV工具环境

RT-Thread的移植和配置ENV工具环境

Troubadour~的博客 8262

c++ new一个结构体_使用c/c++编写python扩展(三):自定义Python内置类型

系列文章韩冰:使用c/c++编写python扩展(一):定义模块函数与异常​zhuanlan.zhihu.com韩冰:使用c/c++编写python扩展(二)- Vscode Python C++联合调试​zhuanlan.zhihu.com 本文继续介绍使用c/c++编写python扩展。上文介绍了定义Python模块,函数与异常,并且介绍了如何编写setup.py构建和打包。Pyt...

weixin_39985820的博客 2550

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 406

Python源码学习之初始化(二)

在初始化中,调用 void _Py_ReadyTypes(void) { if (PyType_Ready(&PyType_Type) < 0) Py_FatalError("Can't initialize type type"); if (PyType_Ready(&_PyWeakref_RefType) < 0) Py_FatalError(

robin的专栏 3122

5分钟搞定单细胞marker基因气泡图:scDotPlot保姆级教程(含Seurat适配)

本文提供了一份详细的scDotPlot R包使用教程,帮助用户在5分钟内完成单细胞marker基因气泡图的绘制。教程涵盖环境准备、Seurat和SingleCellExperiment对象的适配处理、进阶可视化技巧及自动化报告生成,特别适合生物信息学新手和临床研究者快速掌握这一高效的可视化工具。

weixin_29047545的博客 261

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

C++类和对象(二):对象的初始化和清理

文章目录1 构造函数和析构函数1.1 对象初始化和清理的背景1.2 构造函数和析构函数的特点1.3 构造函数(可重载)1.4 析构函数(不可重载)2 构造函数的分类及调用3 拷贝构造函数调用时机4 构造函数调用规则5 深拷贝与浅拷贝6 初始化列表7 类对象作为类成员8 静态成员 1 构造函数和析构函数 1.1 对象初始化和清理的背景 背景:对象的初始化和清理涉及程序安全。 ①对象或变量使用前若未初始化,则程序运行结果存在不确定性; ②对象或变量使用完毕后若未及时清理,则会导致内存泄露。 1.2 构造函数

NewsomTech 821

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3903

解决qtcreator工程文件例程报错error: cannot initialize object parameter of type ‘QWidget‘ with an expression of

终端手动编译通过不报错,但是qtcreator中编译报错

weixin_50085596的博客 1万+

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

第一章:信号链的精度之战:深入解决电流采样偏差

摘要:本文深入探讨了FOC控制中电流采样偏差问题及其解决方案。电流采样偏差主要来源于偏移误差、增益误差、非线性误差和温漂四大类,其中偏移误差对FOC性能影响最为严重。硬件方面建议采用高精度采样电阻、低失调运放和独立基准电压等设计;软件层面提出了上电自动零点校准、在线实时补偿和模型闭环补偿三种策略。最后介绍了量产自动化校准系统,通过硬件优化和软件补偿相结合,确保每台产品电流采样精度的一致性,为FOC控制奠定坚实基础。

汽车软件开发 602

qt cannot initialize object parameter of type ‘QWidget‘ with an expression of type ‘QMainwindow‘

qtcreator工程文件例程报错error: cannot initialize object parameter of type ‘QWidget’ with an expression of type ‘tab_workface’帮助->关于插件,将ClangCodeModel勾掉,重启qtcreator即可解决。可能因为qt creator4.11.0 based on qt 5.12。

weixin_44685200的博客 3145

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

311

C++11新特性之列表初始化

在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: struct A { int x; int y; }a={1,2}; 这些不同的初始化方法都有各自的适用范围和作用,且对于类来说不能用这种初始化的方法,最主要的是没有一种可以通用的初始化方法适用

hailong0715的专栏 5万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【CPP11新特性,列表初始化】列表初始化与初始化列表是不是一个概念?列表是怎么初始化的?

CPP11列表初始化语法点介绍,列表初始化与初始化列表概念?列表是怎么初始化的简单介绍。

BinaryWiker的博客 1300

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【C++杂货铺】C++11特性总结:列表初始化 | 声明 | STL的升级

本篇文章介绍了C++11中的三个新特性:列表初始化、声明、STL的升级

春人.的博客 6519

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++11 就地初始化与列表初始化

C++11之前,C++主要有以下几种初始化方式://小括号初始化 string str(&amp;amp;quot;hello&amp;amp;quot;);//等号初始化 string str=&amp;amp;quot;hello&amp;amp;quot;;//大括号初始化 struct Studnet{ char* name; int age; }; Studnet s={&amp;amp;quot;dablelv&amp

Doublelv 的博客专栏。 1万+

【C++11】列表初始化

详细讲解C++11——列表初始化

tan_run的博客 1077

C++11列表初始化 {}

C++11引入的列表初始化{}提供了一种统一、安全的初始化方式,具有以下核心特性:1)统一语法,适用于基本类型、数组、结构体、类和容器;2)禁止窄化转换,防止数据精度丢失;3)支持通过std::initializer_list实现容器批量初始化。相较于传统初始化方式,列表初始化显著简化了代码,提高了安全性,特别是在容器初始化和类型转换方面表现突出。该特性使C++的初始化语法更加现代化和规范化。

TTKunn的博客 1649

C++11之列表初始化

C++11是C++的第⼆个主要版本,并且是从C++98起的最重要更新。• C++11列表初始化的本意是想实现⼀个⼤统⼀的初始化⽅式,其次他在有些场景下带来的不少便 利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。匿名对象和临时对象的区别:匿名对象是我们手动创建的,临时对象是编译器生成的,共同特点是都具有常性,都只能给给const引用,不能给普通引用。• 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最后优化 了以后变成直接构造。

Octopus2077的博客 1065

【C++11】之列表初始化

在 C++98 中,列表初始化是通过使用花括号{}对数组或结构体元素进行初始化的一种语法。这种语法的引入使得初始化操作更为统一,并提供了一种清晰而简洁的方式。然而,在 C++98 中,这种初始化方式的适用范围相对有限,仅限于数组和结构体。是 C++11 引入的一种用于表示初始化列表的标准库类型。它的主要作用是作为构造函数的参数,方便地进行初始化操作。通过统一列表初始化和的引入,C++11在初始化方面提供了更为一致、灵活和方便的语法,为代码编写和维护带来了显著的便利。

m0_61476090的博客 1418

C++11 列表初始化

C++11之前主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello"; //POD对象与POD数组列表初始化 struct Studnet { char* name; int age; }; Studnet s={"dablelv",18}; //纯数据(Plain of Data,PO...

xupeng1644的博客 1888

C++11之初始化成员变量

C++98中的成员变量初始化 在声明类的时候,对于静态类型并且是常量类型,同时是枚举或者是整型的变量可以使用=在声明时初始化。 对于不符合上述要求的静态变量可以在类外使用=进行初始化 对于非静态类型可以说个初始化列表进行初始化 使用()对自定义类型进行初始化 使用{}对元素集合统一初始化 C++11中的成员变量初始化在C++11中可以使用=或者{}就地初始化,类似于Java语言。 代码示例stru

StephenZou14的博客 1万+

《C++11》各种初始化方式的详细列举与对比

窄化转换(Narrowing Conversion)是指将一个较大范围的类型转换为一个较小范围的类型,这种转换可能会导致数据丢失。例如,将double转换为int,或者将long转换为short。在 C++11 中,可以在类的定义中直接使用列表初始化来初始化非静态成员变量。这种方式使得类的构造更加简洁和直观。命名初始化(Named Initialization)是指在初始化结构体或类时,可以为成员指定名称。这种特性在 C++20 中得到了正式支持,但在 C++11 中并没有直接的命名初始化语法。

码事漫谈 951

c++11:就地初始化与列表初始化

选自: https://blog.youkuaiyun.com/K346K346/article/details/55194246 https://www.cnblogs.com/lsgxeva/p/7787245.html 还可以看看: https://blog.youkuaiyun.com/lixiaogang_theanswer/article/details/82563961 1.就地初始化 1.1简...

qq_41543888的博客 2641
上一篇: Bit field
下一篇: C++ function template name binding
小马识图
博客等级 码龄18年 8粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值