const作用对象:普通常量、函数、对象、数组、指针、结构体、引用。
1、普通常量
语法规则:a、const 数据类型 常量名=常量值;b、数据类型 const 常量名=常量值;
在定义常量时必须初始化!
eg: const int i=9;以后对i只能读取,不能改写。
2、指针
摘抄来的一些写法:
(1)const char pStr="good";//与pStr结合,const修饰的是*pStr,指向的字符串不可变,指针可变
(2)const (char ) pStr="good";//与char结合,相当于新类型(char *),const修饰pStr,指针不可变,指向字符串可变
(3)char * const pStr="good";//类型是(char *),const修饰pStr,指针不可变,指向的字符串可变
(4)(char *) const pStr="good";//同上
(5)char const pStr="good";//类型是char,与pStr结合,const修饰*pStr,指向字符串不可变,指针可变
(6)const char * const pStr="good";//后一个const修饰pStr,指针pStr不可变;与pStr结合,前一个const修饰的常量是pStr,指向的字符串也是不可变
(7)char const * const pStr="good";//同上,指针和指向的字符串都是不可变的
(8)typedef char* pStr;
const pStr str="good";//pStr是个新类型(char *),并且是个整体,此时str是个指针 不可变,指向内容可变
总结:const的位置变化性大,主要是看号是与普通类型符(char等)结合还是与常量名(pStr)的结合;与const是不能连接在一 起说的。
3、CONST在函数中的使用
(1)const修饰函数形参
示例:bool strcmp(const char str1,const char str2);
此函数比较字符串str1与str2是不是相同,只是用来比较而不能对两个字符串做修改,使用const是对两个字符串的保护;
注意:首先明确一点,函数参数是指针、引用、数组类型时,对形参的操作就是对实参的操作,会改变原来数据的值 ;对普通的参数类型操作是对实参复本的操作,不会改变原来数据的值;所以const一般修饰指针、引用、数组类型的形参,使原来的数据不改变,起到保护作用。另外const 指针可以接受const 和非 const 地址,但是非const 指针只能接受非const 地址。
(2)const修饰返回值
函数返回值为 const 只有用在函数返回为引用的情况,因为只有返回值为引用时才会作为左值操作。
示例:const NewType &function();其中NewType为新的复杂类型,不是原有内部类型(int 、char);
一个示例:返回值当左值操作
class student
{
public:
char *name;
public:
student &set(student s)//函数返回自身所在的对象
{
return s;
}
};
void main()
{
student s;
s.name="bad";
cout<<(s.set(s).name="good")<<endl;//修改对象中name的值,如果返回值加const修饰的话,此句报错
}
(3)const修饰整个函数
见const在类和对象中的使用
4、const在类中的使用
const修饰成员函数、修饰数据成员、修饰对象
示例:
class A
{
int x,y;//坐标
public:
int GetX() const;//得到X坐标,const成员函数
void SetX(int i);//设置X坐标
}
int A::GetX() const//定义
{
return x;
}
void A::SetX(int i)
{
x=i;
}
const A aa;
规则和说明:
(1)为成员函数设定const类型,是为了限定些成员函数不能修改类的对象(具体是对象中的数据成员);
(2)任何不修改数据成员的函数都应该声明为const函数,这样有助于提高程序的可读性和可靠性。
(3)const成员函数定义时也要和声明时相同,即加上const标记。
(4)非const成员函数不能被const对象调用,构造函数和析构函数对这个规则例外。
(5)const成员函数不能调用同类的非const成员函数。
(6)仅当某个函数是类成员时,将其声明为const才有意义;
原文链接: https://www.cnblogs.com/ddx-deng/archive/2013/04/16/3755852.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/84871
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!