那时来看一看const的用语。
第三:常表达式
表达式用const润色,其值严禁被发生改变。任何人发生改变此表达式的标识符单厢造成校对严重错误。Const加在正则表达式其间均可。
比如:
void main(void)
{
const int i = 10; //i,j都用于常表达式
int const j = 20;
i = 15; //严重错误,常表达式无法发生改变
j = 25; //严重错误,常表达式无法发生改变
}
第三:常操作符
const跟操作符一同采用的这时候有三种方式。
const需用来限制操作符不容变。换句话说操作符对准的物理门牌号不容变,但能随便发生改变该门牌号对准的缓存的文本。
int main(void)
{
int i = 10;
int *const j = &i; //常操作符, 对准int型表达式
(*j)++; //能发生改变表达式的文本
j++; //严重错误,无法发生改变常操作符对准的物理门牌号
}
const也需用来管制操作符对准的缓存不容变,但操作符对准的物理门牌号可变。
int main(void)
{
int i = 20;
const int *j = &i; //操作符,对准int型常量
//也能写成int const *j = &i;
j++; //操作符对准的物理门牌号可变
(*j)++; //严重错误,无法发生改变缓存文本
}
看完上面的两个例子,是不是糊涂了?告诉你一个诀窍,
在第三个例子中,const用来润色操作符j,j不容变(也就是对准int表达式的常操作符);
第三个例子中,const用来润色*j,*j不容变(也就是对准int常量的操作符)。
这三种方式能组合起来采用,使操作符和缓存文本都不容变。
int main(void)
{
int i = 10;
const int *const j = &i; //对准int常量的常操作符
j++; //严重错误,无法发生改变操作符对准的门牌号
(*j)++; //严重错误,无法发生改变常量的值}
第三:Const和引用
引用实际上就是表达式的别名,这里有几条规则:
声明表达式时必须初始化
一经初始化,引用无法在对准其它表达式。
任何人对引用的发生改变都将发生改变原表达式。
引用和表达式本身对准同一内存门牌号。下面的例子演示了以上的规则:
void main(void)
{
int i = 10; //i和j是int型表达式
int j = 20;
int &r = i; //r 是表达式i的引用
int &s; //严重错误,声明引用时必须初始化 i = 15; //i 和 r 都等于15
i++; //i 和 r都等于16
r = 18; //i 和r 都等于18
printf(“Address of i=%u, Address of r=%u”,&i,&r); //物理门牌号相同
r = j; //i 和 r都等于20,但r不是j的引用
r++; //i 和 r 都等于21, j 仍等于20
}
用const润色引用,使应用不容修改,但这并不耽误引用反映任何人对表达式的修改。Const加在正则表达式其间均可。
比如:
void main(void)
{
int i = 10;
int j = 100;
const int &r = i;
int const &s = j;
r = 20; //错,无法发生改变文本
s = 50; //错,无法发生改变文本 i = 15; // i和r 都等于15
j = 25; // j和s 都等于25
}
第四:Const和成员函数
声明成员函数时,末尾加const润色,表示在成员函数内严禁发生改变该对象的任何人数据。这种模式常被用来表示对象数据只读的访问模式。比如:
class MyClass
{
char *str =“Hello, World”;
MyClass()
{
//void constructor
}
~MyClass()
{
//destructor }
char ValueAt(int pos) const //const method is an accessor method
{
if(pos >= 12)
return 0;
*str = M; //严重错误,严禁修改该对象 return str[pos]; //return the value at position pos
}
}
第五:Const和重载
重载函数的这时候也能采用const,考虑下面的标识符:
class MyClass
{
char *str =“Hello, World”;
MyClass()
{
//void constructor
}
~MyClass()
{
//destructor
}
char ValueAt(int pos) const //const method is an accessor method
{
if(pos >= 12)
return 0;
return str[pos]; //return the value at position pos }
char& ValueAt(int pos) //通过返回引用设置缓存文本
{
if(pos >= 12)
return NULL;
return str[pos];
}
}
在上面的例子中,ValueAt是被重载的。Const实际上是函数参数的一部分,在第三个成员函数中它管制这个函数无法发生改变对象的数据,而第三个则没有。这个例子只是用来说明const能用来重载函数,没有什么实用意义。
class MyClass
{
char *str =“Hello, World”;
MyClass()
{
//void constructor
}
~MyClass()
{
//destructor
}
char& operator[](int pos) //通过返回引用需用来更改缓存文本
{
if(pos >= 12)
return NULL;
return str[pos];
}
}
void main(void)
{
MyClass m;
char ch = m[0]; //ch 等于 H
m[0] = M; //m的成员str变成:Mello, World
}
创作不易,点赞+关注哦!!!