[C++11]统一的数据初始化方式 - 初始化列表

关于C++中的变量,数组,对象等都有不同的初始化方法,在这些繁琐的初始化方法中没有任何一种方式适用于所有的情况。为了统一初始化方式,并且让初始化行为具有确定的效果,在C++11中提出了列表初始化的概念。

代码如下:

#include<iostream>
#include <string>
using namespace std;class Person
{
public:Person (int a):age(a){}Person (int a,string b):age(a),name(b){}int getAge(){return age;}string getName(){return name;}private:int age;string name;
};int main()
{Person p{ 23 };cout << p.getAge() << endl;Person p1{ 24,"Tom" };cout << "name = " << p1.getName() << " age = " << p1.getAge() << endl;int a{ 23 };cout << a << endl;int b = { 24 };cout << b << endl;int array[] = { 1,2,3,4,5 };int *ptr = new int{ 250 };cout << *ptr << endl;int *array01 = new int[3]{ 1,2,3 };double c = double{ 23.12 };//看起来更加直观cout << c << endl;return 0;
}

测试结果:

在这里插入图片描述

使用初始化列表初始化聚合类型的变量

聚合类型:

1.普通数组本身可以看做是一个聚合类型。

#include <iostream>
#include <string>
using namespace std;int main()
{int x[] = { 1,2,3,4,5 };double y[3][3] = { {1.1,2.2,3.3},{4.4,5.5,6.6},{7.7,8.8,9.9} };char carry[] = { 'a','b','c','d' };string sarry[] = { "hello","world","shijie" };return 0;
}

满足以下条件的类(class,struct,union)可以被看做是一个聚合类型:

1.无用户自定义的构造函数

2.无私有或保护的非静态数据成员

场景1:类中有私有成员,无法使用初始化列表初始化

代码如下:

struct T1
{int x;long y;
protected:int z;
}t{1,100,2};//error,类中有私有成员,无法使用初始化列表初始化

场景2:类中有静态成员可以使用初始化列表,但初始化列表不能初始化静态成员变量

代码如下:

struct T2
{int x;long y;
protected:static int z;
}t{1,100,2};//error

结构体中的静态变量z不能使用初始化列表进行初始化,它的初始化遵循静态成员的初始化方式。

代码如下:

struct T2
{int x;long y;
protected:static int z;
}t{113,2312};int T2::z = 3;

3.无基类
4.无虚函数
5.类中不能有使用{}和 = 直接初始化的非静态数据成员(从C++14就开始支持了)

代码如下:

#include <iostream>
using namespace std;struct T3
{
public:int a = 5;int array[3]{ 1,2,3 };int c;
};int main()
{T3 t{ 11,{2,3,4},12 };//从C++14开始支持了cout << t.a << " " << t.c << endl;for (int i = 0; i < 3; i++){cout << t.array[i] << " ";}cout << endl;return 0;
}

测试结果:

在这里插入图片描述

使用初始化列表初始化非聚合类型的对象

对于非聚合类,我们必须提供一个对应的构造函数,才能用初始化列表对其初始化。

代码如下:

#include <iostream>
#include <string>
using namespace std;class Person
{
public:private:int age;string name;
};int main()
{Person p{ 18,"Tom" };//errorreturn 0;
}

测试结果:

在这里插入图片描述
代码如下:

