[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,一经查实,立即删除!

相关文章

ffmpeg为何用c语言编译,如何使用ffmpeg的c语言sdk实现对文件夹的操作

重要函数打开文件夹&#xff1a;avio_open_dir()读取文件夹&#xff1a;avio_read_dir()关闭文件夹&#xff1a;avio_close_dir()结构体, 操作目录的上下文&#xff1a;AVIODirContext()目录项&#xff0c;用于存放文件名&#xff0c;文件大小等信息&#xff1a;AVIODirEntry()…

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

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

C#相关基础知识点总结+基础代码

C#基础知识 同一命名空间下的两个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace HelloWorld {class A{private int a;public A(int x) { a x; }public void show() { Console.WriteL…

[PAT乙级]1038 统计同成绩学生

本题要求读入 N 名学生的成绩&#xff0c;将获得某一给定分数的学生人数输出。 输入格式&#xff1a; 输入在第 1 行给出不超过 10​5​​ 的正整数 N&#xff0c;即学生总人数。随后一行给出 N 名学生的百分制整数成绩&#xff0c;中间以空格分隔。最后一行给出要查询的分数个…

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

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

综合知识点+计算机

综合知识点 多态性有哪些&#xff1f;&#xff08;静态和动态&#xff0c;分别叙述了一下虚函数和函数重载&#xff09; { 分为静态多态性和动态多态性&#xff0c;静态就是在编译时就已经确定了&#xff0c;动态是在程序运行时 才能确定。像函数重载&#xff0c;就是多个函数…

[PAT乙级]1036 跟奥巴马一起编程

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

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; }测…

map的专项知识点总结

map的专项知识点总结 标准库map类型是一种以键-值(key-value)存储的数据类型。以下分别从以下的几个方面总结&#xff1a; &#xff08;1&#xff09;.map对象的定义和初始化 &#xff08;2&#xff09;.map对象的基本操作&#xff0c;主要包括添加元素&#xff0c;遍历等 m…

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给模板定义别…

石家庄学院c语言试题,谁会高级语言程序设计?要求用C语言,帮帮我把,愁死我啦...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼好的&#xff0c;题目如下&#xff0c;帮我做做吧1. 图形时钟功能要求&#xff1a;在屏幕上显示一个图形时钟(用程序绘制一个与时钟样式相似即可)&#xff0c;时间与系统时间一致&#xff0c;且要随着时间的走动准确的走动。2. 万年…

Shaolin HDU - 4585(map模板题)

题意&#xff1a; 少林寺有n1个和尚&#xff0c;他们都有一个独有的编号和战斗力值&#xff0c;当一个年轻人通过所有考试并被宣布为少林的新僧人时&#xff0c;将会有一场战斗&#xff0c;作为欢迎的一部分。新和尚必须与一位战斗等级最接近他的战斗等级的老和尚战斗。如果有…

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

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

c语言coin函数库,Coin Test | C/C++程序员之家

Coin Test时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;1描述As is known to all,if you throw a coin up and let it droped on the desk there are usually three results. Yes,just believe what I say ~it can be the right side or the …

[PAT乙级]1033 旧键盘打字(getline()读入)

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其…

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

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

string函数知识点总结

标准c中string类函数介绍 之所以抛弃char*的字符串而选用C标准程序库中的string类&#xff0c;是因为他和前者比较起来&#xff0c;不必 担心内存是否足够、字符串长度等等&#xff0c;而且作为一个类出现&#xff0c;他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需…