upstreamL

博客中的文章用于做笔记用,来源于网络,并非本人所写,如有侵权,请您联系我标明出处或删除,3Q~

导航

C++中 int i 与 int &i 注意事项

 来源:http://blog.csdn.net/qianchenglenger/article/details/16949689

1.int i 传值,int & i 传引用

int i不会回带参数,而int &i可以回带参数,如

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2.   
  3. void test1(int i)  
  4. {  
  5.     i = 7;  
  6. }  
  7.   
  8. void test2(int &i) //要限制参数改动,可以加const限制  
  9. {  
  10.     i = 7;  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     int t1 = 10;  
  16.     test1(t1);  
  17.     std::cout << t1 << std::endl; //输出为10  
  18.   
  19.     int t2 = 10;  
  20.     test2(t2);  
  21.     std::cout << t2 << std::endl;   //输出为7  
  22.   
  23.     return 0;  
  24. }  

2. int i 可赋予常量,而int & i 不能

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2.   
  3. void test1(int i)  
  4. {  
  5.     i = 7;  
  6. }  
  7.   
  8. void test2(int &i)  
  9. {  
  10.     i = 7;  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     int i = 10;     //合法  
  16.     int &i1 = 10;   //编译错误  
  17.   
  18.     test1(10);      //合法  
  19.     test2(10);      //编译错误  
  20.   
  21.     return 0;  
  22. }  

3. int &i 相当于别名,而int i 只是拷贝

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2.   
  3. int main()  
  4. {  
  5.     int t1 = 10;  
  6.     int t2 = 10;  
  7.     int i1 = t1;    //复制  
  8.     int &i2 = t2;   //别名  
  9.       
  10.     i1 = 7;  
  11.     i2 = 7;  
  12.   
  13.     std::cout << t1 << std::endl;   //输出10  
  14.     std::cout << t2 << std::endl;   //输出7  
  15.   
  16.     return 0;  
  17. }  

最后,我们再来看一下个例子

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2. class A{  
  3. public:  
  4.     A(int a, int b):i1(a),i2(b){};  
  5.   
  6. public:  
  7.     int i1;  
  8.     int &i2;  
  9. };  
  10.   
  11. int main()  
  12. {  
  13.     A a(45,60);  
  14.     std::cout << a.i1 << " " << a.i2 << std::endl;  
  15.     return 0;  
  16. }  

在电脑上运行之后,你会发现,第一个数字正常,而第二个数字明显是一个未定义的值,例如我运行后得到的结果是

 

45  1400458944

这是因为我们在构造一个对象的时候,调用了构造函数,而A的构造函数的参数传递为传值方式,所以,当调用时,相当于有一个

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. int b = 60   
存在,而 i2(b) 相当于将
[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. int &i2 = b;  
而当构造函数调用完成,b的作用域结束,b被销毁,而i2指向一个已经被销毁的地方,所以会出现未定义的运行结果。
我们再贴一段程序,和上面的一段相对应,只是,这次,我们将会获得 45 60  的结果
[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2. class A{  
  3. public:  
  4.     A(int a, int &b):i1(a),i2(b){};  
  5.   
  6. public:  
  7.     int i1;  
  8.     int &i2;  
  9. };  
  10.   
  11. int main()  
  12. {  
  13.     int t  = 60;  
  14.     A a(45,t);  
  15.     std::cout << a.i1 << " " << a.i2 << std::endl;  
  16.     return 0;  
  17. }  
 
 

posted on 2016-10-30 18:38  upstreamL  阅读(434)  评论(0编辑  收藏  举报