重读C++ Primer——第六章笔记

1、如果函数形参使用非常量引用

目录

1、如果函数形参使用非常量引用,会大大限制函数可接受的参数的类型,即不能把const对象、字面值和需要转换的类型赋值给普通的引用形参(218页)。参见第二章笔记第九条。

2、虽然不能以值传递的方式传递数组(219页,还可参见第三章笔记第11条),但是可以把形参写成类似数组的形式。

3、传递多维数组

4、函数调用的返回值

5、函数的返回类型决定函数调用是否为左值,调用一个返回引用的函数得到左值,其它返回类型得到右值。可以为返回类型为非常量引用的函数结果赋值。(228页)

6、c++11中,函数可以返回花括号包围的值的列表。这个列表也用来初始化代表函数返回的临时量。(229页)

7、main函数如果结尾处没有return语句,编译器会隐式地插入一条返回0的return语句。

8、名字查找发生在类型检查之前。

9、默认实参

9.1、函数的声明通常都放在头文件中,并且一个函数只声明一次,但多次声明同一个函数也是合法的。在同一个作用域中一个形参只能被赋予一次默认实参,函数的后续声明只能为那些没有默认实参的形参添加默认值,且该形参右侧的所有形参都有默认值。(237页)

9.2、局部变量不能作为默认值,除此以外,只要表达式的类型可以转换为形参的类型,就可以作为默认实参。特别地,函数调用也是一种表达式。

10、内联函数和constexpr函数可以多次定义,且定义必须相同,因为编译器必须在调用它们的地方将其展开。所以他们的定义通常放在头文件中。

11、__func__是编译器定义的局部静态变量,用于存放函数的名字,是const char数组。此外预处理器也定义了几个名字

12、候选函数与可行函数

13、函数指针(247页)

13.1、作为参数时

13.2、作为返回值时

14、函数重载

15、constexpr函数

16、可变形参的函数(223页)

16.1、对于initializer_list的额外说明

16.2、如何实现自定义类型的列表初始化构造方式?

17、实参类型转换(245页)


,会大大限制函数可接受的参数的类型,即不能把const对象、字面值和需要转换的类型赋值给普通的引用形参(218页)。参见第二章笔记第九条。

指针形参也类似,最好声明成常量指针。(221页)

2、虽然不能以值传递的方式传递数组(219页,还可参见第三章笔记第11条),但是可以把形参写成类似数组的形式。

3、传递多维数组

当把多维数组作为实参传递给函数时也会发生上述的过程:真正传递的是指向数组首元素的指针,因为处理的是数组的数组,所以首元素就是一个数组,那么这个指针就是一个指向数组的指针。数组第二维(以及后面所有的维度)的大小都是数组类型的一部分,不能省略(221页)。

也可以使用数组的语法定义函数,但编译器会一如既往的忽略第一个纬度(即将(数组的)数组转换为指针),是所以最好不要把它包括在形参列表内(222页)

4、函数调用的返回值

返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。

特别的,当函数返回局部变量时,如果返回值是非引用类型,则这个返回的局部变量会拷贝一份给调用点的临时量。

上述代码将返回word的副本或一个临时string对象。

注意:不要返回局部变量的引用或指针!

5、函数的返回类型决定函数调用是否为左值,调用一个返回引用的函数得到左值,其它返回类型得到右值。可以为返回类型为非常量引用的函数结果赋值。(228页)

6、c++11中,函数可以返回花括号包围的值的列表。这个列表也用来初始化代表函数返回的临时量。(229页)

一个花括号列表到底返回了什么类型?具体的返回类型由函数类型(即其签名决定);当列表为空时,这个返回的临时量对象执行值初始化,不为空时执行列表初始化。

因为此过程本质上是用值的列表初始化临时量,所以受初始化的规则约束,参见第二章笔记5.2节。

7、main函数如果结尾处没有return语句,编译器会隐式地插入一条返回0的return语句。

8、名字查找发生在类型检查之前。

9、默认实参

9.1、函数的声明通常都放在头文件中,并且一个函数只声明一次,但多次声明同一个函数也是合法的。在同一个作用域中一个形参只能被赋予一次默认实参,函数的后续声明只能为那些没有默认实参的形参添加默认值,且该形参右侧的所有形参都有默认值。(237页)

9.2、局部变量不能作为默认值,除此以外,只要表达式的类型可以转换为形参的类型,就可以作为默认实参。特别地,函数调用也是一种表达式。

名字的求值过程发生在函数调用时,所以默认实参的值还可以动态改变(239页)

感觉screen携带了作用域外wd的信息。

10、内联函数和constexpr函数可以多次定义,且定义必须相同,因为编译器必须在调用它们的地方将其展开。所以他们的定义通常放在头文件中。

11、__func__是编译器定义的局部静态变量,用于存放函数的名字,是const char数组。此外预处理器也定义了几个名字

12、候选函数与可行函数

候选函数是可见的同名函数,即只有名字决定。

可行函数考虑的是实参、形参的数量与类型,先考虑数量后考虑类型。

13、函数指针(247页)

虽然函数的签名值包括形参,但是函数的类型却包含它的返回值类型。

指向不同类型函数的指针间不存在转换规则,但是可以将nullptr或常量0赋给它们。

重载函数的指针必须与函数类型精确匹配

13.1、作为参数时

函数作为实参或形参使用时会自动转化成函数指针

注意:上图中,函数类型形参和函数指针类型形参是并列的两种形参类型。

decltype用于函数得到函数类型,不会自动将其转为指针,声明函数指针时要显示用指针修饰符

上图代码不仅申明了函数类型,还声明了函数指针类型。

13.2、作为返回值时

函数不能返回函数,只能返回函数指针(249页)

作为实参或形参时不同,函数返回类型不会自动转为函数指针。

14、函数重载

重载函数是指同一作用域内的同名函数。

不同作用域的相同名字不会构成重载,只会发生覆盖。(236页)

这一点在解析派生类中的名字时尤其重要(575页),参见15章笔记14.2条。

除了通常意义上的重载之外,形参底层const不同的同名函数之间也可以构成重载关系,但是顶层const在实参传递过程中会被忽略,所以顶层const的不同并不能构成重载关系。参见第二章笔记6.1节。

15、constexpr函数

是指能用于常量表达式的函数,它的返回类型和形参都必须是字面值类型(参见第二章笔记第11条),且函数体内只能有一条return语句,除此以外其它语句都不能执行任何操作,比如typedef、using声明等。

16、可变形参的函数(223页)

两种主要的方法:如果所有的实参类型相同,可以传递一个initializer_list的标准库类型;如果实参类型不同,使用可变参数模板(参见第16章笔记20.1条)。

此外,还可以使用于C相同的省略符形参,这种功能一般只用于与C函数交互的程序。

16.1、对于initializer_list的额外说明

有了列表初始化以后(参见第二章笔记),很多标准库类型都支持列表初始化,包括initializer_list

所以传递可变数量(但类型相同的)实参时,可以直接把实参放在花括号中使用列表初始化来初始化initializer_list

16.2、如何实现自定义类型的列表初始化构造方式?

如以下代码(430页)

可以定义一个使用支持列表初始化的标准库类型的参数,比如initializer_list

这样就可以向StrBlob传递花括号列表进行列表初始化了。

17、实参类型转换(245页)

有如下的规则

注意:函数或数组到相应指针的转换属于精确转换!​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值