所谓常量是指在程序运行中值始终不可改变的量。而常对象是指他的数据成员在对象的整个生存周期内不能改变。这也意味着不能用常对象去调用普通的成员函数,因为有可能会改变常对象的数据成员,所以便有了常成员函数。如果一个对象被声明为常对象,他只能调用常成员函数。普通对象也能调用常成员函数,但是会被视为常对象,即不能改变数据成员的值。
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不可被修改!为指针常量
————————————————
版权声明:本文为CSDN博主「雪山上的小草」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37154839/article/details/84864312