首页 > 编程语言 >109.C++类内初始化

109.C++类内初始化

时间:2023-07-18 12:44:36浏览次数:54  
标签:std 初始化 109 int 初始值 C++ vector 类内

109.C++类内初始化

C++11规定,可以为数据成员提供一个类内初始值。创建对象时,类内初始值用于初始化数据成员。像下面这样,cursor和height的类内初始值均为0。

class Screen
{
private:
	int cursor = 0;
	int height = 0;
};

1.不能用圆括号给类内初始值的原因

C++ primer(第5版)中写道:类内初始值的提供必需以=或者花括号{}的形式。不能用园括号()。

关于这一点,可以参考网上的一个说法,如下:
由于无法避免下面的这种情况,这相当于对于int z(int);函数的声明,所以C++把用圆括号进行类内初始值定义为非法。

class Widget
{
private:
	typedef int x;
	int z(x);
};

2.=和花括号{}初始化的区别

2.1内置类型和类类型

对于这两者而言,=和{}初始化的区别不大,测试如下。

#include <iostream>     // std::cout
#include <string>
#include <vector>
using namespace std;

int main()
{
	std::cout << "*****内置类型*****" << std::endl;

	int ival = 1;

	int ival2{ 1 };
	int ival3 = { 1 };//实际上先构造一个{ 1 }匿名对象然后拷贝给ival3

	std::cout << "ival = " << ival << std::endl;
	std::cout << "ival2 = " << ival2 << std::endl;
	std::cout << "ival3 = " << ival3 << std::endl;

	std::cout << "*****类*****" << std::endl;

	string str = "aa";

	string str2{ "aa" };
	string str3 = { "aa" };//实际上先构造一个{ "aa" }匿名对象然后拷贝给str3

	std::cout << "str = " << str << std::endl;
	std::cout << "str2 = " << str2 << std::endl;
	std::cout << "str3 = " << str3 << std::endl;

	system("pause");
	return 0;
}

输出:

*****内置类型*****
ival = 1
ival2 = 1
ival3 = 1
*****类*****
str = aa
str2 = aa
str3 = aa
请按任意键继续. .

2.2类模板

对于类模板而言,我们可以看看实际上初始化列表{}和=初始化的过程:

先看初始化列表{}:

std::vector<std::string> vs{ "ssss" ,"dddd"};

以看到,上面的初始化的最后一步是在vector中插入初始化列表中元素

template <class _Iter, enable_if_t<_Is_iterator_v<_Iter>, int> = 0>
_CONSTEXPR20 vector(_Iter _First, _Iter _Last, const _Alloc& _Al = _Alloc()) : _Mybase(_Al)
{
	insert(begin(), _First, _Last);
}

再看=的初始化过程:

因为它实际上是一个拷贝构造的过程,所以=的右边必须是一个同类型的值,如下所示。vs3可以看成是一个’std::vector类型的变量,那么只能用std::vector类型的变量来初始化它,比如下面的vs_tmp。

std::vector<string> vs_tmp;
std::vector<string> vs3 = vs_tmp;

注意,千万不能这样:std::vector<string> vs2 = "eee";
上述初始化最后调用的是vector的拷贝构造函数,如下:

总结:

  • 初始化列表,列表中的元素就是模板的元素,如vector<string> tmp_vec= {"ddd","www"}
  • =初始化,只能用同类型,如只能用vector类型初始化vector类型

3.类内初始值的初始化列表{}方式

我在实际上调试时发现如下这样的一个问题:类内初始值的初始化列表{}方式编译器会报错。定义的类如下。
这让我很迷惑,因为在上面的测试中是可以的?后来才发现,因为我用的是VS2013,而它并不是完全支持C++11标准,所以对类内初始值用初始化列表的形式可能还不支持,换一个编译器后,不再报错。

class Wind_mgr
{
public:
	void putsData()
	{
		str.push_back("aaa");
	}
private:
	std::vector<std::string> str{ "bbb" };//Error,无法从“const char [4]”转换为“const std::allocator<_Ty>”
};

最后附上vector的几种初始化形式:

