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

来源:互联网 发布:阿里云系统电视root 编辑:程序博客网 时间:2024/05/29 02:25

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&);
原创粉丝点击