在C++中为什么要用const对象的指针
其实在教材中也说了,使用const限定符可以强制改变访问的权限。
const指针表示指针本身是一个常量。由于指针是对象,因此就像其他对象一样,允许把指针本身定为常量。cosnt指针必须初始化,并且一旦初始化,const指针的值就不能改变了。const指针的值到底是什么?其实就是存放在指针中的地址,这个地址是一个对象的地址。
如果指针指向const对象,则不允许用指针来改变其所指的const值。为了保证这个特性,c++语言强制要求指向const对象的指针也必须有const特性。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
double c = 11.0;
const double d = 12.0;
const double e = 13.0;
const double *cptr; // 指向const对象的指针
cptr = &c; // 正确,指向const对象的指针可以指向非const对象
cptr = &d; // 正确,可以指向const对象
cptr = &e; // 正确,指针可以指向别的const对象
*cptr = 13.0; //错误,不能修改
}
在上文中说了const特性这个词,那么什么是const特性?
const的特性:
- 不存在变量提升现象。
- 暂时性死区。
- 不可重复声明。
- 声明的是只读常量,声明时必须初始化。
- 本质保存的是内存地址,简单类型数据的值就保存在这个地址中,复合类型数据在这个地址中保存的是一个指针,这个指针指向的对象可以改变,单指针不可改变。
const作用:
用于指针的两种情况,const是一个左结合的类型修饰符
2.限定函数的传递值参数
3.限定函数返回值
4.限定函数类型
在C++限定符中有左值和右值,可以说是一个表达式,表达式左边式左分量,也称左值,可以作为左操作数。也可以作为右操作数
指向常量的指针和常量指针
const double pi = 3.14; // pi是一个常量,不能改变它的值
const double *cptr = π //cptr指向pi,注意这里的const不能丢,因为普通指针不能指向常量
*cptr = 3.33; //错误,试图改变所指对象的值。不能给*cptr赋值,即不能改变指针所指对象的值
cout << cptr << endl;//输出cptr的值
//虽然不能改变其所指对象的值,但是它可以指向别的常量对象
//这样的话 指针的值(也就是存放在指针中的那个地址)也会改变 比如:
cosnt double pi2 = 6.28;
cptr = &pi2; //正确 *cptr为6.28
cout << cptr << endl; //cptr的值变了
怎样区分C++ const指针式指向常量的指针还是const指针呢?
从右往左读,遇到p就替换为“p is a”,遇到*就替换为“point to”,其余不变。下面我们来一个一个看:
1. const int p; // p is a int const. p是一个int型常量 这个很简单
2. const int *p; //p is a point to int const. p是一个指针,指向int型常量。即p是一个指向int型常量的指针。
3. int const* p; //与2相同 const int 和 int const 是一样的意思。《C++ primer》中采用第一种写法。
4. int * const p; // p is a const point to int. p是一个指向int的const指针
5. const int * const p; //p is a const point to int const. p是一个指向int型常量的const指针。
6. int const * const p; //同5