[C++] Const详解

/****************************************************************
初级理解:
    1.const是定义常量 ==》const意味着只读
    2.以下const的变量必须初始化! 
***************************************************************/    
/*----------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
    原因分析:
        const在C语言中是以分配内存的形式出现的!这样的话,就容易让指针有机可乘
        C语言中const变量是只读变量,有自己的存储空间

        const在C++中并不分配内存,而是放在了一个符号表里,表目是:key value    
            ->编译过程中若发现使用常量则直接以符号表中的值替换

            ->编译过程中若发现对const使用了 extern 或者 &操作符,
                    则给对应的常量(如下面的符号表里a对应的常量10)分配内存空间(兼容C),然后将指针变量p指向这个内存空间


        C++中的const常量
            A.可能不分配存储空间  
                ...
            B.也可能分配存储空间
                1).当const常量为全局,并且需要在其它文件中使用
                2).当使用&操作符取const常量的地址
        Const和define的区别
                C.1  const常量是由编译器处理的,提供类型检查和作用域检查 
                C.2  宏定义由预处理器处理,单纯的文本替换
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/

#include <iostream> 
#include <cstdio>
#include <cstdlib>

extern const int test = 11;//test如果要在别的文件共用,则不管是声明 还是 定义 都必须添加 extern 

struct Teacher{
    char name[64];
    int age;
}; 

int main(void) {
//    const int a; //等价于 int const a;    代表一个常整形数a
//    
//    const int * c;//c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//    
//    int * const d;// d是常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//    
//    const int * const e;//e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)    

    const int a = 10;

    int *p = (int*)&a;//必须人为的将const int* 转化为 int*  
    //将符号表里a对应的10取出来建立一个独立的内存空间,并将p指向这个内存空间
    printf("original a = %d\r\n", a);
    *p = 11;
    printf("modify   a = %d\r\n",  a);
//实际打印的是符号表里的a
    printf("modify  *p = %d\r\n", *p);
    printf("同样的代码如果放在C编译器里,则为 10 11 和 11 .\r\n");            

    return 0;
}    


/*————————————————————————————————————————————————
                Const的两个应用
————————————————————————————————————————————————*/     

/*指针变量名->成员名   ==    (*指针变量名).成员名 */
int fun(const Teacher *p) {
//Const修改形参的时候,在利用形参不能修改指针所向的内存空间,减少bug    
//    p->age = 10;//【err】
//    p = NULL;//【ok】 
}


int func(Teacher * const p) {
//    Const修改形参的时候,在利用形参不能修改指针本身,但可以修改所指向的内存    
//    p->age = 10;//【ok】
//    p = 0; //【err】
}

原文链接: https://www.cnblogs.com/-Mr-y/p/7789204.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/262642

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午3:18
下一篇 2023年2月14日 下午3:18

相关推荐