Cpp_auto

内容

  1. 初识auto

auto

如果不在返回auto的函数的返回值类型有冲突的后面加 -> int,则会编译不通过,因为auto无法推断到底返回浮点型还是整型,则可以加 -> int进行声明:返回值统一强转为int。

这种auto在前,返回值类型在后的用处还有一个好处就是:如果返回值类型特别复杂、特别长,则可以先写auto代替,把又臭又长的名字放在后缀,起到了使代码美观的作用(避免头重脚轻)。

1
2
3
4
5
6
7
auto show(int v)
{
if(v < 10)
return 30.0;
else
return 30;
}
1
2
3
4
5
6
7
auto show(int v) -> int
{
if(v < 10)
return 30.0;
else
return 30;
}

Cpp_初始化列表

内容

  1. 三种形式的initialization
  2. 构造函数的初始化列表写法

Cpp的initialization

有三种形式:

  1. 赋值(assignment形式)
  2. 卷括号(大括号,curly braces)
  3. 函数式(圆括号)
1
2
3
4
5
6
7
8
9
int main()
{
// assignment initialization
double a = 17.5;
// braces initialization
double b{ 17.5 };
// functional initialization
double c(17.5);
}

委员会推荐新出的大括号形式的初始化,最通用,相比于圆括号来说更少有歧义。

构造函数中的初始化列表

冒号后面的初始化列表,除了assignment形式,小括号、大括号都可以。现代C++更推荐大括号。

1
2
3
4
5
6
7
8
9
10
class Test
{
public:
Test(void) : _val{ 7 }
{
//_val = 7;
}
private:
int _val;
}

初始化列表的初始化是先于构造函数的,即给对象创建空间后立马填成员的值。
而构造函数中赋值,是对象创建完毕后才去执行。

初始化列表的语法糖

如果要初始化的东西是常量,则C++11有语法糖:直接在成员变量后加初始化括号。

1
2
3
4
5
6
7
8
9
10
class Test
{
public:
Test(void)
{
//_val = 7;
}
private:
int _val{ 7 };
};