在C语言中:

        const代表着“恒定不变的意思”,它是修饰只读变量的关键字,说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量;所以被const 修饰的变量具有了常量的属性,在被const修饰的变量一定要初始化。

用const定义变量的方法很简单,比如:const int a=10; int const a = 10;

        被const修饰的变量,无论是全局变量还是局部变量,其生命周期存在于整个程序的运行过程,全局变量自不用说,被const 修饰的局部变量的作用域扩大了,作用于整个工程当中。

 

在c++中:

       当const 修饰变量时,自不用说,c++兼容c,上面的一些性质自然也就包含了,这里const在c++中又多出来了一个用法,被const修饰的变量具有宏替换的属性,也就是说在编译阶段,被const 修饰的变量在后续会被直接被右值替换,就算强制改变变量里面的值也不会有任何作用。

     这里要说一下const修饰的和宏有什么区别? 宏变量:是在预编译阶段的头文件处理时会进行宏展开,优点时增强了代码的可读性,方便修改,缺点是无法调试,不能进行类型检查等。const修饰的变量是在编译阶段进行宏替换的,可以进行类型检查,以及调试。

 

   (1)   当const修饰成员函数时,被const修饰的类成员函数称之为const成员函数,比如:

      1                                       2                       3

const int TestFunc1(const int a)const
	{
		this->_day += 1;
		// this->_month += 1;
		//this->_year += 1;
		cout << _day << endl;
		return 0;
	}
//普通成员函数
void TestFunc2()
	{
		this->_day += 1;
	}
1 const:修饰的是函数的返回值
2 const: 修饰的是函数的参数
3 const: 修饰成员函数本身---const成员函数

我们知道成员函数中有一个隐形的函数指针this,它的类型(假设类类型为date)date const*  ,在普通变量中this->_day这个操作可以执行,而上面的const修饰的不能通过,const没修饰成员函数之前this->_day可以修改,修饰之后却不行了,可以得出const 本质上修饰的是this指针,它的类型变为 const date* const;表明this指向的对象都改不了了,在const成员函数中可以读取变量中的内容,但是不能修改;但是呢又有个需求const成员函数里面的变量,那怎么办呢?这里要涉及到mutable关键字,可以在需要改的变量之前加。

那么问题来了const 类型的对象能调用普通类型的函数吗?

答案是不能的,因为普通成员函数是可读可写(修改)的,而const修饰的成员变量是不能修改的,并且返回类型的地址也不能修改,否则其安全性不能保证。

     (2).普通类型的对象可以调用const类型的成员函数吗?

     答案是可以的,比如举个例子:

//成员函数
void PrintDate()const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}



//调用
Date d2(2021, 6, 10);
d2.PrintDate();

   这个普通的成员函数我们只需要打印,并不需要它做任何事,为了保证代码的安全性可以设置为const成员函数,普通类型的对象的权限比较大:(可读可写),既可以调普通类型的成员函数,也可以掉const成员函数(因为虽然不能修改,但我普通类型的对象权限比较大,完全可以不写),const修饰的对象权限:(可读),不能调用普通成员函数,只能调用const成员函数。

 

    (3).const成员函数内可以调用其它的非const成员函数吗?

    这里我们举两个成员函数的例子:

// Date* const
	void TestFunc2()
	{
		this->_day += 1;
	}

	// this指向对象中的内容不允许修改
	void TestFuncWithConst()const
	{
		
		// TestFunc2();  // TestFunc2: 内部可能会修改this指向的对象中的内容
	}

   这里我们写了const成员函数TestFuncWithConst()和普通函数TestFunc2(),const修饰的this指针指向的内容不能修改,它是只读;而普通函数TestFunc2()是可读可写的,const修饰的成员函数调用了可写的成员函数,该函数可能会修改this指向的变量的内容,但const修饰的this指向的内容不允许修改,所以当调用TestFunc2()是不被允许的。

 

   (4).非const成员函数内可以调用其它的const成员函数吗?

  继续举例子:

    

// const Date* const
	const int TestFunc1(const int a)const
	{
		//this->_day += 1;
		cout << _day << endl;
		return 0;
	}

void TestFuncWithOutConst()
	{
		
		TestFunc1(10);   // 可读
	}

       同上,当用普通类型的函数TestFuncWithOutConst()调用const成员函数时是可以的,因为普通类型的函数权限比较大,可读可写,而TestFunc1函数只读,这个函数并不会修改任何参数,是安全的,变相的说,普通类型函数权限大,const函数权限小,大的包容小的完全可以。

   

      以上我只列举了const用法的九牛一毛,如有错误还望指正。