(一)C和C++中的相同点
1.const 修饰指针
const与一级指针结合
int const *p;
const int *p;---->p为常量指针 p指向的内容不可改 p的指向可以改
int *const p;---->p为指针常量 p的指向不可改 指向的内容可改
const int *const p---->p的指向和指向的内容都不可改
const与二级指针结合 int a = 10;int *q = &a,int **p = &q;
int** const p; --->p为指针常量,p的指向不可改(p只能指向q)
**p 可以修改q所指的内容
*p 可以修改q的指向
int *const *p; --->p为常量指针,*p不可以 p指向的内容不可改(q里面保存的内容不可改)
但是p的指向可以改
**p 可以改变q所指向的内容
const int **p; --->p为常量指针,**p不可以 不可以改变q指向的内容
p的指向可以改
*p可以改(q的指向可以改)
2.const与函数形参的结合
const int* a; --->防止修改指针指向的内容
int* const a; --->防止修改指针指向的地址
const int &a; --->防止修改a的值 指向使用a 不想改变a的值
3.const与函数返回值结合
(1)如果给以“指针形式”返回的函数返回值加const
表示此函数返回的指针所指向的内容不可改
并且应该以同类型指针接受返回值
(2)如果给以“引用形式”返回的函数返回值加const
表示此函数的返回值不能做左值 即不能被修改
(二)不同点
c语言中的const
1.const 修饰变量 变为常变量
必须进行初始化 因为被const修饰的变量不能作左值被修改
由于常变量本质还是变量 一个不确定的值 所以不能用来定义数组大小
如果const修饰的变量是一个全局变量 这样可以防止不必要的人为修改
因为全局变量作用域为global 可以被同一工程的其他文件通过“extern”引用
c++中的const
1.const 修饰变量 变为常量
必须进行初始化 因为被const修饰的变量不能作左值被修改
由于此时这个变量的本质变为一个常量 所以可以作为数组的大小
2.类中const的应用
(1)const修饰成员变量 称为成员常量
不能被修改 它只能在初始化列表中赋值
class A
{
const int a;
int b;
A(int x,int y):a(x)
{
b = y;
}
};
(2)const修饰成员函数
被const修饰的成员函数 不能修改类中的任何非const成员 一般写在函数后面来修饰
class A
{
void fun() const;
};
const成员函数不被允许修改它所在对象的任何一个数据成员
const成员函数能够访问对象的const成员 而其他成员函数不可以
(3)const修饰类对象/对象指针/对象引用
const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。
对象指针和对象引用也是一样。
const修饰的对象,该对象的任何非const成员函数都不能被调用,
因为任何非const成员函数会有修改成员变量的企图。
(4)const类型转为非const类型
采用const_cast<type> (expression); 该运算符用来修改类型的const或volatile属性
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;
常量对象被转换成非常量对象。
#include <iostream>
using namespace std;
class A
{
public:
A(int x,int y,int z):a(x)
{
//a = x;//error 必须在初始化列表里赋值
b = y;
c = z;
}
void SHow()const
{
//const成员函数不被允许修改它所在对象的任何一个数据成员
//a = 10;//error
//b = 20;//error
//const成员函数可以访问const成员变量和非const成员变量
cout<<"A::const a = "<<a<<endl;
cout<<"A::b = "<<b<<endl;
cout<<"A::c = "<<c<<endl;
}
void Show()
{
cout<<"A::const a = "<<a<<endl;
cout<<"A::b = "<<b<<endl;
cout<<"A::c = "<<c<<endl;
}
private:
const int a;
int b;
int c;
};
int main()
{
const A a(1,2,3); //const A *this;从而保护this指向的内容不被随意修改
A b(1,2,3);//A *this;
a.SHow();//const对象可以调用const成员函数
// a.Show();//const对象不能调用任何非const成员函数 const A*this 不能转为 A *this 这属于权限扩大
b.SHow();//非const对象可以调用const成员函数 A *this ---> const A*this 权限可以缩小
return 0;
}