本文主要是将零碎的点整理起来方便于复习学习
const
const可用来定义一个常量。如:
const int i; // 定义一个int类型的常量
int const i;//同上
const int * p; //定义一个指向常量的指针,即不能通过指针修改这个指针指向的值(可以改变p,但不能改变*p)
int * const p; //定义一个常量的值,即不能修改这个指针的指向,但可以修改其指向地址上所存储的指(可以改变*p,但不能改变p)
const int * const p;`//*p不能修改,p也不能修改
const修饰成员函数时
当在一个类中,const用来修饰成员函数时,const修饰的成员函数里,不能修改任何成员变量,而且const修饰的成员函数里,不能调用非const修饰的成员函数,以防非const修饰的成员函数改变了成员变量(调用的话会编译错误),如:
class A
{
private:
int a;
public:
void gg()
{
a = 3;
} //普通的成员函数,为a赋值
void yy() const //const要写在函数后面,写在前面就成修饰函数返回值
{
a = 3;//编译错误,不能修改成员变量
gg();//编译错误,const成员函数不能调用非const成员函数,而且gg()里改变了成员变量的值,更违反了const成员函数的规则
}
};
const修饰成员变量时
在类中,const修饰成员变量时,不可以直接初始化,初始化必须在构造函数初始化列表中初始化,如:
class B
{
private:
//const int a = 3; 这是错误的,不能直接初始化
const int a;
public:
B(): a(3) //在初始化列表中将const常量a初始化
{
}
};
const修饰函数返回值时
const在修饰函数返回值时,函数传递出来的值(即返回值)应该也用const修饰的值来接,如:
const int yy()
{
return 3;
}
int main()
{
//int a = yy(); 这是错误的,yy()返回出来的值是const修饰的,必须用const修饰的值来接,如下
const int a = yy();
}
关于const的内存分配
在C语言中,const常量就是只读常量,会为它分配内存空间,即有自己的存储空间;
但在C++中,const常量不一定会为其分配内存。对于大多基本数据类型的常量,编译器一般是将其放入符号表中,这样是没有为其分配内存的,在编译过程中若发现使用常量则直接以符号表中的值替换。一下几种情况是会为其分配存储空间:
(1)const常量为全局常量,且在其它文件中被使用(即在其它文件使用了extern将其调用)
(2)使用了&操作符取const常量的地址
(3)const定义的常量是未知的时候
const与define是有区别的
const常量是由编译器处理的,而define是在预处理器处理的,即在编译前的预编译就将define定义的值进行了文本替换。
`