C++学习笔记一

在程序中,调用函数时,内存会从一个地址跳到一个特定的地址上,当函数执行完后,在返回。

内联函数则可以不用跳来跳去,但有点消耗空间,它会直接在函数后面去执行函数里的代码,但会产生函数的副本。定义内联函数的方法是 inline 并且一般是函数只有一行,多行不推荐使用。内联函数跟宏有点类似,但又很不相同,你用宏定义的求x^2函数,是不能放表达式的,而内联函数时可以的,当然这个是可以解决的。但宏不能按值传递。即使使用新的定义,仍会把C递增两次(拿x*x来说,宏会传递两次x的值) ,而内联只会递增一次。

 

变量引用,可以将让一个值拥有两个变量的名称,例如int rats; int & rodents=rats;这样可以rodents和rats是一样的值,并且当你rodents加1的时候,rats也会加1,当你输出他们的两个函数的地址会发现地址是一模一样的。这根指针有点像但又不是彻底的像,变量引用必须在定义的时候就赋值,而且一旦引用了,就绝对不能再引用新的变量(很忠诚).

 

将引用作为函数参数时,可以对其直接进行值的修改,但是用了const后就无法修改了,并且如果实参与引用的参数不匹配,则C++会生成临时变量,什么叫临时变量呢?临时变量就是当一个函数中其中一个参数时double &a,而你传的参数时long a=4;由于形参和实参的类型不同,所以在函数调用时,会生成一个匿名变量来接收long a=4的变量,然后在传入函数里面。但这样会导致,a的值无法被函数改变,所以有点类似值传递效果了。唯一解决的方式是进制创建临时变量。因此,如果声明将引用制定为const,C++将在必要时生成临时变量。

int & accumulate(int & a,const int & b) {return a}可以构造如下语句:

accumulate(a,b)=c;因为accumulate返回的是引用,所以该语句等于accumulate(a,b);a=c;

为何上面这条语句不会报错呢?常规函数(非引用)的返回值是右值(=号右边的值),这是因为这种返回值位于临时内存单元中,运行到下一跳语句时,它们(返回值)可能不在存在了。

而左式中,必须标识一个可修改的内存块。

由于返回函数终止时,会导致里面的内存单元全部释放,而你的函数又是返回引用时,例如int & accumulate(int & a,const int & b) {int c;c=a;return c;}函数运行完毕后,c将不再存在,也就是说返回的值也没有了。解决方法可以使用参数来传递函数的引用,或者用new来分配新的存储空间,在返回。

 在函数中,把const值赋给非const值是非法的,非const赋给const是合法的

————————————————————————————————————————————————————

使用模板<template>特定类型生成函数swap()的一个实例,叫模板实例,也就是template <int T>

而用模板<template>不同类型生成函数swap的一个实例,叫隐式实例化, 也就是tempplate<class T>声明的却是个int类型的

————————————————————————————————————————————————————

 

 重载解析:对于函数重载、函数模板和函数模板重载,在什么时候用什么函数的过程叫做重载解析

第一步:创建候选函数列表。其中包含与被调用函数的名称相同的函数和模板函数

第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数,为此有一个隐式转换序列,其中包括实参类型与相应的形参类型完全匹配的情况。例如,,使用float参数的函数调用可以将参数转换为double,从而与double形参匹配,而模板可以为float生成一个实例。

第三步:确定是否有最佳的可行函数。如果有,则使用它,否则该函数调用出错。

原文地址:https://www.cnblogs.com/pppyyyzzz/p/12015735.html