int b=500;
cost int *a=&b; (1)
int const *a=&b; (2)
int* const a=&b; (3)
const int* const a=&n; (4)
- 情况(1)
如果const位于 * 星号号的左边,代表着const是用来修饰指针指向的变量,即指针指向为常量。
如果const位于 * 星号号的右边,代表着const是用来修饰指针本身,即指针为常量。
所以说(1)和(2)的情况是一样的,都是代表着指针指向的内容为常量,不可以修改。这种情况下不允许对内容进行更改操作。
举个栗子:
如果a是一名仓库保管员,他进入的仓库,里面的货物(*a)是他无法移动的,仓库里是什么就是什么,他就是个看仓库的。
int b=500;
const int *a=&b;
*a=600; //错误
他不可以改变货物,但是货物可以改变啊。因此,可以改变货物的值。
int b=500;
const int *a=&b;
b=600;
cout<<*a<<endl; //得到600;
还有一种改变*a的方法是a指向别处。
const int *a;
int b = 34;
int c = 345;
a = &b;
a = &c;
cout << *a << endl;
2.情况(2)
情况(2)与情况(1)相同。
3,情况(3)
情况(3)为指针本身为常量,这种情况下不允许指针本身进行更改操作,而指针所指向的内容不是常量。
此外,定义的同时必须进行初始化。
/*int * const a;*/ ///错误
int b = 34;
int c = 345;
int * const a = &b;
*a = 600;
cout << *a << endl;
举个栗子:
如果a是一名仓库的保管源,他只能进入指定的仓库,而不能进入其他的仓库(a++是错误的),但是这个仓库的货物(*a)是可以移动的,(*a=600是正确的)。
4.情况(4)
这个仓库保管员智能去,特定的仓库,并且仓库里的货物不能去改变。
接下来聊一聊const函数是什么?
我们定义的类的成员函数中,常常有一些成员函数不能改变类的数据成员。也就是说这些函数都是“只读”函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数加上“const”进行标识,可以调高程序的可读性。其实,他还可以改变可靠性。当函数进行修改数据,会按错误处理。
一些成员函数修改对象。
void printf::SetPr(int x, int y)
{
xval = x;
yvl = y;
}
为了使成员函数的意义更加清楚,我们在不可不改变对象的成员对象的成员函数的函数原型加入const。
class Point
{
int xval;
int yval;
public:
int Getvay() const
{
}
int Point::Getvay() const
//关键字 必须用同一样的方式,否则编译器会认定为两个函数
{
return yval;
}
};
如果Getval()试图任何方式去改变yval或调用另一个非const成员函数,编译器会给出错误的信息。
const与#define相比较有什么不同
c++语言可以用const定义常量,也可以用#defineconst定义常量,但是前者比较后者有更多的优点?
- const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者进行字符替换,没有类型检查,还有意料不到的错误。