目录
缺省参数 (默认参数)
定义:指当函数调用中省略了实参数时自动使用的一个值。
例如: void func(int a = 1){...}
调用 func() 相当于 func (1);
全缺省参数:所有参数都有默认值 。例: void func (int a = 0, int b = 1, int c = 2)
半缺省参数:部分参数带有缺省值,必须从右往左依次给出 在调用赋值从左-->右
缺省参数不能在声明和定义中同时出现。(最好出现在声明时)
注: 缺省值是常量或者全局变量
函数重载
定义:是函数一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同。 返回值类型是否相同无所谓。
为什么C语言不支持重载而C++可以?
在C语言环境下调用int型的Add函数:
再调用float型的Add函数:
C语言中,编译器对函数名字的修饰规则:仅在函数名前加"_"。所以当函数重载后,编译器无法解析它们的不同,所以 C语言不能重载。
C++环境下运行的结果:
C++函数名修饰规则:
Visual C++的名称修饰规则 :修饰后名字由“?”开头
函数名由“@”符号结尾的函数名
后面跟着由“@”结尾的类名和名称空间(此处未创建类和命名空间所以没有)
第一个“A”表示函数调用类型为“_cdecl”
接着是函数的返回值类型及两个参数类型,由“@”结束 // int ---> H ; double ---> N
最后由“Z”结尾
所以,由于命名规则的不同,C语言不能函数重载而C++可以。
引用
概念:引用并不是重新定义一个变量,而是给已存在的变量取别名,对引用的操作与对变量直接操作完全一样。它会与所引用的变量公用同一块空间,所以不用再另开辟空间。
功能:
作为函数参数
// 与C语言不同,C++的引用会直接将实参地址当作参数传递
void swap(int &A, int &B)
{
int tmp;
A = tmp;
A = B;
B = tmp;
}
从函数中返回左值。
int &Func(int &a)
{
a += 1;
return a;
}
特性:
1. 一个变量可以有多个别名;
2. 一旦引用一个实体,不能再引用其他实体;
3. 引用类型必须和引用实体同一类型;
4. 引用定义必须初始化;
5. 引用在编译器中是以const指针实现的,所以它与指针占相同大小的内存;
6. 由于引用只能引用一个实体,所以它不能引用一个数组(许多元素的集合),但是可以建立数组的引用;
常引用
通过声明定义前加const,使得目标变量不可通过引用修改,增加代码安全性,健壮性。
声明方式:const 类型标识符 &引用名 = 目标变量名;
引用和指针的不同点:
1. 引用在定义时必须初始化,指针没有要求;
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同一类型实体;
3. 没有NULL引用,但有NULL指针;
4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4字节);
5. 引用自加即引用的实体增加1,指针自加即指针后偏移一个类型大小;
6. 有多级指针,但没有多级引用;
7. 访问实体方式不同,指针需要显示解引用,引用编译器自己处理;
8. 引用比指针使用起来相对安全,如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。
内联函数
---既保留了宏的特性,又比较安全
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展
开,没有函数压栈的开销,内联函数提升程序运行的效率,是一个以空间换时间的做法。
但是加上inline不一定会被当作内联函数,若函数中有递归,循环,函数较长不适用做内联函数。
inline对编译器只是一个建议。
// 由于宏定义<不开辟栈空间>:不安全,产生副作用,不能调试;所以就有了内联函数。
宏的优缺点:
优点:
1. 增强代码的复用性;
2. 提高性能;
缺点:
1. 不方便调试(预编译阶段进行了替换);
2. 没有类型检测;
3. 导致代码可读性差,可维护性差,容易误用。
C++那些地方可以替换宏?
宏函数 ---》 inline
宏变量 ---》 const
基于范围的for循环
语法: for(auto 迭代的变量 : 迭代的范围)
规则:
1. for循环范围必须确定:对于数组,就是数组的大小;
对于类,提供begin和end的方法
2. 迭代对象实现++和==的操作
指针空值---nullptr
C语言中表示空指针:
int* p1 = NULL; // NULL是一个宏
// 定义为:字面常量0 或者 无类型指针(void*)的常量
// 考虑到兼容性,保留了NULL
int* p2 = 0;
C++11中:
int* p3 = nullptr;指针空值常量
nullptr是有类型的,其类型是nullptr_t,仅仅可以被隐式转化为指针类型;
注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入;
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占字节数相同;
3. 为提高代码健壮性,在后续表示指针空值时建议最好使用nullptr。