博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11 Object初始化问题
阅读量:4195 次
发布时间:2019-05-26

本文共 1087 字,大约阅读时间需要 3 分钟。

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<
<

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

void f() {      S1 fs;      cout<
<

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

void f() {      S1 fs {};      cout<
<

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

//Struct S1 with default constructorstruct S1 {    string a;    int b;          S1() {}   //定义默认构造函数};void f() {      S1 fs;              //调用默认构造函数      cout<
<

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

转载地址:http://dxgoi.baihongyu.com/

你可能感兴趣的文章
Docker 容器化技术介绍(一) 之 虚拟化技术
查看>>
Docker 容器化技术介绍(二) 之 Docker 简介
查看>>
Docker 容器化技术介绍(三) 之 Docker 组件
查看>>
Docker 容器化技术介绍(四) 之 Docker的安装与启动
查看>>
Docker 容器化技术介绍(五) 之 Docker 镜像操作
查看>>
Docker 容器化技术介绍(六) 之 Docker 容器操作
查看>>
Docker 容器化技术介绍(七) 之 Docker 应用部署
查看>>
Docker 容器化技术介绍(八) 之 Docker 备份与迁移
查看>>
ffmpeg 转码线程数的控制
查看>>
Docker 容器化技术介绍(九) 之 Docker 安装指定版本安装包
查看>>
python 能不能像执行 .exe 文件一样执行 .py 文件呢?
查看>>
Android studio 视频播放(利用Android原生的videoview)
查看>>
“mediacodec” 报错 “No Java virtual machine has been registered”
查看>>
Android Studio 常用系统设置
查看>>
GO语言开发之JSON处理 编码JSON 与 解码JSON
查看>>
爱奇艺 视频编码信息参考
查看>>
x265 视频编码默认参数
查看>>
ffmpeg 视频倍速播放 和 慢速播放
查看>>
x264 高级编码参数
查看>>
ffmpeg 分析两个视频的 psnr 和 ssim
查看>>