c++ 基础(const)

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))