《数据结构 C语言 》电子教案免费下载
转变二、 声明位置的转变
C语言里,变量声明必须放在一个函数的开头,但在C++里,却不需要这么做,你可以在任何地方声明一个变量。而且,建议你尽量等需要用的时候再去定义一个变量。
转变三、 引用类型的引入
先来看下面一个例子:
#include
void swap(int a,int b)
{
int temp=a;
a=b;
b=temp;
}
int main()
{
int a=1,b=2;
swap(a,b);
printf("a=%d,b=%d",a,b);
}
输出结果:
a=1,b=2
写出这个程序的人,它编写的swap函数本意是想让两个参数的值互相交换。但是,我们知道,C语言里参数的传递都是以值传递的方式进行的,也就是说,这里将把作为实参的a,b的值赋值给作为形参的a,b,这样形参与实参并不是同一片内存空间,对形参a所做的赋值操作根本不会对实参a有任何的影响,所以最终会发现这个swap函数根本没有起到任何作用。
作为C语言高手的你会告诉我,想实现两个数交换,应该这么写:
#include
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a=1,b=2;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
}
确实,这个程序能达到交换两个值的效果,可是,我们要操作的是两个变量的值,而不是其地址,却需要往函数里传递两个变量的地址。总是让人感到不太直观。
C++里就出现了引用类型。
这样,原程序就可以这么写
#include
void swap(int &a,int &b) //只有这一行与原来的程序不同
{
int temp=a;
a=b;
b=temp;
}
int main()
{
int a=1,b=2;
swap(a,b);
printf("a=%d,b=%d",a,b);
}
这样,这个swap函数就对它的两个参数a,b的值进行了交换。
你可能会惊奇的问:什么?竟然在形参声明时对a取地址?
咱们先撇开上面的例子来说一下引用类型变量:
1. 引用类型相当于给变量起了一个别名
变量名就是一个用以标识一片内存区域的标识符,而声明引用变量就相当于给这片内存区域重新起了一个名字。这句话你现在看肯定不太清楚它是什么意思,但,请带着这句话看下面的几点
2. 引用类型变量的初始化
定义一个引用类型的变量时,这个&仅仅是用来表示声明的变量是是引用类型变量(而并非取地址的意思)。如
int a=123;
int &b=a;
b就是一个引用类型变量,它绑定在一个int类型的变量a上。如果现在输出b的值,就会得到b的值为123.
我们定义一个引用类型的变量时,必须用它所绑定的类型的一个变量对它进行初始化。
int a=123;
int &b1=a; //正确
int &b2; //错误,必须初始化
int &b3=123; //错误,必须用int型变量来进行初始化,而不能用常量来初始化。
3. 对引用类型变量进行赋值
先来看下面一段代码。
int a=123,b=234;
int &c=a;
c=b;
这时,a和c的值是多少?
有两种想法,第一种想法是c=b的意思和初始化时c=a那里差不多,表示让c从现在起开始绑定到b.所以a的值是123,c的值是234,这种想法很有依据,那就是指针变量就是这个样子,不过我可以很负责任的告诉你,这种想法在这里是错误的,至少,编译器和你的想法不一样。事实上,除了初始化的时候之外,你对一个引用类型的变量进行任何的操作,都相当于对它所绑定的变量进行了相同的操作,这个“任何”是包括赋值操作的。所以,这里c=b就相当于是a=b,执行了该操作后,a,c的值都变为234。
好,现在我们再来回头看一下前面那个程序,为了区别形参a,b和实参a,b,这里我把实参a,b记作a',b'.
形参列表里的int &a,int &b就相当于int &a'=a,int &'b=b
这样,a'绑定到了a上,成了a的另一个名字,b'就成了b的另一个名字,因此,对a',b'做的任何操作,都相当于对a,b进行了对应操作,这也就使形参与实参共用了同一片内存地址,便可以实现在函数中改变实参的值了。
这样,swap函数才真正直到了交换两个参数的值的作用。
4. const引用
const引用就是绑定在const对象上的引用。
如 const int data=123;
const int& data2=data; //正确
int &data3=data; //错误
//不能将int&型变量绑定在const int型变量上
但,可以用const int&变量绑定在int型变量上。如:
int data=123;
const int &data2=data; //正确
此后,可以利用给data赋值来给这片内存区域赋值,但却不能给data2赋值,因为data2是const int&型。
由于引用类型作为参数时,不是真正的值传递,形参与实参共用同一片内存区域,所以在用一些大的结构体对象或大的类对象(类是一种与结构体类似,但比结构体强大得多的东西,本书后面大部分内容都是在讲它)作参数时,可以把函数的形参声明为引用类型,以减小值传递所带来的开销。而且,在多数情况下,为了避免做为实参的对象在函数内不被修改,可以把形参设置为const引用。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !