c++学习记录(三)

- 动态内存分配


new运算符

new 运算符是实现动态内存分配的一种方式。
  • 第一种用法
分配给一个变量动态内存空间

格式

P=new T;
其中T是任意类型名,P是类型为T*的指针
含义:动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。
例:
int *pn;
pn=new int;
*pn=5;
  • 第二种用法
分配给一个数组动态内存空间

格式

P=new T[N]
其中T为任意类型名,P为类型是T*的指针,N是要分配的数组元素的个数,可以是整型表达式。
含义:动态分配出一片大小为N*siziof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。
  • 动态分配数组示例
int *pn;
int i=5;
pn=new int [i*20];
pn[0]=20;
pn[100]=100;//编译时不会出错,运行时会出现数组越界现象
  • new运算符的返回值类型

new T;
new T [n];

以上两种表达式的返回值类型都是T*

delete运算符

有分配内存,自然就有释放内存
若不及时释放new分配的内存,不断积累,最后可能别的程序要运行时,会内存不足。
  • delete 释放变量内存
格式#####

delete 指针;//该指针必须指向new分配出来的空间

int *p=new int;
*p=5;
delete p;
delete p;//导致异常,一片空间不能被delete多次
  • delete 释放动态分配的数组
用'delete'释放动态分配的数组内存要加'[]'
格式

delete [] 指针;//该指针必须指向new出来的数组

例:
int *p=new int [20];
p[0]=1;
delete [] p;

内联函数,函数重载,函数缺省值

  • 内联函数

首先需要了解,函数的调用是有时间开销的,调用函数时,要把参数,返回值等等放入栈内,再跳转到函数的地址去执行函数。
这个开销似乎很小,但是若被调用的函数本身只有几条语句,且被多次调用时,由于语句少,所以时间开销也小,此时调用函数的时间开销与之对比就会显得比较大,对于非常追求效率的c++来说,这是不能忍受的,因此内联函数因运而生。
编译器对于内联函数的调用语句的处理是将整个函数的代码插入到调用的语句处,从而省去了调用函数的时间开销。
  • 定义方法
在函数定义前加inline关键字,即可定义内联函数
例:
inline int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
- 若有k=max(n1,n2);的调用,则等价于
if(n1>n2)
tmp=n1;
else
tmp=n2;
k=tmp;

  • 函数重(chong)载:

- 定义:一个或多个函数名字相同,而参数个数或参数类型不同。
例:以下三个函数是重载关系
int max(double f1,double f2){}
int max(int n1,int n2){}
int max(int n1,int n2,int n3){}
- 优点:简化命名,比如上面的就不用再用max1,max2,max3,这类名称区别。
- 编译器是根据调用语句中的实参的个数和类型判断应该调用的是哪个函数。
例:
max(3.4,2.5);//调用第一个
max(2,4);//调用第二个
max(1,2,3);//调用第三个
max(3,2.4);//error,二义性
对于函数名相同,函数参数个数以及函数参数类型相同,只有返回值不同的函数,称为重复定义。

  • 函数的缺省参数

c++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数时,若相应位置不写参数,参数就是缺省值。

例:
void func(int x1,int x2=2,int x3=3){}
func(10);//等价于func(10,2,3)
func(10,8);//等价于func(10,8,3)
func(10,,8);//不行!只能是最右边的连续若干参数缺省

- 一定要注意:只能是最右边的连续若干参数缺省!!

- 好处:可以提高程序的可扩充性
- 为什么这么说呢?
因为,假如一个写好的函数需要添加新的参数,按平常的函数,我们肯定要把一个个的这个函数都找出来,一个个的添加新参数,但是,如果用了缺省参数,那就可以不必全部找出来修改,大大减少修改量,提高效率。
原文地址:https://www.cnblogs.com/2002ljy/p/12244016.html