C++中const的注意内容

文章详细介绍了C++中const关键字的用法,包括定义常量、修饰局部变量、与指针的结合使用、在函数参数和返回值中的应用,以及在类中的常成员函数和常成员变量。强调了const用于类型检查、防止修改和提高效率的作用,并指出const与#define的区别。同时,提到了const指针和常量指针的四种形式,以及const在函数参数中的注意事项。
摘要由CSDN通过智能技术生成

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 = 2int * 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成员函数

参考大佬的github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值