原文:https://blog.youkuaiyun.com/luoweifu/article/details/45600415
这里的T指的是一种数据类型,可以是int、long、doule等基本数据类型,也可以是自己类型的类型class。单独的一个const你肯定知道指的是一个常量,但const与其他类型联合起来的众多变化,你是不是就糊涂了?下面我们一一来解析。
const T
定义一个常量,声明的同时必须进行初始化。一旦声明,这个值将不能被改变。
const T*
指向常量的指针,不能用于改变其所指向的对象的值。
const int i = 5;
const int i2 = 10;
const int* pInt = &i; //正确,指向一个const int对象,即i的地址
//*pInt = 10; //错误,不能改变其所指缶的对象
pInt = &i2; //正确,可以改变pInt指针本身的值,此时pInt指向的是i2的地址
const int* p2 = new int(8); //正确,指向一个new出来的对象的地址
delete p2; //正确
//int* pInt = &i; //错误,i是const int类型,类型不匹配,不能将const int * 初始化为int *
int nValue = 15;
const int * pConstInt = &nValue; //正确,可以把int *赋给const int *,但是pConstInt不能改变其所指向对象的值,即nValue
*pConstInt = 40;
const int* 与int* const的区别
指针本身就是一种对象,把指针定义为常量就是常量指针,也就是int* const的类型,也可以写成int *const,声明时必须初始化
const int* 指针指向的对象不可以改变,但指针本身的值可以改变;int* const 指针本身的值不可改变,但其指向的对象可以改变。
const T&
对常量(const)的引用,又称为常量引用,常量引用不能修改其邦定的对象。
在函数中的应用
1.希望传入一个对象,又不想让函数体修改这个对象。
void Dealwith(const Data& data)
{
cout << data.value << endl;
//data.value = 5; //错误,data是常量引用,不能改变其邦定的对象
}
void Dealwith(const Data* pData)
{
cout << pData->value << endl;
//pData->value = 5; //错误,pData是指向常量对象的指针,不能改变其指向的对象
}
2.在类中的使用,返回一个类的成员,但不希望调用方修改这个成员。
class MyData
{
public :
MyData(std::string name, Data data)
{
m_name = name;
m_data = data;
}
const Data* GetData()
{
return &m_data;
}
private:
std::string m_name;
Data m_data;
};
MyData mydata("", Data(100));
const Data* pData = mydata.GetData();
cout << pData->value << endl; //pData->value = 100
//pData->value = 50; //错误,pData是指向常量对象的指向,不能改变其指向对象的值