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

  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 不能

[cpp] view plain copy

  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 只是拷贝

[cpp] view plain copy

  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. }

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

[cpp] view plain copy

  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的构造函数的参数传递为传值方式,所以,当调用时,相当于有一个

[cpp] view plain copy

  1. int b = 60

存在,而 i2(b) 相当于将

[cpp] view plain copy

  1. int &i2 = b;

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

[cpp] view plain copy

  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. }
时间: 2024-10-10 11:09:48

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

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型

import java.util.Stack; /**  * 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * @author user  *  *思路:队列是先入先出,栈是先入后出,可以将数据压入第一个栈后,在弹出来压入第二个栈,弹得时候直接从第二个栈弹出,弹出后又将  *第二个栈中的所有数据弹出重新压入的一个栈  */ public class Solution {     Stack<Integer> stack1 = new Stack<

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

1.C#中int和byte[]转换: /// <summary> /// 把int32类型的数据转存到4个字节的byte数组中 /// </summary> /// <param name="m">int32类型的数据 /// <param name="arry">4个字节大小的byte数组 public static bool ConvertIntToByteArray(Int32 m, ref byte[] arr

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

原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. 第一种方法: public static byte[] int2byte(int

java中字符串String 转 int(转)

java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=

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

在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法:分别为(int).int.Parse().int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?相信很多童鞋也不能完全说清楚. 下面从被转换对象说起,在我们实际开发项目的过程中,我们碰到需要被转换的类型大概有3大类,分别是空值(NULL).数字类型(包含float,double,int,long等)和字符串(

C++读写TXT文件中的string或者int型数据以及string流的用法

对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstream提供了三个类,用来实现c++对文件的操作.(文件的创建.读.写). ifstream -- 从已有的文件读入 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in             只读 ios::out            只写 io

求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { public static void main(String[] args) { /** * 2.求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123, * 相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0. * 方法是先将整型数字转换到数组中,再判断.

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

int类型比较特殊,具体的字节数同机器字长和编译器有关.如果要保证移植性,尽量用__int16 __int32 __int64吧 __int16.__int32这种数据类型在所有平台下都分配相同的字节.所以在移植上不存在问题. 所谓的不可移植是指:在一个平台上编写的代码无法拿到另一个平台上运行时,不能达到期望的运行结果. 例如:在32为平台上(所谓32位平台是指通用寄存器的数据宽度是32)编写代码,int 类型分配4个字节,而在16位平台是则分配2个字节,那么在16位上编译出来的exe, 其中是

c#中的类型转换,int.parse(&quot;ab&quot;)为什么会出错

一.问题 在一个简单的闰年问题的判断中,输入框获取的字符串,我们希望输入数字字符串,将字符串转换为int整数进行判断.编写程序如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks

C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 &lt;转&gt;

作者:Statmoon 出处:http://leolis.cnblogs.com/ 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法:分别为(int).int.Parse().int.TryParse()和Convert.ToInt32(),那么这四种方法对被转换对象有什么限制,以及各自之间有什么区别呢?相信很多童鞋也不能完全说清楚. 下面从被转换对象说起,在我们实际开发项目的过程中,我们碰到需要被转换的类型大概有3大类,分别是空值