1 c++函数定义 缺省参数
函数的声明在定义之前,声明不需要指明参数名,只有类型,即 T f(T1,T2,...)
缺省参数从右往左
当调用函数时,首先开辟一个栈,为形参和局部变量开辟空间,然后将实参赋值给形参,将函数返回地址放入栈中,最后再跳入函数体内执行。
2 函数的形参和实参的拷贝
对于变量类型、指针类型的实参,形参是实参的拷贝。对于引用,不会出现拷贝,这对对象进行处理的时候,可以直接使用引用,这样省去了形参的拷贝构造函数和析构的过程。
对于传值的情况,改变形参的大小,不会影响外部的实参大小。尤其是指针,当改变指针指向的地址时,不会影响实参的大小。对于可以指针和引用,改变指针地址对应的存储值或者引用对应的值时,可以改变实参大小
例如:
char getMemory(char *p)
{
p =new char;
}
void test()
{
char *a=NULL;
getM(a);
strcpy(a,"niha0");
}
这回运行发生错误。a只执行完getM后仍然是NULL!
没有new释放!
可以这样:
void getMemory(char **p)
{
*p =new char;
}
或者:
char* getMemory()
{
char *p =new char;
return p;
}
3返回值
对于返回值:不能返回建立在栈上的引用或者指向栈内存的指针(指针)。可以返回建立在堆或者是静态区的指针 或者引用
可以返回栈内建立的值(基本数据类型或者对象),这时调用拷贝构造或者赋值函数。
可以返回本对象*this的引用,无需拷贝。
考虑return 效率:
return string(s1+s2)//创建一个临时对象,这是直接创建在外部存储单元的,不需要再进行构造和析够
string temp(s1+s2);
return temp ;这是不同的过程,下面是temp被创建,然后temp拷贝保存返回值的外部存储单元,然后temp被销毁
4函数的重载----在编译阶段确定调用何种函数(C++ primer P208)
条件:相同的函数名,作用域,只是参数个数或者类型不同。主要仅返回类型不同,不能是重载,是重复定义。
注意:
T f(const T &)和T f(T&)属于重载
T g(const T*)和T g (T*)属于重载
当实参为非常量的指针/引用,这两种函数均可以,编译器会优先选择不含const的
而
T f(const T )和T f(T) 不属于重载 同一函数
T g(T* const )和T g (T*)不属于重载 同一函数
5 各种变量的作用域和生存期:全局 静态局部/全局 局部变量
作用域 生存期
全局变量: 定义全局变量的文件,在别的文件中使用需要extern声明一下 整个程序运行期间 建立在全局区域上,默认初始化为0
静态全局变量 只在定义的文件中使用,别的文件不能使用 同上
静态局部变量 在定义的函数体内,只初始化一次 同上
局部变量 在定义的最近的{}内 执行{} 建立在栈上,默认初始化值为随机的.
注意
do{
int i=3;
}while(i>0) ----这种是错误的,i存在{}内,出了{},不存在该变量名
6各种变量静态 常量 引用
static T s :生存期为整个程序运行期间,值进行一次初始化。
const T c ;一旦初始化后,且不能再改变。引用
#define T VALUE
注意符号常量和const,在c++中常用const,有数据类型,可以进行类型检查。
T& y :引用即别名。定义后就立即初始化,且不能再引用别的。