c++函数和变量

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 :引用即别名。定义后就立即初始化,且不能再引用别的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值