设为首页 加入收藏

TOP

3.2.4 简答题
2013-10-07 16:20:20 来源: 作者: 【 】 浏览:67
Tags:3.2.4 答题

3.2.4  简答题

【例3.14】什么是引用?声明和使用引用时要注意哪些问题?

解:引用就是某个目标变量的"别名",对引用的操作与对变量直接操作效果完全相同。声明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

【例3.15】简述指针和引用的相同点和不同点。

解:两者的相同点是都是地址概念:指针指向一块内存,它的内容是所指内存的首地址;引用是某块内存地址的别名。如:

  1. int n=10;  
  2. int &rp=n;  
  3. int *p=&n;  

&rp和p都表示变量n的地址。

两者的不同点是:指针是个实体,而引用仅是个别名;引用不是变量,引用必须初始化,指针是变量,可以不初始化。空引用没有任何意义,而指针是有意义的。引用不是值,不占存储空间,而指针变量会占用存储空间。

【例3.16】将引用作为函数参数有哪些特点?

解:(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

【例3.17】阅读下面的程序,如果程序中有错误,找出错误,说明错误原因并改正。如果程序没有错误,请写出程序的运行结果。

  1. #include <iostream.h> 
  2. int &add(int x,int y)  
  3. {   return x+y;  }  
  4. void main()  
  5. {   int n=2,m=10;  
  6.     cout << (add(n,m)+=10) << endl;  
  7. }  

解:该程序有错误,因为add为一个引用型函数,但返回的是一个表达式x+y,它不能作为引用变量。程序改为:
 

  1. #include <iostream.h> 
  2. int &add(int x,int y)  
  3. {   int z;  
  4.     z=x+y;  
  5.     return z;  
  6. }  
  7. void main()  
  8. {   int n=2,m=10;  
  9.     cout << (add(n,m)+=10) << endl;  
  10. }  

修改后的程序虽然运行正确,但有一个警告提示,因为add函数中,z是一个局部变量,函数运行后,该变量被释放,为此可将z改成全局变量,程序进一步改为:
 

  1. #include <iostream.h> 
  2. int z;                //全局变量  
  3. int &add(int x,int y)  
  4. {   z=x+y;  
  5.     return z;  
  6. }  
  7. void main()  
  8. {   int n=2,m=10;  
  9.     cout << (add(n,m)+=10) << endl;  
  10. }  

执行add(n,m)+=10语句,先调用add(n,m),返回12(z=12),再加上10(z=22),输出22。程序执行结果为22。

上述程序中也可以将z改为静态变量,也就是在add()函数中将z定义改为static int z。这样也不再出现警告信息提示。

【例3.18】阅读下面程序,如果程序中有错误,找出错误,说明错误原因并改正。如果程序没有错误,请写出程序的运行结果。

  1. #include <iostream.h> 
  2. class Sample  
  3. {   int x,y;  
  4. public:  
  5.     Sample(int a,int b) { x=a;y=b; }  
  6.     void fun(Sample &p);  
  7.     void fun(Sample *p);  
  8. };  
  9. void Sample::fun(Sample &p)  
  10. {   x=p.x;y=p.y;  
  11.     cout << "fun(Sample &p)" << endl;  
  12. }  
  13. void Sample::fun(Sample *p)  
  14. {   x=p->x;y=p->y;  
  15.     cout << "fun(Sample *p)" << endl;  
  16. }  
  17. void main()  
  18. {   Sample p(1,2),q(3,4);  
  19.     p.fun(q);  
  20.     p.fun(&q);  
  21. }  

解:上述程序没有错误,因为类Sample中重载了成员函数fun(),该函数的参数类型不同,满足重载条件。程序运行结果如下:
 

  1. fun(Sample &p)  
  2. fun(Sample *p)  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.2.3 判断题 下一篇3.2.5 编程题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 Python 进行数据 (2025-12-25 15:49:09)
·如何学习Python数据 (2025-12-25 15:49:07)
·利用Python进行数据 (2025-12-25 15:49:04)
·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)