C++中的const

C++中的const

跟着C++ primer学C++的时候,因为有C的基础,所以看起来还行,但是看到const部分的时候,感觉还是有很多问题,搞得很乱,所以记一下。

const定义和引用

const变量之后无法修改,所以定义的同时要进行初始化。

在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。

1
2
3
4
5
const int ival = 1024;

const int&refVal = ival; //正确,都是const对象

int &ref2 = ibal; //错误,不能使用非const引用指向const对象

可以读取但不能修改refVal,因此,任何对refVal的赋值都是不合法的。这个限制有其意义:不能直接对ival赋值,因此不能通过使用refVal来修改ival。同理,用ival初始化ref2也是不合法的:ref2是普通的非const引用,因此可以用来修改ref2指向的对象的值。通过ref2对ival赋值会导致修改const对象的值,为防止这样的修改,需要规定将普通的引用绑定到const对象是不合法的。 const 引用可以初始化为不同类型的对象或者初始化为右值。

非const引用只能绑定到与该引用相同类型的对象。 const引用则可以绑定到不同但相关的类型的对象或绑定到右值。

指针和const限定符的关系

也就是常说的顶层const和底层const。这部分比较重要,容易搞混,所以也是重点记录的。

底层const
1
const int *cptr;

C++为了保证不允许使用指针改变所指的const值这个特性,强制要求这个指针也必须具备const特性,从另一个角度来说,就是可以修改const指针所指向的值的,但是不能通过const对象指针来进行而已。白话更好理解一点就是自认为指向const的指针(因为可以用底层const指向非const变量,并且不能用底层const去修改这个非const变量,因此这个指针的值是可以变的,也就是可以指向其他变量且不需要初始化)

顶层const
1
2
int num =0;
int *const cptr = #

可以理解为const指针,也就是这个指针本身的值不能修改,但是这个指针指向的对象有可能可以修改(能不能修改取决于这个对象是否是const变量)

二者一起使用

这样首先是一个const指针,然后其指向一个const对象~~~

函数和const限定符的关系

类中的const成员函数(常量成员函数)

在一个类中,任何不会修改数据成员的函数都应该声明为const类型。const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。

1
2
3
4
int count(void) const;
int count(void) const{
...
}

可以将这个const用于函数重载

1
2
3
4
int count(int x,int y) const;
int count(int x,int y);
count(1,2);
const count(1,2);

上述两个函数不冲突。

const作为函数形参

一般情况下能加const就加const可以避免一些奇怪的问题出现。

0%