1 函数的的唯一表示方式:
函数由函数名称 和 一组操作数类型(行参类型) 唯一表示。
2 类型检查:
C++是一种静态类型语言。每一次函数调用,编译器都会进行实参
类型检查,实参类型必须与行参相同或可以转换成行参类型。
3 参数传递:
若行参是非引用类型,则复制实参的值,
若行参是引用类型,则行参是实参的别名。
4 复制实参的局限性:
1 当需要修改实参本身
2 当实参是大型对象
3 当实参对象无法复制
5 引用类型行参:
利用引用类型行参可以实现对实参的直接操作。
但是需要注意:
1 对于非const引用行参,实参类型 必须 完全匹配;
2 对于非const引用行参,实参必须为左值。
3 const引用行参,实参可以不为左值,类型能够隐式转换即可。
6 标准库类型行参:
标准库类型 通常不作为 函数非引用类型行参,对于容器类型,通常采用
迭代器作为函数行参。
7 数组引用 作为 行参:
若函数的行参为数组的引用,调用函数时将直接传递数组本身 而 不是将
其转换成指针。
void func(int (&array)[10]); //此时必须指定数组长度
8 防止在操作数组行参时越界的解决方案:
1 设置数组结束元素,如字符串的'\0';
2 传递数组的起始地址和终止地址,类似与迭代器范围 begin(), end();
3 传递数组的长度信息;
9 返回引用:
不能返回函数局部变量的引用。应该确保返回的引用在调用函数之后不被
立即回收。同理,不能返回局部变量的指针。
10 默认值行参:
默认值实参是通过在函数定义时给行参参明确的初始值实现的。
一个行参具有默认值,则定义在其后面的行参必须都有默认值。
可以在声明中或定义中指定行参默认值,但是不能同时指定默认值,通常
选择在声明时指定行参默认值。
11 自动对象 和 静态局部对象:
自动对象是 每次调用函数时 被自动创建, 结束调用后被自动撤销的对象;
静态局部对象,作用域只位于一个函数中,但是生命周期为程序运行周期;
静态局部对象只进行一次初始化,保存在静态数据区。
12 内联函数(inline):
内联函数是为了避免调用短函数造成不必要的函数调用开销。
一般将内联函数定义在头文件中,内联函数不应该包有循环或递归调用。
编译器隐式地将在类内定义的成员函数当做内联函数。
13 this指针:
每个成员函数(除了static成员函数之外)都含有this指针,用来表示当
前调用该函数的对象。
const 成员函数 改变了this指针的类型,这使 const成员函数 只能对该
对象进行只读操作。
14 构造函数:
构造函数是特殊的成员函数,它与类同名,当时没有返回值类型。
构造函数一般为 pubilc,这样所有使用该类的代码都可以利用该构造器
初始化类对象。
15 函数的重载:
出现在相同作用域中的两个函数,如果函数名称相同而行参类表不同(行
参数目或类型),则称之为重载。
函数不能仅仅因为返回值不同而实现重载。
const 行参的重载:
若const行参修饰非引用行参,则不够成新的类型区别;
若const修饰引用行参,则构成类型区别,同理const修饰指针
也构成类型区别。
main函数不能重载,任何程序都只有一个main函数的实例。
析构器不能重载。
函数由函数名称 和 一组操作数类型(行参类型) 唯一表示。
2 类型检查:
C++是一种静态类型语言。每一次函数调用,编译器都会进行实参
类型检查,实参类型必须与行参相同或可以转换成行参类型。
3 参数传递:
若行参是非引用类型,则复制实参的值,
若行参是引用类型,则行参是实参的别名。
4 复制实参的局限性:
1 当需要修改实参本身
2 当实参是大型对象
3 当实参对象无法复制
5 引用类型行参:
利用引用类型行参可以实现对实参的直接操作。
但是需要注意:
1 对于非const引用行参,实参类型 必须 完全匹配;
2 对于非const引用行参,实参必须为左值。
3 const引用行参,实参可以不为左值,类型能够隐式转换即可。
6 标准库类型行参:
标准库类型 通常不作为 函数非引用类型行参,对于容器类型,通常采用
迭代器作为函数行参。
7 数组引用 作为 行参:
若函数的行参为数组的引用,调用函数时将直接传递数组本身 而 不是将
其转换成指针。
void func(int (&array)[10]); //此时必须指定数组长度
8 防止在操作数组行参时越界的解决方案:
1 设置数组结束元素,如字符串的'\0';
2 传递数组的起始地址和终止地址,类似与迭代器范围 begin(), end();
3 传递数组的长度信息;
9 返回引用:
不能返回函数局部变量的引用。应该确保返回的引用在调用函数之后不被
立即回收。同理,不能返回局部变量的指针。
10 默认值行参:
默认值实参是通过在函数定义时给行参参明确的初始值实现的。
一个行参具有默认值,则定义在其后面的行参必须都有默认值。
可以在声明中或定义中指定行参默认值,但是不能同时指定默认值,通常
选择在声明时指定行参默认值。
11 自动对象 和 静态局部对象:
自动对象是 每次调用函数时 被自动创建, 结束调用后被自动撤销的对象;
静态局部对象,作用域只位于一个函数中,但是生命周期为程序运行周期;
静态局部对象只进行一次初始化,保存在静态数据区。
12 内联函数(inline):
内联函数是为了避免调用短函数造成不必要的函数调用开销。
一般将内联函数定义在头文件中,内联函数不应该包有循环或递归调用。
编译器隐式地将在类内定义的成员函数当做内联函数。
13 this指针:
每个成员函数(除了static成员函数之外)都含有this指针,用来表示当
前调用该函数的对象。
const 成员函数 改变了this指针的类型,这使 const成员函数 只能对该
对象进行只读操作。
14 构造函数:
构造函数是特殊的成员函数,它与类同名,当时没有返回值类型。
构造函数一般为 pubilc,这样所有使用该类的代码都可以利用该构造器
初始化类对象。
15 函数的重载:
出现在相同作用域中的两个函数,如果函数名称相同而行参类表不同(行
参数目或类型),则称之为重载。
函数不能仅仅因为返回值不同而实现重载。
const 行参的重载:
若const行参修饰非引用行参,则不够成新的类型区别;
若const修饰引用行参,则构成类型区别,同理const修饰指针
也构成类型区别。
main函数不能重载,任何程序都只有一个main函数的实例。
析构器不能重载。