C++类内初始值的初始化形式

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

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

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

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

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

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

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

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 };//实际上同ival2{ 1 }一样

	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" };//实际上同str2{ "aa" }一样

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

	system("pause");
	return 0;
}

在这里插入图片描述

2.类模板

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

先看初始化列表{}:

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

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

再看=的初始化过程:

因为它实际上是一个拷贝构造的过程,所以=的右边必须是一个同类型的值,如下所示。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类型

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

我在实际上调试时发现如下这样的一个问题:类内初始值的初始化列表{}方式编译器会报错。定义的类如下。
这让我很迷惑,因为在上面的测试中是可以的?后来才发现,因为我用的是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{a,b,c…}v5的大小就是初始化列表的大小,每个元素的值是初始化列表的值
vector v5 = {a,b,c…}等价于V5{a,b,c…}
vector v6 (first, last)将迭代器[first,last)区间的元素拷贝到v6

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

代码乌龟

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值