C++基础 —const关键字

const 关键字的用法。const 修饰的是指针本身,还是指针变量。?

 

#include <stdio.h>

int main(void)
{
    const int a = 2;
    int const b = 1; //一样
    int f = 3;
    const int *c; //const修饰的是指针所指向的内存空间,不能被修改
    int * const d = &f; //const 修饰的指针变量本身
    const int * const e = &a; //指针所指向的内存空间和指针本身都不能被修改
    
    return 0;
}

 

合理的利用const,

//指针做函数参数,可以有效地提高代码可读性,减少bug;

//清楚的分清参数的输入和输出特性。

下列代码演示了const修饰的到底是指针本身还是指针变量。

#include <iostream>
using namespace std;

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

//指针所指向的内存空间,不能被修改
int operatorTeacher01( const Teacher * pT )
{
    //pT->age = 10;
    return 0;
}

//指针变量本身不能被修改
int operatorTeacher02( Teacher * const pT )
{
    pT->age = 10;
    //pT = NULL;

    return 0;
}
//指针变量本身和所指向的内存空间都不能被修改
int operatorTeacher03( const Teacher * const pT )
{
    //pT->age = 10;
    //pT = NULL;
    printf("age: %d", pT->age);

    return 0;
}
void main(void)
{
    //const int a = 1;
    //int const b = 3; //一样的

    //const int *c; //const修饰的是指针所指向的内存空间,不能被修改
    //int * const d  ; //const 修饰的是指针变量,不能修改
    //const int * const e; //const 修饰的是指针所指向的内存空间和指针变量,都不能修改
    cout <<"hello.."<<endl;

    Teacher t1;
    t1.age = 33;

    operatorTeacher03(&t1);
    system("pause");
}

 C中的const关键字和C++中的const关键字:

C语言中的const是一个冒牌货:

C++语言中的const是一个真正的常量:

以下代码在C中运行的结果和C++中的运行结果不同,为什么?

下图为C中的运行结果:

下图为C++中的运行结果:

C++编译器对const进行了功能的加强,C++编译器看到常量,会把他放在符号表中,

当使用时直接在符号表中取值使用;

当对a变量取地址的时候,C++编译器会对a单独的开辟内存空间,

通过*p间接修改的地址不再是原来的地址,而是新开辟的内存空间,故修改的值和原来的值不相关。

新内存中的值如下:

结论:

C语言中的const常量

  C语言中的const变量是只读变量,有自己的存储空间

C++中的const常量

  可能分配存储空间,也可能不分配存储空间

  当const常量为全局,并且需要在其它文件中使用时分配内存空间;

  当使用&操作符取const常量的地址时分配内存空间。

 

 

#define和const的区别

const定义的变量,是由编译器处理的。提供类型检查和作用域检查

#include <iostream>
#include <stdio.h>

void fun1()
{
    #define a 10             //a具有全局作用域
    const int b = 20;        //b具有局部作用域
    //#undef a              //取消a的全局作用域
    //#undef                //当只有一个a时,可以直接写#undef    
}

void fun2()
{
    printf("a = %d\n", a);
    //printf("b = %d\n", b);   //b没有全局作用域
}

int main(void)
{
    fun1();
    fun2();
    return 0;
}

 

posted @ 2017-10-18 21:36  Liu_Jing  Views(129)  Comments(0Edit  收藏  举报