1. const作用
- 定义常量 (理解)
- 类型检查 const修饰的常量会被编译器进行类型是否匹配的检查
- 防止修改 在CFD计算中,坐标值不能被修改,所以采用const修饰的不在少数
- 可以节省空间,避免不必要的内存分配 (这个属于新学的)
const定义的常量在程序运行过程中仅仅只有一份拷贝,而#define的宏定义常量在内存中拷贝多份。我觉得能用const定义,就不同#define
2. const修饰的变量默认为局部变量
只要被const修饰的变量都是局部变量,不能在全局中使用。如果想要使用就必须使用extern关键字进行显示的修饰。
3. const定义常量注意的问题
定义变量后,变量变为常量,常量值不可再修改
使用const关键字后,变量必须初始化。除非是在一个文件中使用另一个文件中的const常量。
//file1.cpp
extern const i = 0;
//file2.cpp
extern const i;
int main(){std::cout<<i<<std::endl;}
4.指针与const
不得不说,这大佬总结的超到位
与指针相关的const有4种
const char * a;//指向常量的指针
char const * a;//指向常量的指针
char * const a;//常指针
const char * const a;//指向常量的常指针
大佬的理解:
如果const位于 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于 * 的右侧,const就是修饰指针本身,即指针本身是常量。
我的理解:
“ * ”号之前的东西都是修饰变量的;之后的东西都是修饰指针的。换句话说,出现 * 号后就要描述指针了
例如:const char * const a,* 号之前说 const char 修饰的是变量,变量是一个字符型常量; * 号之后说 const a 表明指针是名称为a的常量指针。
- 允许将非const对象的地址赋给指向const对像的指针,但不允许将const对象的地址赋值给指向非const对象的指针。
int p = 1;
const int * a =&p; //可以
const int i = 2;
int * a = &i; //错误
5.函数中的const
(1)const修饰返回值
const int func();//返回int类型值,不变
const int * func(); //返回指向int类型的指针,指向的内容不变
int * const func();//返回指向int类型的指针,指针本身不变
(2)const修饰传入函数内部的形参
void func(const int var);//传递过来的形参本身是不变的
void func(int * const var);//传递过来指向整型的指针是不变的
void func(const A & a);//引用传递的目的是为了增加效率,但对于非内部数据类型的参数很容易改变,所以一般用const'修饰,此函数需要传入类型为A的常量
大佬提出的面试问题,非常nice
- 如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针的不同位置有什么区别?
*不要,*号前修饰变量,*号后修饰指针 - 如果写的函数需要传入的参数是一个复杂类型(自定义类型),传入值参数与引用参数的区别,什么时候需要为传入的引用参数加上const?
引用传递不用复值高效,但原值容易发生更改,值传递需要复制。在使用传递复杂类型的值时
6. 类中使用const
类中用const修饰的成员函数,成为常成员函数
例如
const className;//const对象
class Apple
{
public:
const int apple_number;//常成员变量
void take(int num) const;//常成员函数
};
-
const成员变量一般是通过初始化列表进行初始化
也可以通过static关键字声明,在类定义外部初始化
c++11也支持直接初始化 -
const对象只能访问const成员函数;
-
const成员函数只能访问const成员函数
-
而非const对象可以访问任意的成员函数,包括const成员函数