1. C++的内联函数
它的存在目的就是在编译时就将函数全部复制到要使用的地方,稍微优化了时间
而它又是按值传递,所以区别于普通的宏函数
使用该特性必须在 内联函数声明或者函数定义前加上关键字 inline
可以当作常规函数调用
例如:
inline double square (double x) { return x*x;}
内联函数不能递归!代码过长等会被视为常规函数
2. 引用变量 (C++新增的复合类型)
引用是已定义的变量的别名,可对该变量直接操作
注意的是声明引用时必须将其初始化
引用方法 例如:
int & rodnets = rats;
于函数传递中使用,避免了指针出错问题
若函数是引用的 那么声明\定义 为 stuats Function(stuats & a,...)
而在使用的地方与按值传递无差别
对引用加 const : const int &A = B;
将引用用于结构体和类的传递
3. 函数返回引用:
例如
结构体 StructP
函数 StructP & FunX(StructP & target)
stuats FunY(StructP & target)
返回StructP &,那么FunX返回的引用便是实际的元素,
如果只是返回 StructP 类型,那么返回的是一个副本
这使得 FunY(FunX(team)) 这样的函数调用出现差别:对于前者FunY可改变原数据
而对于 StructP & FunX(StructP & target)
使用时可以 FunX(team) = (StructP) other 因为返回的是一个引用,可被赋值
注! 返回的往往是作为参数传递给函数的引用(可以是隐式的),因为函数结束
会将原本属于函数内的元素释放
当然用 new 申请的也可作为返回对象,要注意的是使用完后需要 delete
对于返回的引用可以使用 const 进行修饰
4. 将引用用于类对象
与引用结构体相似
而形参为 string ,实参可以为 char *,因为C++内有 char *到 string 的转换功能
5. 对象、继承和引用 (见第13和17章笔记)
6. 默认参数
默认参数指的是当函数调用中省略了实参时自动使用的一个值
例如:
void Cal(int n)
如果把 n 设置为默认值 1 ,那么直接用 Cal() 就相当于 Cal(1)
设置默认值的方法
在函数原型中,必须自右相左的添加默认值
例如:
int harpo(int n=1,int m=4,int j=5);
使用时可以部分缺省(或全缺省) harpo(2);
但是实参必须自左向右的赋给形参,不能跳过
harpo(2,,2)
int chico(int n=1,int m,int j=9);
7. 函数重载(函数多态)[通过编译器的名称修饰来区分]
使得可以使用多个重名的函数,使得他们使用不同的参数列表完成相同的工作
函数的参数列表又称为函数特征标
如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同
注意不要出现 double cube(double x);
double cube(double &x);
因为使用cube(n)时会出现两个都匹配的情况
匹配函数时,不区分是否为 const 变量
注意:函数返回类型可以不同,但是特征标必须不同!
函数重载中可以使用默认参数
8. 函数模板
函数模板允许以任意类型的方式来定义函数
必须关键字 template 、 typename(可以用 class 为旧式的)
格式例如:
template <typename AnyType> --> AnyType 为任意类型名
void Swap(AnyType &a,AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
模板本身不创建任何函数,但是它会指定编译器去定义函数
9. 重载的模板
要求被重载的模板的函数特征标必须不同,其他的和常规函数重载类似
10. 模板的显示具体化和实例化
具体化:
目的是使其能够用于特定的结构或类(另一种方法是为它们重载运算符)
当编译器找到与函数调用匹配的具体化定义时,会使用该定义而不找模板
ISO/ANSI C++98 标准:
a. 对于给定的函数名,可以有非模板函数、模板函数、
显式具体化模板函数和它们的重载版本
b. 显示具体化的原型和定义应以template<>打头,并通过
名称来支持类型
格式例如:
template <> void Swap<job>(job &,job &);
c. 优先级: 非模板函数 > 具体化 > 模板函数
例如:
void Swap(job &,job &);
template <typename T>
void Swap(T &,T &);
template <> void Swap<job>(job &,job &);
可等价简化为 template <> void Swap(job &,job &);
实例化:
隐式,就是当运行时,遇到类型时生成使用
显式实例化,在编译时就要求编译出该类型的函数
差别在于,具体化的函数是自己编写的,而显式实例化,给出命令让编译器实现就可以了
格式例如:
template void Swap<int>(int,int);
11. 函数模板的发展
a. C++11 关键字 decltype
使用该关键字 decltype(x+y) z; 相当于声明了一个 和 x+y 类型相同的变量 z
b. C++11 后置返回类型
针对了模板函数的返回类型不确定情况
结合关键字 auto
于是格式 :
template <typename T1,typename T2>
auto fun(T1 x,T2 y) -> decltype(x+y)
{
...
return x+y;
}