#include <iostream>
#include <string>
using namespace std;class Person
{
public:Person(int a,string b):age(a),name(b){}int getAge(){return age;}string getName(){return name;}Person getPerson(){return { 12,"Jack" };//OK}private:int age;string name;
};int main()
{Person p{ 18,"Tom" };//OKcout << p.getAge() << " " << p.getName() << endl;return 0;
}

测试结果:

在这里插入图片描述

注意:
聚合类型的定义并非递归的,也就是说当一个类的非静态成员是非聚合类型时,这个类也可能是聚合类型。

代码如下:

#include <iostream>
using namespace std;struct T1
{int x;double y;
private:int z;
};struct T2
{T1 t1;long x;double y;
};int main()
{T2 t2{ {},520,13.14 };return 0;
}

可以看到,T1并非一个聚合类型,因为它有一个private的非静态成员,但是尽管T2有一个非聚合类型的非静态成员t1,T2依然是一个聚合类型,可以直接使用初始化列表。

最后强调一下t2对象的初始化过程,对于非聚合类型的成员t1做初始化的时候,可以直接写一对空的{},这相当于调用是T1的无参构造函数。

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

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

相关文章

Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

说到聚集索引&#xff0c;我想每个码农都明白&#xff0c;但是也有很多像我这样的伪程序员&#xff0c;只能用死记硬背来解决这个问题&#xff0c;什么表中只能建一个聚集索引&#xff0c;然后又扯到了目录查找来帮助读者记忆。。。。问题就在这里&#xff0c;我们不是学文科&a…

懂「互联网语」的程序员,是个狠人。

借用一下时下很火的「互联网语」做程序员的乐趣是只有进场的人才能获得的红利与程序员相处绝对是令人WOW的用户体验但是别真信那些个程序员说的话哪怕有无数江湖传言为他背书不然你良久建立的心智模型会在瞬间就崩塌毕竟头部程序员和腰腿部程序员之间的壁垒打通不了也许你暂时还…

c语言oj合法标识符,YTUOJ-C语言合法标识符

Description输入一个字符串&#xff0c;判断其是否是C的合法标识符。Input输入数据包含多个测试实例&#xff0c;数据的第一行是一个整数n,表示测试实例的个数&#xff0c;然后是n行输入数据&#xff0c;每行是一个长度不超过50的字符串。Output对于每组输入数据&#xff0c;输…

[C++11]initializer_lisr模板类的使用

代码如下: #include <iostream> using namespace std;void func(initializer_list<int> ls) {auto it ls.begin();for (; it ! ls.end(); it){cout << *it << " ";}cout << endl; }int main() {func({ 1,2,5,12,23 });return 0; }测…

linux tcp 创建,Linux下tcp服务器创建的步骤

创建一个socket&#xff0c;使用函数socket()socket(套接字)实质上提供了进程通信的端点&#xff0c;进程通信之前&#xff0c;双方首先必须建立各自的一个端点&#xff0c;否则没有办法通信。通过socket将IP地址和端口绑定之后&#xff0c;客户端就可以和服务器通信了#include…

基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先

上一篇文章完善了项目中的代码&#xff0c;接入了Swagger。本篇主要使用Entity Framework Core完成对数据库的访问&#xff0c;以及使用Code-First的方式进行数据迁移&#xff0c;自动创建表结构。数据访问在.EntityFrameworkCore项目中添加我们的数据访问上下文对象MeowvBlogD…

[C++11]使用using和typedef给模板定义别名

using语法和typedef一样&#xff0c;并不会创建出新的类型&#xff0c;它们只是给某些类型定义了新的别名。using相较于typedef的优势在于定义函数指针别名时看起来更加直观&#xff0c;并且可以给模板定义别名。 使用typedef给模板定义别名: 无法直接使用typedef给模板定义别…

Azure Show|第一期 开播啦!嘉宾梁迪李卓恒李佳芮

欢迎来到Azure Show!Azure ShowAzure Show 是由微软最有价值专家、微软技术社区区域总监卢建晖和微软开发者关系PM朱兴亮共同发起的一个关于微软Azure、开源技术、还有技术社区相关的线上节目。每期节目由MVP面对面、开源故事、从零开始以及Azure101组成&#xff0c;邀请微软技…

基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场

上一篇文章(https://www.cnblogs.com/meowv/p/12896898.html)已经成功将博客项目跑起来了&#xff0c;那么本篇主要是将之前遗留的问题解决&#xff0c;现在的代码看起来可能还是比较混乱&#xff0c;有大量与之无关的代码存在里面&#xff0c;对于强迫症患者来说真的是零容忍。…

[C++11]基于范围的for循环

C11提供了一种新型的for循环形式 - 基于范围的for循环 语法: for (declaration : expression) {//循环体 }在上面的语法格式中&#xff0c;declaration表示遍历声明&#xff0c;在遍历过程中&#xff0c;当前被遍历到的元素会被存储到声明的变量中&#xff0c;expression是要…

c语言画笔的使用方法,新手必看:Photoshop笔刷画笔工具基本使用教程

本文为Photoshop初学者提供基本的Photoshop笔刷画笔工具的基本使用方法,这可以说是Photoshop最重要的功能。希望初学PS朋友认真学习&#xff0c;有所帮助&#xff01;工具/原料Photoshop CC 2014或者其他较新版本的psPhotoshop笔刷画笔工具介绍&#xff1a;1、画笔工具在哪里呢…

基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来

上一篇文章(https://www.cnblogs.com/meowv/p/12896177.html)已经成功创建了博客项目&#xff0c;但是abp默认给我们引用了许多项目中用不到的组件。本篇文章将给项目进行瘦身&#xff0c;删掉对我们来说暂时用不到的组件。讲解各个模块之间的关系&#xff0c;写一个Hello Worl…

计算机网络原理第一章习题3-24 3-25

计算机网络原理第一章习题 3-24假定站点A和B在同一个10Mb/s以太网网段上。这两个站点之间的传播时延为225比特时间。现假定A开始发送一帧&#xff0c;并且在A发送结束之前B也发送一帧。如果A发送的是以太网所容许的最短的帧&#xff0c;那么A在检测到和B发生碰撞之前能否把自己…

[C++11]可调用对象

在C中存在"可调用对象"这么一个概念&#xff0c;准确来说&#xff0c;可调用对象有如下几种定义: 1.是一个函数指针 代码如下: int print(int a, double b) {cout << a << b << endl;return 0; }int(*func)(int, double) &print;2.是一个具…

c语言加花指令,花指令的应用

原标题&#xff1a;花指令的应用对免杀的影响是非常大的&#xff0c;有效地利用花指令可以使免杀工作事半功倍&#xff0c;甚至单凭花指令就可以达到免杀的效果。一、花指令在免杀领域的应用1、花指令的应用技巧在使用之前&#xff0c;首先我们应该明白什么时候比较适合使用&am…

走向统一的 .NET 旅程

这是微软第一次完全线上举办的Build大会&#xff0c;也是第一次完全属于开发者的大会。几乎所有的新产品都是属于开发者&#xff0c;开发者成为了唯一的主角。现在的微软比以往任何时候都贴近开发者&#xff0c;重视开发者的作用&#xff0c;为他们打造平台和工具。因为没有开发…

[PAT乙级]1039 到底买不买

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1b;如果…

Collecting Bugs POJ - 2096(基础概率dp+期望模板)

题意&#xff1a; 有s个系统&#xff0c;n种bug&#xff0c;小明每天找出一个bug&#xff0c;可能是任意一个系统的&#xff0c;可能是任意一种bug&#xff0c;即是某一系统的bug概率是1/s&#xff0c;是某一种bug概率是1/n。 求他找到s个系统的bug&#xff0c;n种bug&#xff…

Service Mesh 高可用在企业级生产中的实践

Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播。本期为 Service Mesh Virtual Meetup#1 &#xff0c;邀请了四位来自不同公司的嘉宾&#xff0c;从不同角度展开了 Service Mesh 的应用实践分享&#xff0c;分享涵盖来自陌陌和百度的 Servi…

sony android mp3播放器,入手一年,详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验...

入手一年&#xff0c;详细聊聊 索尼ZX505、艾利和SR15 两款安卓播放器的使用体验2020-12-04 16:00:21113点赞179收藏28评论创作立场声明&#xff1a;本文所测商品为自费购入。如参加张大妈家的活动获得&#xff0c;我会在文中点明。坚持独立的评价观点是笔者创作的基本底线&…