• 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. }  
     
     
  • 相关阅读:
    Android 中adb 命令(实用)
    Mac安装Scala
    使用阿里云镜像maven管理配置开发环境
    Nginx学习笔记3--Nginx和PHP(fastCGI)的配置和优化
    《实战Nginx》读书笔记--Nginx配置文件
    《实战Nginx》读书笔记
    PHP解码unicode编码中文字符代码
    yii学习笔记--使用gii快速创建控制器和模型
    yii学习笔记--配置文件的配置
    yii学习笔记--快速创建一个项目
  • 原文地址:https://www.cnblogs.com/aabbcc/p/6013687.html
Copyright © 2020-2023  润新知