CppPrimer笔记 Chapter6 函数
2017-03-14 23:06
323 查看
CppPrimer笔记 Chapter6 函数
标签: CppCppPrimer笔记 Chapter6 函数
含有可变形参的函数基础626
函数重载64
默认实参651
函数匹配66问题
函数指针67
含有可变形参的函数基础(6.2.6)
实参类型相同,使用initializer_list#include <iostream> using namespace std; int sum(initializer_list<int> il) { int sum = 0; for (auto it = il.begin(); it != il.end();++it) { sum += (*it); } return sum; } int main() { cout << sum({3, 2, 3, 1}) << endl; system("pause"); }
省略符形参
//计算number个int数的和 int sum(const int number, ...) { //函数参数是以数据结构:栈的形式存取,从右至左入栈。 va_list arg_ptr;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针 int sum = 0; va_start(arg_ptr, number);//对arg_ptr进行初始化,让它指向可变参数表里面的第一个参数 for (int i = 0; i < number; ++i) { sum += va_arg(arg_ptr, int); } va_end(arg_ptr);//将arg_ptr指针关掉,以免发生危险 return sum; } int main() { cout << sum(3, 2, 3, 1) << endl; system("pause"); }
函数重载(6.4)
main函数不能重载重载函数必须有形参上的不同,形参相同而返回类型不同则第二个函数的声明为错误.同时,别名与原名视为相同
typedef int same_int; void fun(int); int fun(int);//error int fun(same_int);//error
顶层const不影响传入函数对象,可认为忽略.
int fun(int); int fun(const int);//error
函数匹配
被内嵌作用域隐藏了的外层的同名函数,直接视为不可见.不会进行搜索与重载
默认实参(6.5.1)
给定作用域中的一个形参只能被赋予一次默认实参,即使多次赋予的某一个参数的默认实参是相同的值用作默认实参的名字在函数声明所在的作用域内解析,而名字的求值过程发生在函数调用时. 即: 默认实参不会被同名局部变量覆盖,同时若在调用函数之前修改了默认实参对应的变量,则调用时会传入新的值
int x = 10; int y = 20; void print(int a = x, int b = 20) { cout << a << endl; cout << b << endl; } int main() { x = 50; int y = 100; print();//输出 50 20 system("pause"); }
函数匹配(6.6)问题
步骤寻找候选函数,然后寻找可行函数–即寻找可以调用的函数
寻找最佳匹配
含有多个形参都匹配的函数
该函数每个实参的匹配都不劣于其它可行函数需要的匹配
至少有一个实参的匹配优于其它可行函数提供的匹配
否则,存在二义性,报错.
void f(){ cout << "f_void"; } void f(int x){ cout << "f_int"; } void f(int x, int y){ cout << "f_int_int"; } void f(double x, double y = 3.14) { cout << "f_double_double"; } int main() { f(5.6); f(42, 2.56);//error system("pause"); }
最佳匹配
优先级从高到低
精确匹配:
实参类型与形参相同
实参从数组类型或函数类型转化为相应指针函数指针
向实参添加顶层const或从实参删除顶层const
通过const转化实现的匹配待链接
通过类型提升实现匹配待链接
通过算术类型转换待链接或指针转换待链接实现的匹配
通过类类型转换实现的匹配待链接
void ff(int); void ff(short); ff('a'); //char提升成int;调用f(int) void manip(long); void manip(float); manip(3.14); //二义性调用 都为算术类型转换 int lookup(int&); int lookup(const int&); const int a ; int b; lookup(a); //调用lookup(const int&) lookup(b);//调用lookup(int&);
函数指针(6.7)
声明定义并使用函数指针bool lengthCompare(const string & s1, const string &s2) { return (s1.length() > s2.length()); } int main() { bool(*pf)(const string&, const string&); pf = lengthCompare; cout << &lengthCompare << endl; cout << pf << endl; cout << pf("long", "srt") << endl; system("pause"); }
函数指针形参
不带括号的函数名可以当成常量函数指针使用,但是不是等价,还不清楚
bool lengthCompare(const string & s1, const string &s2) { return (s1.length() > s2.length()); } void useBigger(const string &s1, const string &s2, bool pf(const string &, const string &)) { if (pf(s1,s2) == true) { cout << "s1 > s2" << endl; } else { cout << "s1 <= s2" << endl; } } int main() { useBigger("longer", "short", lengthCompare); system("pause"); }
返回指向函数的指针
using F = int(int*, int); using PF = int(*)(int*, int); PF f1(int); F *f2(int); auto f3(int) -> int(*)(int*, int);
相关文章推荐
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- <<c++ primer>> 函数指针的笔记
- CPP Primer 学习笔记一
- CppPrimer笔记 Chapter10 泛型算法
- CppPrimer笔记 Chapter9 顺序容器
- 2012/1/19 《C++ Primer Plus》第七章:函数——C++编程模块 学习笔记
- C++ Primer plus 学习笔记之第七章(2)函数指针
- C++primer plus第7-8章函数笔记
- 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
- CppPrimer笔记 Chapter19 特殊工具与技术
- (笔记)C++ Primer/第七章 函数
- c++ primer 学习笔记7--函数返回声明
- Cpp的重载Overload(函数&运算符)-笔记
- Cpp_Primer--函数
- C++primer第五版笔记-第六章函数
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- C++ Primer Plus 学习笔记之函数探幽----1
- Cpp Primer<<学习函数-重载函数_2
- 《C++ Primer Plus(第六版)》(10)(第八章 函数探幽 笔记)
- CppPrimer--数组名与指针& 函数名与函数指针