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

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

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

  1. #include <iostream>
  2. void test1(int i)
  3. {
  4. i = 7;
  5. }
  6. void test2(int &i) //要限制参数改动,可以加const限制
  7. {
  8. i = 7;
  9. }
  10. int main()
  11. {
  12. int t1 = 10;
  13. test1(t1);
  14. std::cout << t1 << std::endl; //输出为10
  15. int t2 = 10;
  16. test2(t2);
  17. std::cout << t2 << std::endl;   //输出为7
  18. return 0;
  19. }

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

  1. #include <iostream>
  2. void test1(int i)
  3. {
  4. i = 7;
  5. }
  6. void test2(int &i)
  7. {
  8. i = 7;
  9. }
  10. int main()
  11. {
  12. int i = 10;     //合法
  13. int &i1 = 10;   //编译错误
  14. test1(10);      //合法
  15. test2(10);      //编译错误
  16. return 0;
  17. }

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

  1. #include <iostream>
  2. int main()
  3. {
  4. int t1 = 10;
  5. int t2 = 10;
  6. int i1 = t1;    //复制
  7. int &i2 = t2;   //别名
  8. i1 = 7;
  9. i2 = 7;
  10. std::cout << t1 << std::endl;   //输出10
  11. std::cout << t2 << std::endl;   //输出7
  12. return 0;
  13. }

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

  1. #include <iostream>
  2. class A{
  3. public:
  4. A(int a, int b):i1(a),i2(b){};
  5. public:
  6. int i1;
  7. int &i2;
  8. };
  9. int main()
  10. {
  11. A a(45,60);
  12. std::cout << a.i1 << " " << a.i2 << std::endl;
  13. return 0;
  14. }

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

45  1400458944

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

  1. int b = 60
存在,而 i2(b) 相当于将

  1. int &i2 = b;

而当构造函数调用完成,b的作用域结束,b被销毁,而i2指向一个已经被销毁的地方,所以会出现未定义的运行结果。
我们再贴一段程序,和上面的一段相对应,只是,这次,我们将会获得 45 60  的结果

  1. #include <iostream>
  2. class A{
  3. public:
  4. A(int a, int &b):i1(a),i2(b){};
  5. public:
  6. int i1;
  7. int &i2;
  8. };
  9. int main()
  10. {
  11. int t  = 60;
  12. A a(45,t);
  13. std::cout << a.i1 << " " << a.i2 << std::endl;
  14. return 0;
  15. }
 
 

C++中 int i 与 int &i 注意事项的更多相关文章

  1. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  2. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>

    作者:Statmoon 出处:http://leolis.cnblogs.com/   在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...

  3. MySql中的tinying,smallint,int,bigint的类型介绍——转载

    tinyint 从 0 到 255 的整型数据.存储大小为 1 字节. smallint 从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据.存储大小为 2 个字节 ...

  4. C#/C++ 中字节数组与int类型转换

    1.C#中int和byte[]转换: /// <summary> /// 把int32类型的数据转存到4个字节的byte数组中 /// </summary> /// <p ...

  5. 嵌入式中的 *(volatile unsigned int *)0x500 解释

    C语言中*(volatile unsigned int *)0x500的解释: 如下: (unsigned int *)0x500:将地址0x500强制转化为int型指针*(unsigned int ...

  6. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  7. MVC Action,Service中筛选int 和list<int>

    action: public ActionResult DeleteByID(int id) { this.MessageService.DeleteMailTemplate(id); var fro ...

  8. c++ 中关于int,unsigned int , short的关系与应用

    转载:http://www.cppblog.com/xyjzsh/archive/2010/10/20/130554.aspx?opt=admin   int类型比较特殊,具体的字节数同机器字长和编译 ...

  9. [转载] java中byte数组与int,long,short间的转换

    文章转载自http://blog.csdn.net/leetcworks/article/details/7390731 package com.util; /** * * <ul> * ...

  10. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

随机推荐

  1. [UE4]在当前角色正前方2米处生成一个Actor

  2. css定位(后盾网)

    1.绝对定位:脱离了文档流,如果设置了left和top,位置相对浏览器来定位,如果不设值top和left,还是按照原来的文档流的位置站位,位置移走后,原来的空间位被其他元素占据 ***应用:一般来说我 ...

  3. SCCM2012 R2实战系列之十二:解决OSD分发时间过长的问题

    对于SCCM 2012 R2的初学者来说,能够成功分发操作系统可能已经是非常兴奋了.但在企业中会遇到客户提出的各种各样苛刻的需求.所以在平时实验过程中多站点客户的角度想问题,尽可能的贴近企业实际生产环 ...

  4. mdm9607 gpio12~17改成普通gpio的方法

    qualcomm mdm9607的gpio12~gpio17定义如下: 现在如果想要设置GPIO_12~GPIO_17为普通GPIO口. 需要修改如下: 顺便附上qualcomm的说明: Remove ...

  5. keras训练和保存

    https://cloud.tencent.com/developer/article/1010815 8.更科学地模型训练与模型保存 filepath = 'model-ep{epoch:03d}- ...

  6. (转)Java调用Weservice

    原文地址:http://www.cnblogs.com/jiangxu1989/p/6491483.html https://www.cnblogs.com/neughj/p/5145630.html ...

  7. Spark2.X环境准备、编译部署及运行

    下载地址 :https://www.apache.org/dyn/closer.lua/spark/spark-2.2.0/spark-2.2.0.tgz 我们把spark放在节点2上 解压 下面我们 ...

  8. inno setup 软件打包

    2017-05-26 软件开发完毕以后,要进行打包发布,有几款打包用的软件很常见:innosetup,nullsoft,installshield.本人今天终于把自己独立开发的呈现软件打了包.第一个版 ...

  9. Linux终端小技巧

    注释:以下都是自己遇到的问题,问题太多也记不住,每次上网查找又比较麻烦,索性记录一下随笔! 1.进程的挂载与运行 暂停运行一个进程:Ctrl+Z   其中这个进程可再被操作,如:后台运行.再次运行等 ...

  10. android 开发 实现一个app的引导页面,使用ViewPager组件(此引导的最后一页的Button会直接写在最后一页布局里,跟随布局滑进滑出)

    基本ViewPager组件使用方式与我之前写的https://blog.csdn.net/qq_37217804/article/details/80332634 这篇博客一致. 下面我们将重点详细解 ...