C++知识回顾

C++知识回顾

  • 传值参数
    函数执行时,实参赋值给形参,复制过程是由形参类型的复制构造函数来完成,若实参形参类型不同则会类型转化,把实参转换成形参类型(允许转换的情况下)。函数运行结束时形参类型的析构函数负责释放形参。所以函数调用不会改变与形参对应的实参的值。
  • 引用参数
    实参为形参的别名,函数被调用时程序没有复制实参的值,函数返回时也没有调用析构函数。
  • 常量引用参数
    用关键字const指明函数不可修改的引用参数,告诉用户该函数不会修改实参。
template<class T>//模板函数
T abc1(T a, T b, T c) {
    
    
	return a + b * c;
}

template<class T>//引用参数
T abc2(T &a, T &b, T &c) {
    
    
	return a + b * c;
}

template<class T1,class T2,class T3>//常量引用参数
T1 abc(const T1 &a,const T2 &b,const T3 &c) {
    
    
	return a + b * c;
}
  • 返回值
    一个函数可以返回一个值、一个引用或一个常量引用。给函数返回类型增加一个后缀
    &便指定了一个引用返回。这种返回形式不会把z的值复制到返回环境中,当函数结束时,形参i及所有局部变量的空间被释放,而z仅为实参的引用,不受影响。若添加const关键字则得到const型引用返回,const引用返回在返回调用环境时必须赋值给const常量。
template<class T>
T& mystery(int i, T &z) {
    
    
	return z
}
  • 抛出异常和处理异常
    异常类基类为exception。
    try块后可以有一个或者多个catch块,一个异常别被抛出,那么try块的正常运行停止,程序进入第一个捕捉此异常类型的catch块中并执行,其他catch块被忽略。若没有被任何catch块捕捉,那么程序非正常停止。
int abc4(int a, int b, int c) {
    
    
	if (a <= 0 || b <= 0 || c <= 0)
		throw"All parameters should be > 0";//抛出异常
	return a + b * c;
}

int main() {
    
    
	try {
    
     cout << abc4(2, 0, 4) << endl; }
	catch (char *e) {
    
    //捕捉char*类型异常
		cout << e << endl;
		return 1;
	}
	return 0;
}
  • 动态存储空间分配
    C++操作符new用来进行动态存储分配或者运行时存储分配,它的值是一个指针,指向分配空间。delete用于释放new所分配的内存。
    动态分配一维数组可按如下方式创建。操作符new为n个整型数分配空间并返回第一个整型数空间的指针。若计算机无足够内存分配,则new不会分配内存,抛出类型为bad_alloc的异常,利用try-catch结构可捕捉该异常。
int *x=new int[n];
int n;
	try {
    
     int *x = new int[n]; }
	catch (bad_alloc) {
    
    
		cout << "out of memory" << endl;
		exit(1);
	}
delete y;//用于释放*y
delete []y;//用于释放一维数组y
  • 动态分配二维数组
    若二维数组列或行位置,则用new动态分配创建。若在编译时两者都未知,那么不可能尽调用一次new来创建二维数组。创建时可看作若干行 组成的结构,每一行都是一个能用new来创建的一维数组。指向每一行的指针保存在另外一个一维数组中。释放该二维数组也需要分步骤。三者代码如下。
	char(*c)[5];
	try {
    
     c = new char[n][5]; }
	catch (bad_alloc) {
    
    
		cerr << "out of memory" << endl;
		exit(1);
	}
	char **x;//x是指向指针的指针 
	try {
    
     
		x = new char*[n]; //创建行指针
		for (int i = 0; i < n; i++)//为每一行分配空间
			x[i] = new char[m];
		return true;
	}
	catch (bad_alloc) {
    
    
		return false;
	}
	for (int i = 0; i < n; i++)//释放每一行数组空间
		delete[]x[i];
	delete[]x;//释放行指针
	x = NULL;

猜你喜欢

转载自blog.csdn.net/GGGGG1233/article/details/114281386
今日推荐