C++11 新特性 ---- 类成员的快速初始化

news2024/11/22 6:19:24

一、类成员的快速初始化

1.C++98 标准的类成员初始化

① 初始化类中的静态成员常量("就地声明"):

类声明 : 等号 = 加初始值  

② 初始化类中的非静态成员变量:

初始化 : 必须在构造函数中进行 
#include <iostream>
using namespace std;
/*
    C++98 标准的类成员初始化
    初始化类中的静态成员常量("就地声明"):
        类声明 : 等号 = 加初始值  
    初始化类中的非静态成员变量:
        必须在构造函数中进行
*/
// 按照C++98 标准来解读
class Base {
public:
    int a;
    int b = 1;                           //类的非静态成员,必须在构造函数中进行初始化
    static int c = 2;                    //类的静态成员,必须在类的外部进行初始化
    static const double d = 3.14;        //类的静态常量成员,但不是整型或者枚举,无法通过编译
    static const char* p = "I am Sakura";//类的静态常量成员,但不是整型或者枚举,无法通过编译
    const static int e = 0;
};

int main(){
    Base b;
    return 0;
}

为什么static const double d = 3.14,也就是初始化double类型的静态常量可以通过编译呢?

实际是 GNU 对C++的一个扩展,并不遵从C++ 标准。

>>修正

#include <iostream>
using namespace std;
// 按照C++98 标准来解读
class Base {
public:
    int a;
    int b;//类的非静态成员,必须在构造函数中进行初始化
    Base(){
        b = 1;
    }
    static int c;
    static const double d;
    static const char* const p;
    const static int e = 0;
};

//对类的静态成员,必须在类的外部进行初始化
int Base::c = 110;
const double Base::d = 3.14;
const char* const Base::p = "I am Sakura";

int main(){
    Base b;
    return 0;
}

>>总结:

>>类的非静态成员,必须在构造函数中进行初始化

>>类的静态成员,必须在类的外部进行初始化

2.C++11 标准的类成员初始化

2.1 初始化类的非静态成员

#include <iostream>
using namespace std;
/*
    C++11 标准的类成员初始化
    初始化类中的非静态成员变量:
        ① 允许在定义类的时在类内部直接对非静态成员变量进行初始化
        ② 初始化时,可以使用 等号= ,也可以使用 花括号{}
*/
class Test {
private:
    int a = 1;
    int b = {2};
    int c{3};
    double arr1[4] = {3.14,3.15,3.16,3.17};
    double arr2[4] = {3.14,3.15,3.16,3.17};
    string s1("heheda");//error: expected identifier before string constan
    string s2{"hello,heheda!!!"};
};

int main() {
    Test t;
    return 0;
}

【总结】使用花括号{}对类的非静态成员初始化, 可以省略等号

string s1("heheda");发生错误,不能使用小括号()初始化对象,应使用花括号{}

2.2 类内部赋值和初始化列表

① C++11 可以对类内部的非静态成员就地初始化

#include <iostream>
using namespace std;
/*
    C++11 标准的类成员初始化
    2.2 类内部赋值和初始化列表
        ① C++11 可以对类内部的非静态成员就地初始化
*/
class Init{
public:
    int a = 1;
    int b = 2;
    int c = 3;
};

int main() {
    Init tmp;
    cout << "a: " << tmp.a << ", b: " << tmp.b << ", c: " << tmp.c << endl;
    return 0;
};

② 使用初始化列表对类的非静态成员进行初始化

#include <iostream>
using namespace std;
/*
    C++11 标准的类成员初始化
    2.2 类内部赋值和初始化列表
        ① C++11 可以对类内部的非静态成员就地初始化
        ② 使用初始化列表对类的非静态成员进行初始化
*/
class Init{
public:
    Init(int x,int y,int z) : a(x),b(y),c(z) {}
    int a = 1;
    int b = 2;
    int c = 3;
};

int main() {
    Init tmp(10,20,30);
    cout << "a: " << tmp.a << ", b: " << tmp.b << ", c: " << tmp.c << endl;
    return 0;
};

【总结】在类内部就地初始化和初始化列表并不冲突(程序正常运行)。看起来是:通过初始化列表指定的值会覆盖就地初始化时指定的值。

学习和参考一下文章:

类成员的快速初始化 | 爱编程的大丙 (subingwen.cn)icon-default.png?t=N6B9https://subingwen.cn/cpp/quick_init/

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

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

相关文章

无涯教程-Perl - 格式化

Perl使用称为“formats”的模板来输出内容。要使用Perl的格式函数&#xff0c;必须先定义一种格式&#xff0c;然后才能使用该格式写入格式化的数据。 定义格式 以下是定义Perl格式的语法- format FormatName fieldline value_one, value_two, value_three fieldline value…

vue3中CompositionApi理解与使用

CompositionApi&#xff0c;组合式API&#xff0c;相当于react中hooks&#xff0c;函数式。 优势&#xff1a;1&#xff0c;增加了代码的复用性&#xff08;类似mixin&#xff0c;slot&#xff0c;高阶组件功能&#xff09; 2&#xff0c;代码可读性更好。可以将处理逻辑和视图…

75. 颜色分类

题目链接&#xff1a;力扣 解题思路&#xff1a;因为整个nums数组中只有0&#xff0c;1&#xff0c;2三个数组成。对nums升序排序后&#xff0c;0一定都在数组的最左边&#xff0c;2一定都在数组的最右边&#xff0c;1在数组的中间。那么只需要将0移动到数组的左边&#xff0c;…

