天天看点

概述C语言和C++中const的区别

1、C语言

a、c语言的const修饰全局变量时,默认是外部链接,也就是说,其他的源文件可直接使用该变量

const int a =10;
//a的本质是变量, 只不过是个只读变量
//只读的全局变量,内存放在文字常量区(内存空间只读)
           

b、const修饰局部变量时,内存放在栈区(内存空间可读可写),所以可以通过对内存空间地址操作,来修改对应的内容

void test03()

{
    //C语言中const 修饰变量名 说明变量名为只读(用户不能通过变量名data进行赋值)

    const int data = 100;//局部只读变量 内存在栈区(内存可读可写)

    //data = 200;//err


    printf("data = %d\n",data);

    //但是:如果知道data的地址 可以通过地址间接的修改data所对应空间的内容

    int *p = (int *)&data;

    *p = 2000;

    printf("data = %d\n",data);//ok 200

}
           

总结:

1、const修饰全局变量num 变量名只读 内存空间在文字常量区(只读)、不能通过num的地址 修改空间内容

2、const修饰局部变量data 变量名只读 内存空间栈区(可读可写),可以通过data地址 间接的修改空间内容

2、c++中的const深入理解

概述C语言和C++中const的区别

符号表:可以看做是宏,不占内存

fun.cpp

//const修饰的全局变量 默认是内部链接(只在当前源文件有效 不能直接用于其他源文件)

//const int num = 100;//err

//如果必须用在其他源文件 使用只读的全局变量 必须加extern将num转换成外部链接

extern const int num = 100;//ok
           

main.cpp

//声明

extern const int num;

struct Person

{

    int num;

    char name[32];

};

void test04()

{

    cout<<"全局num = "<<num<<endl;


    //1、c++中 对于基础类型 系统不会给data开辟空间 data放到符号表中

    const int data = 10;

    //data = 100;//err 只读

    cout<<"data = "<<data<<endl;

    //2、c++中当 对data 取地址的时候 系统就会给data开辟空间

    int *p = (int *)&data;

    *p = 2000;

    cout<<"*p = "<<*p<<endl;//空间内容修改成功 2000


    cout<<"data = "<<data<<endl;//data 还是10为啥?data存在符号表中,不可修改,就像宏一样,只读


    //2、当以变量的形式 初始化 const修饰的变量 系统会为其开辟空间

    int b = 200;

    const int a= b;//系统直接为a开辟空间 而不会把a放入符号表中

    p = (int *)&a;

    *p = 3000;

    cout<<"*p = "<<*p <<endl;//3000

    cout<<"a = "<<a <<endl;//300


    //3、const 自定义数据类型(结构体、对象) 系统会分配空间

    const Person per = {100,"lucy"};

    //per.num = 1000;//err

    cout<<"num = "<<per.num<<", name = "<<per.name<<endl;//100 lucy

    Person *p1 = (Person *)&per;

    p1->num = 2000;

    cout<<"num = "<<per.num<<", name = "<<per.name<<endl;//2000 lucy
           

总结:c++总结

1、const int data = 10;//data先放入符号表

2、如果对data取地址 系统才会给data开辟空间

3、const int a = b;//b是变量名 系统直接给a开辟空间 而不放入符号表

4、cosnt 修饰自定义数据 系统为自定义数据开辟空间

附加:

尽量const替换#define

1、宏没有类型 const有

#define MAX 1024

const short my_max =1024;

void func(short i)

{

    cout<<"short函数"<<endl;

}

void func(int i)

{

    cout<<"int函数"<<endl;

}

void test05()

{

    func(MAX);//int 函数


    func(my_max);//short函数

}
           

2、宏的作用域是整个文件 const的作用域 以定义情况决定

void my_func(void)

{

    //作用范围 是当前复合语句

    const int my_num = 10;


    //作用范围 当前位置 到文件结束

    #define MY_NUM 10

}

void test06()

{

    //cout<<"my_num = "<<my_num<<endl;//err 不识别

    cout<<"MY_NUM = "<<MY_NUM<<endl;//ok 能识别

}
           

3、宏不能作为命名空间的成员 const可以

namespace A {

    // const可以作为成员

    const int my_a=100;


    //MY_A 属于文件 不属于A

    #define MY_A 200

}

void test07()

{

    cout<<"my_a = "<<A::my_a<<endl;

    //cout<<"MY_A = "<<A::MY_A<<endl;//err

    cout<<"MY_A = "<<MY_A<<endl;

}
           

继续阅读