在 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
了。
网友评论