zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Dynamics AX 2012 R2 配置E-Mail模板
    Dynamics AX 2012 R2 设置E-Mail
    Dynamics AX 2012 R2 为运行失败的批处理任务设置预警
    Dynamics AX 2012 R2 耗尽用户
    Dynamics AX 2012 R2 创建一个专用的批处理服务器
    Dynamics AX 2012 R2 创建一个带有负载均衡的服务器集群
    Dynamics AX 2012 R2 安装额外的AOS
    Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录
    Dynamics AX 2012 R2 从代码中调用SSRS Report
    Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5995039.html
Copyright © 2011-2022 走看看