c++ 基础(const)

作者: zidea | 来源:发表于2019-04-29 15:12 被阅读8次
    Cplusplus-tutorial-in-hindi.jpg

    在 c++ 对应 const 的理解可能也是需要花费一些力气,今天我希望自己解释让大家更清楚地了解 const 以及如何使用 const。
    许多许多语言都有个这个 const关键字,在 es6 中 javascript 用引入了 const表示静态变量,所谓静态是相对动态var来说的,也就是变量一旦赋值就不会改变了,这是多少情侣对爱情的追求,深爱对方一层不变。背后又有多少凄凉的爱情故事。const 是一种不变的承诺。

    int main(int argc, char const *argv[])
    {
       
         const int a = 5;
         a = 2;
        //std::cout << *a << std::endl;
    
        std::cin.get();
    }
    

    这里一定对静态变量 a 赋值我们就无法对其进行再次赋值,这个理解应该没有问题。

    int main(int argc, char const *argv[])
    {
        const int MAX_COURSES = 100;
        
        int *a = new int;
        
        a = (int *)&MAX_COURSES;
        
        std::cout << *a << std::endl;
    
        std::cin.get();
    }
    

    指针变量 a 我们不但可以更改指针 a 的值,也可以修改指针 a 指向内存地址的值。

    我们可以对指针 a 添加 const 修饰符关键字,表示指针 a 的内容是不可变的,并不代表 a 内存地址是不可变了的。

    int main(int argc, char const *argv[])
    {
        const int MAX_COURSES = 100;
    
        const int *a = new int;
    
        a = (int *)&MAX_COURSES;
    
        std::cout << *a << std::endl;
    
        std::cin.get();
    }
    

    int const *a = new int; 和上面效果一样都是无法修改指针 a 指向内容值。而修改int *const a = new int;后,这一次我们可以修改指针 a 指向的地址保存的值,而无法修改 a 指针的值。
    一个小技巧,就是 *const位置来决定静态是指指针不可变还是指指针指向内容不可变。这里大家一定要自己试一试,试了才真正了解和掌握。
    如果既不想让指针改变也不想让指针指向的内容改变

    const int* const a = new int;
    

    const 除了可以修饰变量,还可以修饰函数,不过仅限于class中的方法,放置在方法名后面int GetX() const 表示这个函数无法修改类变量

    class Entity
    {
      private:
        int m_x, m_y;
    
      public:
        int GetX() const
        {
            return m_x;
        }
    };
    

    要在GetX()中修改 m_y 属性编译期间就会报错。

        int GetX() const
        {
            m_y = 2;
            return m_x;
        }
    

    做的更绝对一些,我们将m_x转为指针类型,然后将 GetX 方法返回值定义为const int* const类型。

    class Entity
    {
      private:
        int *m_x, m_y;
    
      public:
        const int *const GetX() const
        {
            return m_x;
        }
    };
    

    这里补充一点知识int *m_x, m_y;这样定义类型后m_x类型为指针类型,而m_y依然是 int 类型,如果想要两个变量都是指针类型需要修改int *m_x, *m_y;

    那么我们为什么需要给 GetX() 函数定义为 const 呢,我们通过给下面代码给大家解释一下其原因。通常以引用形式将 Entity 的实例传入给函数使用而不是 copy ,因为 copy 成本计较高。其实引用就是地址指针的别名,是一个指针的语法糖。根据前面的知识在指针前加 const 表示指针指向的内容是不可变的,在深入一下也就是无法修改传入引用的属性值,所以我们去掉 GetX()的 const 就表示我们可以修改对象,这样在编译期间就会报错。

    class Entity
    {
      private:
        int m_x, m_y;
    
      public:
        int GetX() const
        {
            return m_x;
        }
    };
    
    void PrintEntity(const Entity &e)
    {
        std::cout << e.GetX() << std::endl;
    }
    
    class Entity
    {
      private:
        int m_x, m_y;
        mutable int var;
    
      public:
        int GetX() const
        {
            var = 2;
            return m_x;
        }
    };
    

    如果我们非得要在 const 修饰的函数中修改变量呢?上面代码中你可以找到答案,我们可以在 var 前面加上mutable 修饰,这样我们就可以在 const 中修改变量 var 了。

    相关文章

      网友评论

        本文标题:c++ 基础(const)

        本文链接:https://www.haomeiwen.com/subject/lysynqtx.html