所谓
常量
是指在程序运行中值始终不可改变的量。而
常对象
是指他的
数据成员
在对象的整个生存周期内不能改变。这也意味着不能用常对象去调用普通的成员函数,因为有可能会改变常对象的数据成员,所以便有了
常成员函数
。如果一个对象被声明为常对象,他只能调用常成员函数。普通对象也能调用常成员函数,但是会被视为常对象,即不能改变数据成员的值。
c++中用
引用
作形参来对实参进行操作而提高效率,但是有时不希望对实参进行更改或者传递的是常对象,这时就应该采用
常引用
的方式。
常引用声明方式:const 类型标识符 &引用名 = 目标变量名;
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 所以不存在引用常量的说法
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
#include<iostream>
using namespace std;
int main()
{
int a=10,b=12;
int const &p=a;//const int &p=a;常量引用,引用是个常量,一旦引用被初始化为一个对象,就不能被指向到另一个对象。
// p=b;//报错assignment of read-only reference 'p',p为只读变量
//p=a;//也报错,assignment of read-only reference 'p',反正不能有引用指向的语句
a=13;
cout<<p<<endl;//13;值可以改变
//p=13;
//cout<<p<<endl;//报错assignment of read-only reference 'p',不能通过p改变值
return 0;
}
常量指针
又叫
常指针
,指的是声明的一个
指针变量
是一个常量,不允许发生改变,也就是该指针
不能指向其他地址
。但是该指针所指的对象是可以发生改变的。
#include<iostream>
using namespace std;
int main()
{
int a=10,b=12;
int *const p=&a;//const和int的位置不能互换
//常量指针,该指针是个常量,顾名思义指针不能指向其他的地址,但指针所指向的地址中的内容可以改变
a=13;
cout<<*p<<endl;//13
*p=15;
cout<<*p<<endl;//15
// p=&b;//报错指针不能指向其他的地址
//cout<<*p<<endl;
return 0;
}
指向常量的指针
,也叫
指针常量
,顾名思义,该指针变量
指向的是一个常量
,指针所指的常量不允许改变,但是该指针可以指向其他地址。
#include<iostream>
using namespace std;
int main()
{
int a=10,b=12;
int const *p=&a;//等同于const int *p=&a;const和int位置可以互换;
//指针常量,指向常量的指针,所指地址的内容不能通过指针改变,指针可以改变所指的地址
a=13;
cout<<*p<<endl;//13
a=b;
cout<<*p<<endl;//12
//*p=14;//报错不能通过指针改变值,但可以通过其他方式改变a的值
//cout<<*p<<endl;
p=&b;//12
cout<<*p<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int const a=13;
int *p=a;//报错 invalid conversion from 'int' to 'int*' [-fpermissive]|
//因为它消除了a的const属性
return 0;
}
通过*的位置来记忆
如int * const a = &b; 后面是a,则说明a不能修改!为常量指针
int const * a = &b;后面是*a则说明*a不可被修改!为指针常量