(1) 指向非const数据的非const指针
书写形式为: int *countPtr ;
特点: 指针的指向可以被修改,指向的数据可以被修改
#include<iostream>
int main()
{
int x = 10;
int y = 20;
std::cout << "x:" << x << std::endl;
int *ptr = &x;
std::cout << "ptr:" << ptr << std::endl;
*ptr = 100;//指针指向的数据被修改
std::cout << "x:" << x << std::endl;
ptr = &y;//指针指向被修改
std::cout << "ptr:" << ptr << std::endl;
return 0;
}
(2) 指向const数据的非const指针
书写形式为: const int *countPtr ;
特点: 指针的指向可以被修改,指向的数据不能被修改
#include<iostream>
void Func(const int*);
int main()
{
const int count = 10;
Func(&count);
return 0;
}
void Func(const int* countPtr)//countPtr是一个 指向const数据的非const指针
{
std::cout << countPtr << " " << *countPtr << std::endl;
*countPtr = 200; //会出现编译错误,因为countPtr指向的是const数据,const数据不能被修改
std::cout << countPtr << " " << *countPtr << std::endl;
}
(3) 指向非const数据的const指针
书写形式为: int *const countPtr ;
特点:1. 指针的指向不可以被修改,指向的数据可以被修改
2. 声明时必须初始化,否则会编译错误
#include<iostream>
int main()
{
int x, y;
int *const ptr = &x; //ptr是一个指向非const数据的const指针,声明时必须初始化
*ptr = 200;
std::cout << x << std::endl;
ptr = &y; //出现编译错误,ptr是一个指向非const数据的const指针,不能被修改
return 0;
}
(4) 指向const数据的const指针
书写形式为: const int *const countPtr ;
特点:1. 指针的指向不可以被修改,指向的数据不可以被修改
2. 声明时必须初始化,否则会编译错误
#include<iostream>
int main()
{
const int a = 10;
const int *const ptr = &a;
*ptr = 20; //error,指向const数据的const指针指向的数据不能被修改
ptr = &a; //error,指向const数据的const指针,指向不能被修改,哪怕指向之前指向的数据也不可以
return 0;
}
总结:
1. 结合上述,const 在 (int *p) 之前,则表示指向const数据
2. 结合上述,const 在 (int *p) 之间,即int *const p ,则表示 p 为const的指针
3. const指针在声明时记得一定要初始化,否则会出现编译错误
扩展:
Good& operator=(const Goods& rhs)
{
//...
}
形参中的const 有两个作用:
1.防止通过引用修改实参,即 指向const数据的非const指针 特性的应用
2.接收隐式生成的临时量, 因为中间量(临时量)不能被修改,即 指向const数据的非const指针 特性的应用