形参和实参
类似于局部变量,函数的形参为函数提供了以命名的局部存储空间.它们之间的差别在于形参是在函数的形参标准中定义的,并由 调用函数时传递给函数的实参初始化.
.
实参则是一个表达式.它可以是变量,甚至是包含一个或几个操作符的表达式.调用函数时,所传递的实参个数必须与函数的形参个数完全相同,类型完全匹配,实参必须具有与形参类型相同,或者能隐式转换为形参类型的数据类型.
形参的初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,否则是实参的别名.
当函数返回引用类型时,没有复制返回值,返回的是对象本身.
千万不要返回局部对象的引用.
函数执行完,释放分个局部对象的存储空间.
函数的定义
函数由函数名以及一组操作数类型唯一地表示。函数地操作数,即形参,在一对圆括号中声明。函数执行地运算在一个称为函数体地块语句中定义。每一个函数都有一个相关联地返回类型。
int gcd(int v1,int v2)
{
while(v2)
{int temp=v2;
v2=v1%v2;
v=temp;
}
return v1;
}
函数的调用
C++使用函数调用操作符()实现函数的调用。一组调用操作符的操作数是函数名和一组(有可能是空)由逗号分隔的实参。函数调用的结果类型就是函数返回值的类型。
形参和实参
函数的形参为函数提供了已命名的局部存储空间。他们之间的差别在于形参是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化。
函数的返回类型
函数的返回类型可以是内置类型,不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或者是指向数组元素的指针。
函数必须指定返回类型。
函数形参表可以为空,但不能省略。
非引用形参
普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有调用所传递的实参本身。因此不会修改实参的值。
指针形参
如果函数形参是非const类型的指针,则函数可以通过指针实现赋值,修改指针所指对象的值。
复制实参的局限性
.当需要在函数中修改实参的值时
.当需要以大型对象作为实参传递时。
.当没有办法实现对象的复制时。
解决方法将形参定义为指针或引用类型。
千万不能返回局部变量的引用和指向局部对象的指针。
const string &manip(const string &s)
{
strng ret=s;
return ret;
}
类的成员函数
类的所有成员都必须在类定义的花括号里面声明。此后,不能再为类增加任何成员。类的成员函既可以在类的定义内也可以在类的定义外定义。
每一个成员函数都有一个形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址。
Const成员函数。由于this是指向const对象的指针,const成员函数不能修改调用调用该函数的对象.
初始化列表
Test():a(0),b(4) { }
出现在相同作用域的两个函数,如果具有相同的名字而形参表不同,则称为重载函数。
函数重载与重复声明的区别
如果两个函数声明的返回类型和形参表完全匹配,则是重复声明。如果两个函数的形参表完全相同,返回类型不同,则第二个声明是错误的。
指向函数的指针
bool (*pf) (const string&,const string&)
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。
如果指向函数的指针没有初始化,或者具有0值,则该指针不能在函数中使用。只有当指针
已经初始化,或被赋值为指向某个函数,才能安全调用函数。
指向重载函数的指针
C++允许使用函数指针指向重载的函数
extern void ff(vector<double>)
extern void ff(unsigned int)
void (*pf1) (unsigned int)=&ff;
指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误。