• C/C++ const限定符与引用和指针


    一、const 限定符: 通常用来定义一个不能被随便改变的值,用来保护变量

             格式: const 类型 变量名 = value;因为const 限定的变量不能被随便改变,所以在定义的时候必须要初始化。同时,试图对已经定义好的变量进行赋值或者其他改变变量value的操作

                 都将引发错误。但是可以间接改变,

              例如:int i=10;  const int &ci= i ;   i=100; 这里最后ci 的值被改变为100;这是引用‘&’的作用,接下来会讲到。

                  或者:  const int num = 10;
                           int* p =(int *)#
                            *p = 100;
                            cout << p << " " << &num << endl;

                                                               p保存的地址和num的地址一样,但是*p可以被赋值,这里num的值就被隐式修改了。

    二、初始化和const: ci是一个整型常量,但是本质上还是一个整型数,所以可以用ci来赋值或者初始化其他的变量。拷贝的值是不会对ci有任何影响。

    三、  默认状态下,const对象仅在文件内有效: 当你定义了一个const 变量 const int buffsize=512;编译器会将代码中所有用到buffsize的地方用512代替,但是这种替代只在文件内有效,

      也就是如果你定义了多个文件file1.cpp ,file2.cpp 等等,并且在file1.cpp文件里定义了buffsize,你就只能在file2.cpp文件里使用buffsize的值,如果你想在file2.cpp文件里使用,你得自己定义一个新的buffsize

      这就相当于在每个文件中buffsize都相当于一个独立的变量。

        但是有时候我们不想编译器为每一个文件分别生成独立的变量,我们想只在一个文件中定义,在其他文件中声明并使用他,就需要extern进行限定。extern表示该变量只定义一次。

      例如在file1中定义 extern const int buffsize=512;在file2.cpp中声明extern const int buffsize;这里的buffsize就是file1中的变量。也就是可以只声明一次,但是value可以在多个文件内共享。

    四、const的引用:

      定义引用相当于给变量起一个别名,例如int &ci=i;区别于指针,这里的ci与i共用一个内存单元,指针是各有一个内存单元,在32位机上指针大小是4

    字节,64位机上是8字节。并且引用定义是必须初始化,并且不能改变绑定其他的内存空间。

    在引用前面加上const 限定符。 int i = 0;const int& ci= i;这里将ci绑定到i上。

      int i=42;

    const int &r1=i;

    const int& r2=r1;

    cosnt int & r3=r1*2;

    int &r4=r1*2;

    这里只有第五行是错误的,因为常量引用可以被非常量的值或者常量值或者常量引用来初始化,但是非常量的引用不能被常量引用初始化。

    五、指针与const

    分为两种一种是指向常量的指针,一种是常量指针。

    格式 : const int *ci =&value; int *const pi=&value;

    这里要区分其实很简单,关键是变量名之前的限定符是‘ * ’,还是const。

    如果是‘ * ’,表明本质还是指针,只不过指向的内容是常量,但是也没有规定必须指向常量这点和常量引用相同,不过有一点就是不能通过指针来改变指向对象的值,但是给以改变指针指向的对象,所以本质还是一个指针。

    相反,变量前是const,那么这个指针就不能改变他所指向的对象,只能改变指向对象的值。即不变的是指针本身(地址不变),可以变的是指针指向的内容。

     

      

  • 相关阅读:
    csrf攻击实例
    《四 数据库连接池源码》手写数据库连接池
    《四 spring源码》手写springmvc
    spring和springmvc是单例还是多例
    redis集群设置密码
    mongodb3.6集群搭建:分片集群认证
    mongodb3.6集群搭建:分片+副本集
    Mongo 3.6.1版本Sharding集群配置
    windows计划任务
    Redis slowlog慢查询
  • 原文地址:https://www.cnblogs.com/zongji/p/12603754.html
Copyright © 2020-2023  润新知