您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 读书笔记——函数

2017-08-24 13:32 267 查看

C++ Primer 读书笔记4

关键概念

分离式编译——P186

可变形参——P197

void fun(initializer_list<string> il)//initializer_list定义在同名的头文件中
{
//initializer_list当做容器处理
}
fun({"q","w","a"});


initializer_list对象的元素永远是常量值。

重载与作用域——P210

如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同作用域中无法重载函数名。

内联函数和constexpr函数——P210

内联函数是用空间换时间用于规模较小、流程直接、频繁调用的函数。

string read();
void print(const string &);
void print(double);//重载print函数
void fooBar(int ival)
{
bool read=false;//新作用域:隐藏外层的read
string s=read();//错误:read是一个bool值,不是函数
void print(int);//新作用域:隐藏之前的print
print("Value:");//错误:print(const string &)被隐藏
print(3.14);//正确:调用print(int);print(double)被隐藏掉了
}


调试帮助——P215

函数指针——P221

注意点

函数中实参是形参的初始值,第一个实参对应第一个形参。但是编译器能以任意可行的顺序对实参求值(实参可以是函数或者表达式)

形参名是可以省略的,未命名的形参无法使用。

函数的返回类型不能是数组类型或者函数类型。

局部静态对象的生命周期贯穿函数调用及之后的时间(函数调用结束后不销毁,程序终止时被销毁)(静态把对象的生命周期提升了一个级别?)——P185

当使用数组作为形参,要防止数组使用的越界。

数组引用形参一定要加括号

void fun(int (&arr)[10]); //正确:arr是具有10个整数的整形数组的引用。
void fun(int &arr[10]); //错误:将arr声明成引用的数组。


函数不能反回局部对象的引用或指针。

返回引用的函数得到的是左值其他类型得到的是右值。

在给定作用域中一个形参只能被赋予一次默认实参。

调用重载函数时应该尽量避免强制类型转换。如果在实际应用中确实需要强制转换类型转换,则说明我们设计的形参集合不合理。

函数指针的类型必须与重载函数中的某一个精确匹配。

小技巧

通过使用引用避免拷贝(拷贝大的类类型对象或者容器对象是比较低效的),如果不需要改变形参的值,只需要将其声明为常量引用。

void fun(const int &i)
{
}


C++可以使用尾置返回类型

//func返回一个指针,该指针指向含有10个整数的数组
auto func(int i)->int(*)[10];


如果形参是某种类型的指针或引用,通过区分其指向的是常量对象还是非常量对象可以实现函数重载。——P208

函数不能定义函数类型的形参,但是可以定义指向函数的指针,同理可以定义返回指向函数的指针。

将auto和decltype用于函数指针类型

int func1(const int&);
int func2(const int&);
//根据形参的取值,getFun函数返回指向func1或者func2的指针。
decltype(func1) *getFun(const string&);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: