C++复习笔记(一)——const

本文主要是将零碎的点整理起来方便于复习学习

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定义的值进行了文本替换。
`

猜你喜欢

转载自blog.csdn.net/qq_40101200/article/details/85811652