[C++]
1、函数重载:
所谓函数重载是指同一个函数名可以对应着多个函数的实现。
函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。
2、在C和C++中,有三种使用存储区的基本方式:
1)静态存储区(Static Memory)
在静态存储区中,连接器(linker)根据程序的需求为对象分配空间。全局变量、静态类成员以及函数中的静态变量都被分配在该区域中。一个在该区域中分配的对象只被构造一次,其生存期一直维持到程序结束。在程序运行的时候其中的地址是固定不变的。在使用线程(thread,共享地址空间的并发物)的程序里,静态对象可能会引起一些问题,因为这时的静态对象是被共享的,要对其正常访问就需要进行锁定操作。
2)自动存储区(Automatic Memory)
函数的参数和局部变量被分配在此。对同一个函数或区块的每一处调用,其在该区域内都有自己单独的位置。这种存储被自动创建和销毁;因而才叫做“自动存储区”。自动存储区也被称为是“在栈上的(be on the stack)”。
3)自由存储区(Free Store)
在该区域中,程序必须明确的为对象申请空间,并可以在使用完毕之后释放申请到的空间(使用new和delete运算符)。当程序需要其中更多的空间时,就使用new向操作系统提出申请。通常情况下,自由存储区(也被称作动态存储区或者堆(heap))在一个程序的生存期内是不断增大的,因为其间被其它程序占用的空间从来都不被归还给操作系统。
3、关于传值与传址及引用:
传值是在被调用函数所在区域做一个被传参数的拷贝,既然是拷贝了被传参数,那么在函数中对形参的改变不会影响到被传参数.也就是说函数的参数不具备返回值的能力.
传值调用.把实参的右值(即内容,不可被赋值)传递进来,所以函数内部改变形参不会影响实参.
传址是指传送的对象为指针或引用,再传递时被调函数得到的是被传数据的地址,在被调函数中对原被传数据的地址直接进行操作将影响到实参的值,实参的值有可能被改变.
传址调用。把实参的左值(即地址,可被赋值)传递进来,所以函数对形参的改变,相当于直接修改了实参地址里的内容。c中没有引用,传址功能可以实现c++中的引用。
下列程序显示了引用参数与非引用参数之间的差别:
void FuncA(int&; Param) //reference parameter
{
++Param;
}
void FuncB(int Param) //nonreference parameter
{
++Param;
}
void main(void)
{
int
N=0;
FuncA(N); //N passed by reference
//here,N equals 1
FuncB(N); //N passed by value
//here,N still equals 1
}
4、指针与引用(reference):
指针的提领(dereference,"指向"的意思)标记 * 用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。
引用的标记 &; 用在声明中,表示声明的对象是一个引用;用在表达式中,叫做取址运算符,表示取得对象所在的内存地址,而非对象的值。&; 操作符前后的空白无意义。声明为引用的变量是另一个变量的别名。可以用“&;”操作符声明引用。
指针是指向目标内存位置的地址的内存变量,而引用变量直接指向目标内存地址(与指定初始化的变量相同),它是被引用变量的别名。
5、inline函数:
如果用inline关键字声明函数,例如:
inline int FuncA(int X)
{
//function code...
}
编译器想把对这个函数的所有调用换成实际函数码.
inline函数类似于用#define预处理器命令定义的宏功能。例如,下列返回整数绝对值的inline函数
inline int Abs(int N)
{
return N<0?-N:N;
}
类似于宏功能
#define Abs(N) ((N)<0?-(N):(N))
但