标签:
一、参数传递
1、形参为引用类型时,将绑定到相应的实参上,否则为实参的拷贝;在C++中建议用引用类型代替指针
2、const 形参:
3、数组形参:传递给函数的值为数组的首元素指针,所以一开始不知道数组的大小,有三种解决方法
4、数组引用形参:如果形参是数组的引用,则维度是类型的一部分,不可少
void print(int (&arr)[10]) //(&arr)[10]:括号不可少 { ... }
5、传递多维数组:数组的第二维及后面的维度为数组类型的一部分,不能省略
void print(int (*matrix)[10], int rowSize); rowSize为数组第一维的长度
6、main函数的输入
二、返回类型和return语句
1、注意不要返回局部对象的引用或指针,局部变量会在函数返回后清空数据
2、如果函数返回的类型是可修改的左值,那么也可以直接作为左值来呗赋值
3、C++11可以返回{}内的列表:如vector,类等,如果只是sting,int这种{}内只能有一个值
4、返回数组指针:可以有很多的方式,但是最简单的是使用类型别名
auto func(int i) -> int(*)[10] int (*func(int i))[10]
三、函数重载:形参数量或形参类型上有所不同,不允许两个函数除了返回类型外其他所有要素都相同
1、const形参和重载
Record lookup(Phone); Record lookup(const Phone); //重复定义Record lookup(Phone); Record lookup(Phone *); Record lookup(Phone * const); //重复定义Record lookup(Phone *); Record lookup(Account &); Record lookup(const Account &); //底层const引用可以 Record lookup(Account *); Record lookup(const Account *); //底层const指针可以
2、const_cast和重载:存在常量的版本,通过const_cast设计非常量的版本
3、重载与作用域:不同的作用域中无法重载函数名
4、调用重载函数时应尽量强制类型转换
四、特殊用途语言特性
1、默认实参:一旦某个形参被赋予了默认值,则它后面的所有形参都要有默认值(C中没有这个属性)
2、内联函数和constexpr函数:通常都定义在头文件中
constexpr int new_sz(int i) {return i*3;}
3、调试帮助:
assert(expr); //对expr求值,为假则终止程序运行;为真assert什么都不做 检查”不能发生的事“
__func__ :输出当前调试的函数名字:GCC两个都支持
__FUNCTION__ :输出当前调试的函数名字(VC,VS中用这个)
__FILE__ :存放文件名的字符串字面值
__LINE__ :存放当前行号的整形字面值
__TIME__ :存放文件编译时间的字符串字面值
__DATE__ :存放文件编译日期的字符串字面值
五、函数指针:函数的类型由它的返回类型和形参类型共同决定,与函数名无关
1、使用函数指针:把函数名作为一个值使用时,该函数会自动转换成指针
bool lengthCompare(const string &, const string &); 函数类型:bool(const string &, const string &)
pf = lengthCompare; pf = &lengthCompare; //取地址符可选
2、函数指针形参:编译器自动把函数类型转换为指针
void useBigger(const string &s1, const string &s2, bool pf(const string &, const string &)); void useBigger(cosnt string &s1, const string &s2, bool(*pf)(const string &, const string &)); //两个等价
3、返回指向函数的指针:这里编译器不会自动将函数返回类型当成对应的指针类型,所以必须自己处理好
using F = int(int *, int); using PF = int (*)(int *, int); PF f1(int); F *f1(int); //F为函数类型,需要自己加*来变为指针
标签:
原文地址:http://www.cnblogs.com/dylqt/p/4832297.html