【C++】const详解

07-06 1170阅读

📢博客主页:https://blog.csdn.net/2301_779549673

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文作为 JohnKi ,引用了部分大佬的案例

📢未来很长,值得我们全力奔赴更美好的生活✨

【C++】const详解

【C++】const详解

文章目录

  • 📢前言
  • 🏳️‍🌈const 的修饰范畴
    • ❤️1. 修饰一般常量和数组
    • 🧡2. 修饰指针
    • 💛3.修饰函数参数
    • 💚4. 修饰函数返回值
    • 💙5. 修饰成员函数
    • 🏳️‍🌈使用const的好处
    • 🏳️‍🌈const在C和C++中的区别

      📢前言

      • C++ 中的 const 关键字的用法非常灵活,而使用 const 将大大改善程序的健壮性
      • const 是 C++ 中常见的类型修饰符,常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的
      • const 名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

        🏳️‍🌈const 的修饰范畴

        ❤️1. 修饰一般常量和数组

        int const a = 100;
        const int a = 100; //与上面等价
        int const arr [3] = {1,2,3};
        const int arr [3] = {1,2,3};//与上面等价
        

        🧡2. 修饰指针

        char *p = "hello";     // 非const指针,非const数据
        const char *p = "hello";  // 非const指针,const数据
        char * const p = "hello";   // const指针,非const数据
        const char * const p = "hello";  // const指针,const数据
        
        • 如果const位于星号*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

        • 如果const位于星号*的右侧,const就是修饰指针本身,即指针本身是常量。

          💛3.修饰函数参数

          const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型检查,并且在字符替换时可能产生意料不到的错误

          void f(const int i){……}
          //对传入的参数进行类型检查,不匹配进行提示
          

          如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。

          💚4. 修饰函数返回值

          const 修饰函数返回值其实用的并不多,它的含义和 const 修饰普通变量以及指针的含义基本相同

          1. const int func1();  //这个其实没多大意义,因为参数返回就是赋值
          2. const int* func2(); //调用时:const int* p = func2(); 可以把 func2() 当作一个变量,即指针内容不可变
          3. int* const func3(); //调用时:int* const p = func3(); 以把 func2() 当作一个变量,即指针本身不可变
          
          • 一般情况下,函数的返回值为某个对象时,如果将其声明为 const 时,多用于操作符的重载。通常,不建议用 const 修饰函数的返回值类型为某个对象或者某个对象的引用的情况。
          • 原因如下: 如果返回值为某个对象为 const(比如:const A test = A; )或某个对象的引用为 const(const A& test = A;),则返回值具有 const 属性,则返回实例只能访问类 A 中的公有或保护数据成员和 const 成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

            💙5. 修饰成员函数

            const 修饰类的成员函数,则该成员函数不能修改类中任何非 const 成员函数,一般写在函数的最后来修饰

            class A{
            	void func() const{} 
            	//常成员函数,它不能改变对象的成员变量,也不能调用类中任何非 const 成员函数
            };
            

            规则如下

            1. const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。
            2. 如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。
            3. const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
            4. 非const成员函数,可以访问任何成员,包括const成员成员函数。
            5. onst成员函数不能修改任何的成员变量,除非变量用mutable修饰。

            🏳️‍🌈使用const的好处

            可以定义const常量

            这样可以避免由于无意间修改数据而导致的编程错误,提供了一个保护作用。

            便于进行类型检查

            const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

            为函数重载提供了一个参考

            const修饰的函数可以看作是对同名函数的重载。

            可以节省空间,避免不必要的内存分配

            const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象宏一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而宏定义的常量在内存中有若干个拷贝。

            提高了效率

            编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期的常量,没有了存储与读内存的操作,使得它的效率也很高。

            🏳️‍🌈const在C和C++中的区别

            1. 在C语言中,用const修饰的变量,其本质上还是个变量,只是它不允许作为左值存在,也就是不法对该变量进行直接赋值修改该变量,但是这不意味着该变量的值就无法修改。

            2. 在C++中 ,在编译的时候,当碰到用const修饰的变量时,编译器是直接将变量的值和变量的符号对应起来一起存到符号表。

            3. 例如const int a = 5;在符号表中就会将a和5对应起来,在编译的过程中,当碰到printf(“a = %d\n”,a); 时,用 5 直接将 a 替换掉。在C++中,编译器不会为a分配存储空间,在C语言中就会为a分配存储空间,所以在C编译器中,就可以通过指针来改变用const修饰的变量。

            4. 其实在C++中,const修饰的变量,在编译的时候如果前面有extern和取地址符 & 时,会为变量分配存储空间是为了兼容C语言,但是在C++中,用const修饰的变量就真的无法修改它的值,可以说是常量。但是在C语言中,const修饰的变量本质上还是变量而不是常量。这在C语言中其实也是矛盾的,因为我们想要用const定义一个常量,但又可以通过指针来改变该常量的值。而C++为了兼容C语言,所以保留了这个特性,但是却无法修改它的值,这就是const在C语言和C++中的区别。


            本篇博文对 const 做了一个较为详细的介绍,不知道对你有没有帮助呢

            觉得博主写得还不错的三连支持下吧!会继续努力的~

            【C++】const详解

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]