logo头像
Snippet 博客主题

NO Title!

《数据结构算法与应用》

C++回顾

首先我们编写一个很简单的函数

1
2
3
4
int abc(int a,int b,int c)
{
return a+b*c;
}

其中,a,b,c都是函数abc的形参,即形式参数

当我们调用该函数时

1
z=abc(2,x,y);

其中的2,x,y便是实参,即实际上进行运算的参数

所以形参与实参的区别在于,形参只是提供了一个类似于模板的作用,真正在程序中进行运算的是实参

其原理是,在调用函数时,将实际参数复制给形式参数,复制过程由形参类型的复制构造函数完成

为此,当函数运行结束时,形参类型的析构函数会释放形式参数,为此形式参数的值不会被复制到相应的实参中,下面代码的结果可以证明这一点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void swap1(int a,int b)
{
int temp=a;
a=b;
b=temp;
}
void swap2(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int main()
{
int number[2]={3,5};
swap1(number[0],number[1]);
cout<<number[0]<<number[1]<<endl;
swap2(number[0],number[1]);
cout<<number[0]<<number[1]<<endl;
system("pause");
return 0;
}

运行结果

1
2
3 5//swap1的结果
5 3//swap2的结果

swap2会改变number数组中两个值的位置,而swap1不会

因为对于swap2,我们使用了引用参数类型,所以会对实参的数据进行修改,换句话说,函数调用后,实际上的数据也会发生变化

动态分配

操作符new

​ new操作符作用,用来进行动态存储分配或运行时存储分配,它的值是一个指针,指向分配空间

1
2
int* y;
y=new int;

操作符new分配了一块能够存储一个整数的空间,并将该空间的指针赋给y

二维数组

当二维数组作为函数形参的时候,需要对其第二维大小进行指定

1
2
int f(int a[][]){}//不指定第二维作为形式参数时,不可定义
int f(int a[][10]){}//指定第二维作为形式参数后才可对该函数进行定义

如果在定义一个二维数组时,只知道其中一维的大小,可采用如下语法进行分配

1
2
3
4
5
6
7
char(*c)[5];
try{c=new char[n][5];}
catch(bad_alloc)
{
cerr<<"Out of Memory"<<endl;
exit(1);
}

为一个二维数组分配存储空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
bool make2dArray(T ** &x,int numberOfRows,int numberOfColumns)
{
try{
//创建行指针
x=new T*[numberOfRows];

//为每一行分配空间
for(int i=0;i<numberOfRows;i++)
x[i]=new T[numberOfColumns];
return true;
}
catch(bad_alloc){return false;}
}