• C++程序中的引用_3


    一。C++中的布尔类型

      1.C++在C语言的基本类型之上增加了bool

      2.C++中的bool可取的值只有true 和false

      3.理论上bool只占有一个字节

        如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。

      Tip:

        true代表真值,编译器内部用1表示(兼容C语言)。

        false代表非真值,编译器内部用0来表示。

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        int a;
        bool b = true;
        
        printf("b = %d, sizeof(b) = %d
    ", b, sizeof(b));
        
        b = 3;
        a = b;
        
        printf("a = %d, b = %d
    ", a, b);
        
        b = -5;
        a = b;
        
        printf("a = %d, b = %d
    ", a, b);
        
        a = 10;
        b = a;
        
        printf("a = %d, b = %d
    ", a, b);
        
        b = 0;
        
        printf("b = %d
    ", b);
        
        printf("Press enter to continue ...");
        getchar();    
        return 0;
    }

    输出结果

      

     所有的C++编译器在赋值时候将非0值转化成True,0值转化成false。

    二. 三目运算符的升级

      1. C语言中的三目运算符返回的是变量值,不能作为左值出现。

      2. C++中的三目运算符可以直接返回变量本身,因此可以出现在程序的任何地方

      3.变量名回顾

        #变量是一段实际连续储存空间的别名。

        #程序中通过变量来申请并命名存储空间

        #通过变量的名字可以使用存储空间

    三。C++的引用

      在C++中新增了引用的概念

        1.引用可以看做一个已定义变量的别名。

        2.引用的语法:Type& name = var;

        int main()

        {

          int a = 4;

          int& b = a;

          b = 5;

          printf("%d ",a);

          printf("%d ",b);

          printf("%08X ",&a);

          printf("%08x ",&b);

          return 0;

        }

      输出:a = 5; b = 5

      注:引用作为普通参数的声明时需要初始化。

    四。引用的意义

      1.引用作为其他变量的别名而存在的,因此在一些场合可以代替指针

      2.引用相对于指针来说具有更好的可读性和实用性。

      

      注:引用作为函数参数的声明时不初始化。

    五、const 引用

      1. 在C++中可以声明const引用。

      2. const引用表示 const int& b = a;

      3. const 引用让变量编程只读变量。

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        int a = 4;
        const int& b = a;
        int* p = (int*)&b;
        
        //b = 5;
        
        *p = 5;
        
        printf("a = %d
    ", a);
        printf("b = %d
    ", b);
        
        printf("Press enter to continue ...");
        getchar();    
        return 0;
    }

      4.当使用常量对const引用进行初始化(可以为常数)时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名。

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        const int& b = 1;
        int* p = (int*)&b;
     
        *p = 5;
        
        printf("b = %d
    ", b);
        return 0;
    }

      注意:使用常量对const引用初始化后将生成一个只读变量。

      5.引用有自己的存储空间吗?

      引用在C++中的内部实现是一个常指针

      Type& name <->Type *const name

      importance:

      # C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

      #从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间,这是C++为了实用性而做出的细节隐藏。

               <=>   

    六。函数的返回值为引用时

      1.当返回栈变量(局部变量)

        # 不能成为其他引用的初始值

       

    #include <stdio.h>
    
    int& f()
    {
        static int a = 0;
        
        return a;
    }
    
    int& g()
    {
        int a = 0;
        
        return a;
    }
    
    int main()
    {
        int a = g();
        int &b = g();
        
        f() = 10;
        
        printf("a = %d
    ", a);
        printf("b = %d
    ", b);
        printf("f() = %d
    ", f());
        
        printf("Press enter to continue ...");
        getchar();    
        return 0;
    }

    输出结果:a = 0;b = 随机值 ,f() = 10;

    #不能作为左值使用

      2.当返回静态变量或者全局变量

        #可以成为其他引用的初始值

        #既可以为右值,又可以作为左值。

    #include <stdio.h>
    
    int& f()
    {
        static int a = 0;
        
        return a;
    }
    
    int& g()
    {
        int a = 0;
        
        return a;
    }
    
    int main()
    {
        int a = g();
        int &b = g();
        
        f() = 10;
        
        printf("a = %d
    ", a);
        printf("b = %d
    ", b);
        printf("f() = %d
    ", f());
        
        printf("Press enter to continue ...");
        getchar();    
        return 0;
    }

    输出结果:a = 0; b = 随机值;f() = 10;

    七。小结:

      1. bool类型是C++新增加的基础类型。

      2. C++中的引用可以看作变量的别名来使用。

      3.C++中的常引用可以使得一个变量拥有只读属性

      4.C++中的常引用可以用常量初始化而得到一个只读变量

      5.C++中引用的本质是一个指针常量。

      

  • 相关阅读:
    SVN服务器搭建(一)
    排序算法二:冒泡排序
    【LeetCode】136. Single Number
    【LeetCode】217. Contains Duplicate
    【LeetCode】189. Rotate Array
    【LeetCode】122. Best Time to Buy and Sell Stock II
    【LeetCode】26. Remove Duplicates from Sorted Array
    【LeetCode】20. Valid Parentheses
    【LeetCode】680. Valid Palindrome II
    【LeetCode】345. Reverse Vowels of a String
  • 原文地址:https://www.cnblogs.com/lvxiaoning/p/7481857.html
Copyright © 2020-2023  润新知