细谈 C++ 零参数初始化对象三种风格:()、{} 和不加括号

一、引言

想必只要接触了 C++ 一段时间的开发者,一定会对于这么三种 C++ 零参数初始化对象的风格有所迷惑:

IntCell *m;

// 第 1 种风格:后面加小括号
m = new IntCell();

// 第 2 种风格:后面加大括号
m = new IntCell{};

// 第 3 种风格:后面什么也不加
m = new IntCell;

我可以很明确的告诉你,在零参数初始化对象的情况下,这三种风格都是绝对正确的。

那么问题来了,这三种风格到底有什么区别,以及,为什么会出现这三种风格呢,以及最后,我们再来探讨下,我们选择哪种风格更好。

ps: 本博客的灵感来自于我正在阅读的书籍 《Data Structure And Algorithm Analysis In Cpp Fourth Edtion》并参考部分代码。

二、三种风格的意义

我们首先要搞懂的是,这三种风格到底有什么含义。这就要说到 C++ 设计者在设计对象的声明的时候所思考的东西了。

1. m = new IntCell() ,传统 C++ 风格

对于一个 IntCell 对象来说,其零参数的初始化过程,其实就是调用零参数构造函数的过程,那么调用一个没有参数的函数是什么风格呢?这个也许不用我再说了吧,也就是加上一个小括号。

因此,这种风格就应运而生,非常的符合 C++ 调用函数的逻辑,这也是我们看到的最多的传统 C++ 的风格。

2. m = new IntCell{}, C++11 统一风格

那么时代走到了 C++11 时代,C++ 11 引入了初始化列表的语法,并且允许 vector 直接初始化值(这些在传统 C++ 中都是不可行的):

// C++11 之前
vector<int> daysInMonth(12);
daysInMonth[0] = 1; daysInMonth[1] = 2; daysInMonth[2] = 3;
daysInMonth[3] = 4; daysInMonth[4] = 5; daysInMonth[5] = 6;
daysInMonth[6] = 7; daysInMonth[7] = 8; daysInMonth[8] = 9;
daysInMonth[9] = 10; daysInMonth[10] = 11; daysInMonth[11] = 12;

// C++11 可以这么做
vector<int> daysInMonth = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

// 甚至还可以去掉等号
vector<int> daysInMonth { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

可以说 C++11 引入了花括号独特的初始化语义,为了统一在零参数初始化对象的情况下的风格,这里也添加上一个空白的花括号也是可以理解的。因此这种风格也就应运而生,主要是为了统一初始化对象的风格。

3. m = new IntCell,传统 C++ 对象的声明同于基本类型的设计理念

那么还剩下最后一种风格,这种风格或许乍看起来非常的奇怪,其实不然。C++ 设计者在设计类的时候,就已经想要将其与基本类型的用法统一。也就是对于使用者来说,其是自定义类还是基本类型,最好没有太大的使用区别。那么同样的,在零参数初始化对象的情况下,也希望其能与基本类型的声明风格一致,那么基本类型的声明风格是什么呢?

int i;
double d;

就这么简单,那么类的对象声明没有括号这种风格是不是也就可以理解了呢?

三、哪一种风格最好呢

那么我们作为一个 C++ 开发者,最好使用哪种风格呢?

这跟你当前的项目有关。

如果你的项目使用的是传统 C++,那么我建议你使用第 1 种或者第 3 种风格。那么第 1 种和第 3 种中非要选择一个呢?我个人更加喜欢加上小括号的,因为在有了参数的初始化情况下,也会在小括号中填入参数,没有参数也保留空白的小括号,这样风格可以稍微统一一些。

如果你的项目使用的 C++11 或者以后版本,那么就不要纠结了,直接使用 C++11 的统一风格,大胆的迈进 C++11 的世界是更好的选择。

当然了,三种也只有风格的区别没有功能的区别,如果你更偏爱一种,那就大胆的使用它,毕竟代码风格是一件非常玄学的事情 ^_^

四、总结

总算是搞清楚了一处盲区,还是比较欣悦的。为了完善我们 C++ 代码的风格,这些细节还是值得我们去留意的。

To be Stronger:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值