• BOOL类型和引用,三目运算符


    c++中的引用

    变量名的回顾:

    变量实际是一片连续存储空间的别名,而引用呢?引用可以看做已经定义变量的别名;

    引用的语法type & name = var;

    int a = 4;

    int &b = a;  //b为a的别名,

    b = 5;    //操作b就是操作a

    注意:普通引用在定义时必须用同类型变量进行初始化

    如果初始化的时候,不是同类型,则会报警告,不是变量也会报错误;不初01始化也会报错误;

    实例程序1:

     #include<stdio.h>

    int main(void)

    {

      int a = 3;

      int &b = a;

      b = 5;

      printf("%d , a");  // 5

      printf("%d ", b);  //5

      printf("%p ", &a); //

      pintf("%p ", &b);

      return 0;

    }

    三目运算符

     C++对于三目运算做了升级,如果表达式都是变量,则返回引用;引用可以做左值;如果表达式有常量,则返回常量;

    引用的本质:

        引用是变量的别名,实质上是一个常量指针(在编译器内部是这样实现的);

       形式:Type & name; -> Type* const name;

      因为它的实质是指针,所以引用占的内存空间是4个字节(32位系统);引用作为变量的别名,在很多时候可以代替指针,所以提高了安全性,但是要注意:

    一: 函数返回局部引用,这是无效的;因为引用本质为指针,返回局部引用,函数调用结束后,栈是自动销毁的;所以返回无效;
    实例代码:

    #include<stdio.h> 
    int& demo()
    {
        int d = 0;
        printf("demo: d = %d
    ", d);
        return d; //return &d;
    }
    int& fun()
    {
        static int s = 0;
        printf("fun: s = %d
    ", s);
        return s;//return &s;
    }
    
    int main(int argc, char **argv)
    {
     int& rd = demo();//随机值
     int& rs = fun(); printf("
    "); 
    printf(
    "main: rd = %d ", rd); //随机值
    printf(
    "main: rs = %d ", rs);
    printf(
    " ");

    rd
    = 10;
    rs
    = 11;
    demo();
    fun();

    printf(
    " ");
    printf(
    "main: rd = %d ", rd);//随机值
    printf("main: rs = %d ", rs);
    printf(" ");
    return 0; 
    }


    二:特殊的引用:  引用可以用变量进行初始化;有一种引用可以用常量进行初始化,const引用,这就是一种特殊引用;当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名;

     1 #include<stdio.h>
     2 
     3 int Example(void)
     4 {
     5     printf("Example
    ");
     6     int a = 4;
     7     const int& b = a;
     8     int *p = (int*)&b;
     9 //    b = 5;  //error; readonly variable;
    10     *p = 5;
    11     printf("a = %d, b = %d
    ", a, b);
    12 
    13 }
    14 
    15 int Demo(void)
    16 {
    17     printf("Demo
    ");
    18     int a = 4;
    19     const int& b = 3;
    20     printf("1:a = %d, b = %d
    ", a, b);
    21     int *p = (int*)&b;
    22 //    b = 5;
    23     *p = 5;
    24     printf("2:a = %d, b = %d
    ", a, b);
    25 
    26 }
    27 int Exp(void)
    28 {
    29     bool ret = true;
    30     struct TRef
    31     {
    32         char& a;
    33     };
    34     char m = 5;
    35     char&ma = m;
    36     TRef ref = {ma};
    37 
    38     printf("sizeof(TRef) = %d
    ",sizeof(TRef));
    39     printf("sizeof(ma) = %d
    ",sizeof(ma));
    40 
    41     printf("sizeof(char&) = %d
    ",sizeof(char&));
    42     printf("sizeof(ref.a) = %d
    ",sizeof(ref.a));
    43     return ret; 
    44 }
    45 int main(int argc, char **argv)
    46 {
    47     Example();
    48     Demo();
    49     Exp();
    50     return 0;
    51 }
    52 
    53 #if 0
    54 
    55 Type& name; -> Type* const name;
    56 
    57 ______________________________________________________
    58 | void f(int &a)       |        void f(int* const a) |
    59 | {                    |       {                     |
    60 |     a = 5;           |         *a = 5;             |
    61 | }                    |       }                     |
    62 |______________________|_____________________________|
    63 
    64 #endif
  • 相关阅读:
    Java——class对象
    Java——HashSet和TreeSet的区别
    Java——普通数据类型转化为String
    Java——Iterator迭代器
    Java——ArrayList和LinkedList的区别(转)
    Java——警告消除
    Object类——toString
    Java——动态调用类中方法
    SharePoint使用jsom查询当前用户信息
    SharePoint列表模板(.stp)
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5995039.html
Copyright © 2020-2023  润新知