C++中关于const关键字的使用

const关键字用于表示变量或函数, 亦或其他类型的数据其值或其本身的值禁止被修改.

但需要注意的是, 即使被修饰为const类型的变量, 其本质依旧是个变量, 而不是常量. 
也许你会说, 这有什么区别呢? 我在代码中感觉不出差别啊. 其实它们的差别在于编译器的编译. 对于编译器来说, 变量意味着需要分配内存空间, 而常量只是在编译期间记录在编译器的一张内存表里面的一个证整数而已.  变量的值必须初始化, 除非使用extern修饰它, 这就告诉编译器该变量是一个全局const变量, 在哪里定义编译器暂时不知道, 所以允许它在其他地方定义其值, 一旦定义好后就禁止再次修改了.

比较复杂的情况, const修饰变量意外的情况:
1. char * const x = "diamond";        // x 禁止修改,  但是*(x)可以被修改:     *x = "kongdom"; OK     |      x++; ERROR!!!
2. const char *s = "diamond";         //  *(s) 禁止修改,  也就是该字符串禁止被修改:     *s = "kingdom";  ERROR!!!    |   s++; OK

3. Person P_01;
    const Person *p     =              &P_01;                //  对象是const
    Person const *p     =              &P_01;                //  对象是const           
    Person *const p     =              &P_01;                //  指针是const 
    const Person *const p =        &P_01;               //   对象和指针都是const

那么到底什么情况下建议使用const呢?
1.    修饰函数参数:
                大家都知道在c++的函数传参中, 有值传递, 引用传递和指针传递三种形式. 当使用后两者进行参数传递时, 函数被调用后, 实参的值会被函数内部的操作修改,  那么如果不需要修改呢, 是不是传引用和指针就无法搬到了呢? 答案当然是否定的, 这个时候你只需在函数参数列表中使用const来修饰变量就可以了.例如:
                void func_01(const int *x);        // 这里编译器将禁止修改传进函数中的,  这个指针所指向的内存空间中的值
                int a = 100;
                func(&a);                              //  将a压栈
                const int b = a;                     // 将a的值放入b中       
                
                func(&b);                              // 将b压栈
                b = a++                                // ERROR!  b的值禁止被修改

void func_02(const int i)
                {
                        i++;                               // ERROR! i的值禁止被修改
                }

2.    修饰成员函
        这意味着this是const
                int get_age() const;
                
                int Student::set_age(int age)
                {
                        this.age = age;
                }

int Student::get_age() const
                {
                        this.age++;                        // ERROR!  禁止修改成员变量
                        set_age(16);                     // ERROR! 禁止调用没有cosnt修饰的成员
                        return age;                        // OK
                        
                }

3.     修饰类的对象
              对象里面的值禁止修改

4.    关于函数重载
    设:  某class Student内有如下成员函数:
                void func();
                void func() const;
    且:  在main()函数中有:
                const Student stu;
                stu.func();

则:  以上两个函数构成函数重载, 可以实现静态多态.

也许你会问, 这两个函数应该是被重复定义了啊, 应该是错误的. 它们无法构成函数重载. 但实际上不是这样的.
    这里的两个func()函数, 都属于类的成员函数, 而它们实际上是这样的:
            void func(Student *this);
            void func(const Student *this);
     也就是说, 第二个func()函数的修饰符const, 是用来修饰类的对象本身的, 也就是this
     当const 类型的对象 stu, 调用func()函数时, 就会去调用同样是const类型的那个func() const函数.

时间: 2024-10-03 23:15:58

C++中关于const关键字的使用的相关文章

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个

详解C和C++中的const关键字

在讲下面的内容之前,要先看看这篇文章const.static变量的存储位置 一.C中的const 作用:(1)可以定义const常量,具有不可变性. (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患. (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改. 同宏定义一样,可以做到不变则已,一变都变! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性. 还是上面的例子,如果在函数体内修改了i,编译器就会报错: (5) 可以节省空间,避免不必要的内存

C++ 中的const关键字

为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 常变量:  const Type 变量名 或  Type const 变量名 //两者等同, 如: const int a=5; 与 int const a=5; 等同 常引用:  const Type &引用名 常对象:  Type const 对象名 常成员函数:  类名::fu

c++中的const关键字的理解

看effective c++第二版推荐使用const,少用define.今天才发现发现这远远不够. #define定义的常量在预处理替换,debug的时候无法打印宏的,这种常量设置是有缺陷的, const定义常量作用在编译时期,就是说编译器帮你检查有没有对const做修改,那么怎么实现一个运行时常量,目前c++中还没有提供改语法.所以const只是个协议.库提供者和使用者之间的协议,开发者和编译器的协议.所以有了const_static可以消除const的协议 开发者和编译器的协议: const

C++中的const关键字的用法

1.const用于修饰普通变量,表示常量,不建议修改,某种程度上不允许修改(其实也是可以修改的) 指针常量 :指针(指向的变量的值)自身是一个常量,说明不能改变自身的指向  int* const p=&a;  常量指针 :指向常量的指针,指针可以修改指向 但是不能修改指向的变量的值  const int* p;面试必杀技: const出现在*的左边    是常量指针 const int num = 19; const int * p = &num;//指向常量的指针 常见的面试题中,经常会

C++中const关键字的使用总结

C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数. 变量:const可以修饰普通变量.指针(数组)和结构体. 1.const修饰普通变量是最简单的情形.这样的用法多为在程序中创建一个只读变量,类似于C语言的#define宏定义,但const声明的变量可以指定类型,因此在C++中提倡使用const关键字声明只读变量. const int Month = 12; /* 示例代码 1 */ 示例代码1表示:定义了一个int型变量Month,程序可以使用该变量,但不可对Mont

c++ const关键字

通常,不用const来区别数据的类型,在声明过程中,const关键字起到的是修饰限定的作用. 1 符号常量(通常,在赋初值后,其值不能改变:而常量在定义时必须赋初值) int i; const int k = 3; //标识符k代表的内存单元中存放的int型的数据,关键字const限定,不能通过该标识符k来修改所代表的内存单元中的int值 i和k代表的内存单元存放的都是int型数据,只是const限定的k为常量:符号常量,在声明时必须赋初值,赋初值后其值不能改变 下面尝试通过声明一个指针变量t引

C与C++的const关键字

之所以要谈const,大概就是被const出现的各种位置搞得头晕目眩了罢. (一)C语言中的const关键字 C语言中const修饰的变量或对象的值不能更改. 比如定义const int i = 0;(或int const i = 0;)那么之后任何对i进行改变的操作都会报错. 当然可以投机取巧地去修改const类型的值,比如取得i的指针然后对指针进行操作 const int i = 0; int * p = &i; *p = 3; const也可以修饰指针类型,这就产生了比较麻烦的情况,那就是

const关键字到底该怎么用

前言 我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何使用const关键字?在解答这些问题之前,我们需要先理解const关键字的基本使用.本文说明C中的const关键字,不包括C++. 基本介绍 const是constant的简写,是不变的意思.但并不是说它修饰常量,而是说它限定一个变量为只读. 修饰普通变量 例如: const int NUM = 10; //与int const NUM等价NUM = 9;  //编译错误,不可再次修改 由于使用了co