C++Primer 函数

1.函数的调用:用对应的实参初始化函数的形参,并将控制权转移给被调用函数。

2.形参和实参:形参在函数定义的形参表中进行定义,是一个变量,其作用域为整个函数。而实参是出现在函数调用中的表达式。进行函数调用时用传递给函数的实参对形参进行初始化。实参和形参必须数目相同,类型可以转换。

3.非引用形参:这类形参其实只在函数内部修改了实参的副本,并不影响实参真正的值。

void swap(int &v1,int &v2)
{
  int tmp = v2;
  v2 = v1;
  v1 = tmp;
}

而如果是指针形参,则他指向的元素可以修改,他本身在函数中的修改并不在函数外呈现。即跳出函数后ip仍然指向原来的元素。

如果要保护指针指向的值,则形参需要定义为const int *ip。


4.引用形参:在希望改变实参的值,或者希望避免复制大量实参的情况下,使用引用形参。这里的引用形参直接关联到所绑定的对象,而并不是这些对象的副本。

void swap(int &v1,int &v2)
{
  int tmp = v2;
  v2 = v1;
  v1 = tmp;
}

指向指针的引用:这里v1是一个引用,与指向int型对象的指针相关联。

void ptrswap(int *&v1,int *&v2)
{
  int *tmp = v2;
  v2 = v1;
  v1 = temp;
}


在希望得到另外的信息时,occurs作为引用形参,可以同步改变值,并最终在主函数中得到这个值。

it = find_val(ivec.begin(),ivec.end(),find_value, ctr)
vector<int>::const_iterator find_val(
vector<int>::const_iterator beg,
vector<int>::const_iterator end,
int value,
vector<int>::size_type &occurs)


const引用:将不需要修改的应用形参都定义为const引用,普通的非const引用形参既不能用const对象初始化,也不能用字面值或产生的右值表达式初始化。


5.容器类型的形参:要避免复制容器,通常传输指向容器中元素的迭代器作为形参。

6.数组形参:数组不能复制,数组名会自动转化为指向其第一个元素的指针。因此数组形参其实就是指针,可以直接定义为指针。可以通过函数改变这个指针指向的数组值。除非指针定义为const int*。

void printValues(int *)
void printValues(int[])
void printValues(int[10])//这里虽然定义了长度,其实并没有强制实现这个长度

通过引用传递数组:数组大小称为形参和实参类型的一部分,这里是数组,不是指针。

void printValues(int (&arr)[10])

多维数组的传递:第一个指针,是指向二维数组的第一组内层数组的指针。

void printValues(int (*matrix)[10],int rowSize)

7.main:int main(int argc, char *argv[])//argv是一个c风格字符串数组

8.return语句:不带返回值的return;只能用在返回类型为void的函数,其实这时并不必须在末尾写return;因为函数会在最后一个语句之后隐式的完成return,通常在函数中间用return,是为了提前结束函数的运行,类似break的作用。

返回非引用类型:编译器会创建一个临时对象,存这个返回值。

返回引用类型:没有复制返回值,返回的是对象本身。一定不能返回局部变量的引用或指针。返回引用时可以给这个返回值赋值,因为他是左值。


9.函数的声明:可以声明多次,定义一次,通常在头文件中。

函数原型:函数返回值类型,函数名,形参列表。不需要形参名。

void print(int *array, int size);

默认实参:给形参列表中的形参提供明确的初始化,在调用时没有实参,则用默认实参,有则覆盖。

string screenInit(string::size_type height = 24,
                  string::size_type width = 80,
                  char background = '')

10.局部对象与自动对象:只有当定义它的函数被调用时才存在的对象称为自动对象,包括形参。自动对象在定义他们的快语句结束时撤销。

静态局部对象,一旦被创建在程序结束前都不会撤销。

size_t count_calls()
{
  static size_t ctr = 0;
  return ++ctr;
}


11.内联函数:避免函数调用的开销。一个只有几行,经常使用的函数,如果一直去调用会很耗费资源。将他定义为内联函数,可以在程序中的每个调用点内联的展开函数。因此内联函数必须在编译时是可见的,要在头文件中定义。

inline const string &shortString(const string &s1,const string &s2)
{ return (s1.size()<s2.size() ? s1 :s2);} 

cout<< shourterString(s1,s2)<<endl;
cout<< (s1.size()<s2.size() ? s1 :s2) <<endl;


12.指向函数的指针:pf声明为指向函数的指针,所指向的函数带有两个const string类型的形参和bool类型的返回值。这里的cmpFcn则是一种指向函数的指针类型的名字。

bool (*pf)(const string &, const string &);
typedef bool (*cmpFcn) (const string &, const string &);

以下两种赋值是等效的。

cmpFcn pf1 = lengthCompare;
cmpFcn pf2 = &lengthCompare;

调用也是等效的:

lengthCompare("hi","bye");
pf("hi","bye");
(*pf)("hi","bye");

返回指向函数的指针:ff(int)是一个函数,返回的是一个指向函数的指针 int (*)(int*,int);

int (*ff(int))(int*,int);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值