这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
再说说类型转换
昨天看了C++中的隐式类型转换,再来看看C++中主动进行的类型转换。 如其它语言一样,C++也支持类似如下的类型转换:
(long) thorn
long (thorn)
int (month)
(int) month
C++特有的类型转换:static_cast<typename> (value),如
static_cast<double> (month)
{} 初始化以及它涉及的类型转换
C++ {}的使用与我在JS和python中遇到的不同,一般作为对象字面量进行字典和类初始化的{},在C++中也可以用来初始化其他普通变量:
char c = {66};
char c{66};
以上这样的语法都可用来声明变量。看到有一种说法是,C++这样的设定是为了和类的初始化对齐,让{}成为一个通用的声明方法。
不像之前提到的隐式类型转换,{}声明变量有着更严格的要求,像char c1 {31325}这样的做法会被判定为不合法,因为以{}声明的变量不允许所谓的narrowing,即超出该变量范围的数,也没有办法去做隐式转换。
auto
作为一个弱类型语言的使用者,看到auto就像回到了家一样,像这样
auto n = 100; // n 为 int 类型
auto x = 1.5; // x 为 double 类型
auto y = 1.3e12L; // y 为 long double 类型
这样的初始化方法仿佛就在使用python一样,省去了管理类型的心智负担。
事实上auto并不只造福弱类型语言的使用者,作为C++ 11 引入的特性,auto被认为是这个版本最主要的特性之一,也被C++开发者们广泛接受,认为是modern C++的一部分,看下面的例子:
std::vector scores;
std::vector::iterator pv = scores.begin();
\\or
std::vector scores;
auto pv = scores.begin();
两种写法是等价的,虽然我还没学到STL库,但可以清楚地发现,在复杂的数据结构中,auto的使用给使用者省去了大量的麻烦,更重要的是避免了可能的错误。