西电-印刷电路板(PCB)设计指南0903完整版

PCB设计是以电路原理图为根据,实现电路设计者所需要的功能。 最近我找到一份西安电子科技大学的PCB设计指南的课件,课件内容非常夯实详尽: 分为通用电路篇和高速电路篇,包含了: PCB基础知识 PCB设计步骤和规范 电流路径分析、常见类型PCB设计 传输线与阻抗匹配、信号…

【Linux】【预】配置虚拟机的桥接网卡+nfs

【Linux】【预】配置虚拟机的桥接网卡 1. 配置VM虚拟机的桥接网络2 配置Win10中的设置3.配置Linux中的IP4. 串口连接开发板&#xff0c;配置nfs5 修改网络文件6 验证nfs 是否成功总结 1. 配置VM虚拟机的桥接网络 右击设置&#xff0c;选择添加网络&#xff0c;按照如下顺序操作…

解决Vs Code工具开发时 保存React文件时出现乱码情况

Vs Code工具开发时 保存React文件时出现乱码情况 插件库搜索:JS-CSS-HTML Formatter 把这个插件禁用或者卸载就解决保存时出现乱码的问题了; 如果没有解决,再看下面方案! 出现乱码问题通常是因为文件的编码格式不正确。您可以尝试以下解决方法&#xff1a; 确认文件编码格式&a…

泛型和通配符

目录 1. 什么是泛型 2. 泛型是如何编译的&#xff1f; 3. 泛型的上界 小栗子1&#xff1a; 小栗子2&#xff1a; 4. 泛型方法 5. 通配符 小栗子&#xff1a; 错误的做法和原因&#xff1a; 6. 通配符的上界&#xff08;多用来取数据&#xff09; 7. 通配符的下界&am…

【C#学习笔记】类型转换

文章目录 类型转换字符转数字GetNumericValueConvert.ToInt32隐式转换计算 字符串转数字Parse 或 TryParse 方法 字节数组转整数 as&#xff0c;is强制类型转换isas 用户定义的转换 类型转换 我们简单地将值类型分为5种&#xff1a;整数型&#xff0c;浮点型&#xff0c;布尔型…

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介 Percona XtraBackup是一个开源的MySQL和MariaDB数据库备份工具&#xff0c;它能够创建高性能、一致性的备份&#xff0c;并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下&#xff0c;复制InnoDB存储引擎的数据文件和事务日…

react18之08自定义hook (简单的axios-get、修改浏览器title、localStorage、获取滚动条位置、img转换为base64)

目录 react18之自定义hook ()01&#xff1a;自定义一个 简单的axios hook 发起get请求useHttp.jsx使用useHttp hook效果 02&#xff1a;自定义一个 修改浏览器title hook03&#xff1a;自定义一个 localStorage(获取、存储、移除) hookuseLocalStorage.jsx使用hook效果 04&…

【JVM】 垃圾回收篇——自问自答(1)

Q什么是垃圾&#xff1a; 运行程序中&#xff0c;没用任何指针指向的对象。 Q为什么需要垃圾回收&#xff1f; 内存只分配&#xff0c;不整理回收&#xff0c;迟早会被消耗完。 内存碎片的整理&#xff0c;为新对象腾出空间 没有GC程序无法正常进行。 Q 哪些区域有GC&#…

【C++学习】STL容器——list

目录 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比…

On Evaluation of Embodied Navigation Agents 论文阅读

论文信息 题目&#xff1a;On Evaluation of Embodied Navigation Agents 作者&#xff1a;Peter Anderson&#xff0c;Angel Chang 来源&#xff1a;arXiv 时间&#xff1a;2018 Abstract 过去两年&#xff0c;导航方面的创造性工作激增。这种创造性的输出产生了大量有时不…

idea-Invalidate caches选项

Clear file system cache and Local History: 清除 IntelliJ IDEA 缓存和本地历史记录&#xff0c;注意要保存现有的信息 Clear VCS Log caches and indexes: remove the cache and indexes of the VCS Log. 这个选项的意思是清除版本控制系统日志的缓存和索引。VCS Log 是 In…

VBA技术资料MF40:VBA_计数筛选状态的数据行数

【分享成果&#xff0c;随喜正能量】人唯有与喜欢的事物发展关系&#xff0c;不管是人或者是物还是事&#xff0c;包括喜欢自己外表、个性的部分&#xff0c;喜欢自己做的事&#xff0c;喜欢自己的创造&#xff0c;喜欢的风景……才给人带来对自己的认同。在与喜欢的事物互动关…

从小白到数据库达人!Mysql优化让你的社招面试无往不利!

大家好&#xff0c;我是小米&#xff0c;在这个美好的时刻又迎来了我们的技术小窝。今天&#xff0c;我们要聊一聊一个在数据库领域中无比重要的话题 —— Mysql 优化&#xff01;是不是感觉很兴奋呢&#xff1f;废话不多说&#xff0c;让我们直接进入今天的主题。 背景知识 …

Hadoop理论及实践-HDFS的Namenode及Datanode(参考Hadoop官网)

HDFS有什么特点&#xff0c;被设计做什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。有一下几个特点&#xff1a; HDFS是一个高度容错性的系统&#xff0c;具有高容错、高可靠性、高扩展性的特点&#xff0c;适合部…

2.两数相加(题解)

两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都…

数学建模—多元线性回归分析(+lasso回归的操作)

第一部分&#xff1a;回归分析的介绍 定义&#xff1a;回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的人数就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释…

MongoDB 使用总结

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…