初始化格式 说明
vector v1 生成一个空vector
vector v2(V1) v2包含v1的所有元素副本
vector v2 = v1 等价于V2(V1)
vector v3(n,val) v3被初始化为n个val值,即v3有n个重复的元素
vector v4(n) v4是一个有n个元素的vector,只是n个元素均为值初始化值
vector v5 v5的大小就是初始化列表的大小,每个元素的值是初始化列表的值
vector v5 = 等价于V5
vector v6 (first, last) 将迭代器[first,last)区间的元素拷贝到v6

参考:C++类内初始值的初始化形式

标签:std,初始化,109,int,初始值,C++,vector,类内
From: https://www.cnblogs.com/codemagiciant/p/17562601.html

相关文章

  • C++学生健康信息收集系统[2023-07-18]
    C++学生健康信息收集系统[2023-07-18]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++用电管理数据[2023-07-18]
    C/C++用电管理数据[2023-07-18]用visualstudioc++设计一款程序来统计用电管理数据,要求能用菜单实现如下功能:(1)输入每个电表的用户名,楼栋号,抄表日期,电表读数。(3)按作者的用电量,从高到低排出每个用户的总用电量。(3)根据用户要求输出某用户某月(从键盘输入用户名和月份)的总用电量。......
  • C++语言程序设计任务书[2023-07-18]
    C++语言程序设计任务书[2023-07-18]C++语言程序设计任务书指导老师:李力课程编号:一、学时与学分学时:40学分:2二、实践目的计算机实践是本科计算机基础教学的一个重要环节。它对于巩固学生的计算机基础知识,增强学生的计算机应用水平,改善学生的知识结构,具有重要意义。三、......
  • C/C++文件加密解密[2023-07-18]
    C/C++文件加密解密[2023-07-18]题目27:文件加密文件的传输会有明文和密文的区别,明文发送是不安全的,用一个程序实现发送文件的加密和解密操作。加密算法,密钥设计由同学自己选择现有的加密解密算法或是自己设计。要求:(1)对文件的字符根据加密算法,实现文件加密。(2)对操作给出必......
  • C/C++学生成绩管理系统[2023-07-18]
    C/C++学生成绩管理系统[2023-07-18]学生成绩管理系统开发一个可以管理学生成绩以及学生基本信息的一个信息系统,至少实现如下功能:信息管理,支持信息的增、删、改、查操作,具体信息类型如下:(1) 管理学生信息 ,包括学号,姓名,年龄,班级等等信息。(2) 班级信息,包括班级编号、班级人数,......
  • C/C++电影评分系统[2023-07-18]
    C/C++电影评分系统[2023-07-18]程序设计综合课程设计指导书一、题目:电影评分系统二、设计内容及要求:根据C++课程所学的概念、理论和方法,按照C++程序设计的基本步骤,设计出一个适当规模的程序来实现设计课程内容中的全部功能。本系统要求模拟实现电影评分系统,其中包括电影资源......
  • c++环形队列的简单实现
    环形队列可以通过维护count来间接维护tail和head指针的关系,简化程序,避免了直接使用tail和head指针,读写时head与tail回环时的比较处理,判断队列元素长度时的复杂处理,如下为不基于count而是直接使用head和tail指针比较的环形队列的实现,逻辑较为复杂uint32_tCAudioRingBuffer::Da......
  • C++14指北:花里胡哨的C++
    类型!在最经典的C++代码中,我们使用类似类型名变量名=表达式;的形式声明并初始化变量,例如intx=1;inty=x;在上面代码中,我们知道y理应与x的类型相同,但是在上面代码中,如果我们后来把x的类型修改为int64_t,而忘记对应地修改y的类型,则可能导致灾难性的后果。对......
  • beginnersbook C++ 教程·翻译完成 | ApacheCN
    译者:飞龙协议:CCBY-NC-SA4.0基础HelloWorld-第一个C++程序C++中的变量C++中的数据类型C++中的运算符控制语句C++中的if语句C++中的switch-case语句C++中的for循环C++中的while循环C++中的do-while循环C++中的continue语句C++中的break语句C++中的goto语句函数C++......
  • C/C++八大排序
    排序排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。按照难易程度排序,八大排序算法可以从简单到复杂依次排列如下:冒泡排序(BubbleSort)选择排序(SelectionSort)插入排序(Inser......