c++内容复习之函数
形参与实参的区别
函数的形参为函数提供了已命名的局部存储空间。形参是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化。
实参与形参必须有类型相同或者可以隐式转换。
形参的初始化与变量的初始化一样,如果形具有非引用类型,则复制实参的值,如果形参为引用类型,则只是实参的别名。
对形参修改的函数,不会改变实参的值,只是修改实参的副本。
1.指针形参
函数可通过指针实现赋值,修改指针所指向对象的值。
2.const形参
复制实参的局限性
当需要在函数中修改实参的值时。
当需要大型对象作为实参传递时,复制对象所付出的时间和存储空间往往过大。
当没有办法实现对象的复制时。
引用形参
使用const引用避免复制发数据。如果使用引用形参的唯一目的是避免复制实参 ,不修改实参, 则应将形参定义为const引用。
非const引用形参只能与完全同类型的非const对象关联。
不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参不能用const对象初始化,也不能用字面值或者产生的右值的表达式实参初始化。例子如下:
string:: size_type find_char(string &s, char c) { string:: size_type i=0; while(i!=s.size() && s[i] !=c) ++i; return i; } find_str("hello world",'o');// 此种写法会导致编译失败
数组形参
数组两个特性 一是不能复制数组 二是使用数组名字的时候,数组名会自动转化为指向第一个元素的指针。
局部对象
1. 自动对象
局部变量的生命期局限于所在函数的每次执行期间,只有它的函数被调用时才存在的对象称为自动对象
自动对象包括形参,都会在定义它们的快语句结束时撤销。
2.静态局部对象
static 位于函数作用域内,生命期跨越这个函数多次调用。程序结束才会被撤销。
内联函数
调用函数比求解等价表达式慢得多。
调用函数需要的过程:调用前要先保存寄存器,并在返回时恢复,复制实参,程序转向一个新位置。
内联机制只适用于优化小的,只有几行的而且经常被调用的函数
inline const string & shorterString(const string &s1, const string &2)
{
return s1.size()<s2.size() ? s1: s2;
}
1.内联函数可以减轻开销
cout<<shorterString(s1,s2)<<endl;
编译时展开为:cout<<(s1.size()<s2.size()?s1:s2);
2.内联函数放入头文件
内联函数的定义在头文件中
类的成员函数
1.类的成员函数 可以访问 private 成员
2.在类外定义成员函数
double Sales_item:: avg_price() const { if(units_sold) return revenue/units_sold; else return 0; }
const 表示函数被声明为const成员函数。