const是一个修饰符,修饰变量,被他修饰的变量只可读取,不能修改。
一.const与define的区别
在c中,我们经常使用define来定义一个常量,但在c++中我们通常使用const,且这种较稳定。
1.const变量有数据类型,而define无数据类型,这样就会导致在C++中使用重载函数时产生一些歧义。
2.const变量具有作用域,而define无作用域,从开始定义到此文件结束都是有效的
二.C和C++中const的区别
首先谈谈在两种语言下他的区别。
三.具体谈谈在C++中const的用法
1.const初始化值为常量
![](https://img-blog.csdnimg.cn/direct/ab8d91e68cca43b5bb354ec461f952a3.png)
![](https://img-blog.csdnimg.cn/direct/1b1667ac8f3a4dbea471d35eb31393ee.png)
![](https://img-blog.csdnimg.cn/direct/8ac8d47e1ee94febbe61c5b6796edc09.png)
![](https://img-blog.csdnimg.cn/direct/38d1ced5093e41fa85cdfd9d3e993f43.png)
为什么输出结果*p变了而constA没变就是因为*p=20;只是代表将p指向的这片内存空间的值替换成了20,但是我们constA的值仍然是从符号表中取得的。
2.const变量初始化为一个变量
这种情况下就不存在符号表这种说法了,在第五行代码执行时,编译器直接就为我们的constA分配了内存空间,那既然此时不存在符号表这种稳定的事情,那么这时候的输出结果是什么呢
此时,在经历*p=20;后两者的值都被更改了,因为p所指向的那片内存空间的值被更改了,此时的constA的值仅仅来源于那片内存空间。这也是我们说的通过指针间接修改const的值。
3.常引用
const 类型& 引用名
4.const与指针一起使用时的用法
4.1指向常量的指针
const char *name="chen";
此时指针是一个变量,它可以指向任意的地方,但一旦他指向一个地方,那么这个地方的值是不可以修改的
name可以最开始指向chen,也可以指向liu但他指向chen的时候,不可以将chen中的n改为y
4.2常指针
char*const name、="chen";
此时指针指向的地址不可以更改,但是这片地址里面的值是可以更改的
此时,name首次指向chen,那么就不能再指向liu,但是它可以将chen中的n改为y。
这里就不得不提到上次说的引用了,其实引用和他的效果一致,但是引用是不再分配内存空间的,他与他的本体(int&j=i;)也就是j和i共用一片内存空间,这样来说肯定是效率更高的啦
4.3.指向常量的常指针
const char*const name="chen";
这个就属于前两种的结合,既指向的地址不能更改且地址中的值也不可以更改
5.关于类中的一些const
5.1常对象
用const修饰说明的对象为常对象
格式: 类名 const 对象名[(参数表)]; 或 const 类名 对象名[(参数表)];
#include <iostream>
using namespace std;
class A
{
public:
int x;
mutable int y;
A() {
x = 100;
y = 0;
}
A(int _x,int _y) {
x = _x;
y = _y;
}
void setXY(int x, int y) const
{
// this->x = x; // error
this->y = y;
}
void show()const
{
cout << x << "," << y << endl;
}
void hello() {
cout << "hello" << endl;
}
};
int main(int argc, char const* argv[])
{
A a1;
a1.setXY(1, 2); // const函数,内部不修改非mutable的成员变量
a1.show();
//const A a2; //报错 error ,const 变量必须存在初始值(右值)
const A a2 = A();
a2.y = 10;//此时a2中y的值变成10
a2.setXY(0, 30); //此时a2中y的值变成30,x的值未发生变化
a2.show(); // const对象可以访问const的成员函数
//a2.hello;// const对象不能访问非const成员函数
return 0;
}
注释:(通过上述代码可以总结出)
1.在定义对象时必须进行初始化,即const 变量必须存在初始值(右值)
2.常对象只能调用它的常成员函数,而不能调用普通的成员函数。
3.可以看到a2是一个常对象,他是不可以更改他的数据成员的(间接直接都不可以),但可以修改mutable修饰的成员变量(即y这个变量)。