const关键字总结

一.关于const关键字的思维导图

在这里插入图片描述

二:const的使用方法

  • 1.定义const对象
    const修饰符把对象修饰为常量,意思是接下来对象都被当成常量使用,不能被修改
    在这里插入图片描述在用const修饰的值不能更改在这里插入图片描述一开始就要初始化
    类中的const对象需要通过构造函数初始化定义
    在这里插入图片描述
  • 2.const对象默认为文件局部变量
    在全局作用域声明的const变量是文件的局部变量,只能被当前文件使用,不能被其他文件访问。如果在新的文件重定义,该const变量会被覆盖。通过指定const对象为extern,就可以在整个程序访问该const对象
    在这里插入图片描述
  • 3.const引用
    意思是指向const对象的引用
    在这里插入图片描述
    下面让我们看下不同类型的const引用
    在这里插入图片描述
    注意:引用存放着对象的地址,他是该对象的别名。对于不可寻址的值。编译器为了生成引用,必须生成一个临时对象,引用实际上指向这个临时对象,用户无法访问。
    如何j不是const类型,程序员想要修改j实际上是修改了k,当查询i的值的时候会发现没有变化。用const其实是告诉程序员这个值不能修改。
    注意:非const引用只能绑定到与该引用类型相同类型的对象,而const引用可以绑定到不同但是相关类型的对象上。
  • 4.const对象的动态数组
    需要在开空间时初始化
		const int* a = new const int[100]();
	const string* s = new string[100];

这里会调用string类的默认构造函数初始化数组元素。

  • 5.指针和const限定符的关系(重点)
	const int* cur;

这里的cur是一个指向int类型的const对象的指针,const先顶了cur指向的对象的类型,而并非cur本身,所以cur不是const的
一条饶人的结论: 允许把非const对象的地址赋给指向const对象的指针

	const double* cur;
	const double pur = 1.2;
	cur = &pur;

const指针

	int pur = 10;
   int* const cur = &pur;

上述语句被称为“指向int型对象的const指针”

  • 6函数和const限定符的关系()
  • 6.1 类中的const成员函数
class Stack
{
private:
	int ad;
public:
	void Push(int elem);
	
	int GetCount(void) const;
};

int Stack::GetCount() const;
{
	++ad;// 错误,企图修改成员函数
	Push();//错误,企图调用非const成员函数
	return ad;
}
  • 6.2实现函数重载
   void Print();
   void Print() const;
int main()
{
   Stack a();
   a.print();
   const Stack b();
   b.print();
}

const对象对应const函数。

  • 6.3 const 修饰函数返回值
//无实际意义,参数返回值就是赋值
const int fun1();
//const int* cur = fun1();
//我们可以把fun2()看成是一个变量,指针内容不可变
const int* fun2();
//int* const fun3();
//把fun2()看成是一个变量,指针类型不可变
int* const fun3();
  • 6.4 const修饰函数参数
//传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void fun(const int key);
//参数指针所指向的内容不可变
void fun(const int* cur);
//参数指针本身不可变(无意义,cur本事是形参)
void fun(int* const cur);

const修饰引用参数

//参数为引用,为了增加效率同时防止修改。
void fun(const int& cur);
  1. const修饰的参数和普通的传值是一样的,他禁止对引用的对象的一切修改,唯一的不同的是按值传递会建立一个类的对象副本,然后传递过去,而他是直接传递地址过去,增加了效率。
  2. 只用引用的const对象可以传递一个临时对象,因为临时对象都是const属性,不可见的,他短时间存在一个作用域中,所以不能用指针,只用引用的const传递可以捕获对象。

三.const限定符和static的区别(重点)

  • 1.const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放空间
  • 2.static表示的是静态的。类的静态成员和静态成员函数是和类具体相关的,而不是和类的具体对象相关的,即使没有对象,也能调用类的静态成员函数和成员变量。一个类的静态函数几乎就是一个全局函数,只不过他的作用域范围值限定在自己的范围内。
  • 3.在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是一个声明,定义必须在类的外部,通过在类的实现的文件初始化。
  • 4.C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化,并且必须有构造函数。
  • 5.const数据成员,** 只在某个对象生存期间是常量,而且对整个类而言是可变的 ** 。因为类可以创造多个对象,不同的对象其const数据成员的值可以不同。所以第4点中,不能再定义处初始化,是因为类还没被创建时,编译器不知道const数据成员的值是什么。
  • 6.const数据成员的初始化只能在** 类的构造函数的初始化列表 **中进行。要想建立在类中都恒定的常量,应该用类中的枚举实现,或者static const实现。
  • 7.const成员函数只要目的时防止成员函数修改对象的内容。即const成员函数不能修改其对象的值,但可以访问成员变量。
  • 8.static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态成员。这个函数没有this指针,这导致:1.不能直接存取类的非静态成员变量,调用非静态成员函数。 2.不能被声明为virtual

四.const的难点

const加在不同的位置有不同的意义: int const cur 和 const int cur没有区别
难点在于指针前后加const类型的判断:

	int b = 100;
	const int* a = &b; //1
	int const *a = &b; //2
	int* const a = &b; //3
	const int* const a = &b; //4

如果const位于* 的左侧,则const修饰的是指针所指向的变量,即指针指向的对象是常量;如果const位于星号的右侧,则const修饰的是指针的类型,即指针本身是常量。

因此 1 和 2 情况相同,都是修饰指针所指向的内容,(const在变量声明符的前后无关),这种情况下不允许对内容进行修改如a = 3。
3 修饰的是指针,指针本身算个常量,而指针指向的内容不是常量,这种情况下不能对指针本身进行修改,这种情况下对指针本身进行更新修改,如
a++是错的。
4 指针本身和指向的内容均为常量。

全文参考:
const关键字

猜你喜欢

转载自blog.csdn.net/l477918269/article/details/89741374