C++:const 关键字


闲谈

C++语言博大精深,一个关键字有多种不同的用法与用途,有时候看过就懂了,懂了就忘了,忘了就得搜索,搜索还得再看……。因此,在此记录const关键字,以备查看。


const

constconstant的意思,旨在告诉编译器不允许程序对其改动。下面枚举几种用法:

与类无关的const

1. 修饰变量

const int a = 10;

变量a的值是常量,不允许对其修改。
note:const变量(非类成员变量)要在定义的时候必须初始化,且之后不可更改。

2. 可代替宏

宏定义#define无类型检查,新手容易出错,可用constconstexpr实现宏定义的功能,切带有类型检查,使用较安全,因此C++推荐使用。例如:

#define X 1 + 2
constexpr int Y = 1 + 2;
// X * 3 = 7,也就是1+2*3=1+6=7
cout << "X * 3 = " << X * 3 << endl;
// Y * 3 = 9,也就是(1+2)*3=9
cout << "Y * 3 = " << Y * 3 << endl;

如果不太了解#define可能会觉得X*3应该等于9,但其实等于7,使用const可以避免。

3. 指定数组长度

在C++中可以用const类型变量声明一个数组的具体的长度,但要注意C语言不行:

const int len = 10;
char ch[len];

4. 修饰指针

修饰指针有分顶层const底层const,如下:

int a = 10;
const int *p1  = &a;		// 底层const,不允许对指针p1指向的内容修改,指针可移动。
int * const p2 = &a;		// 顶层const,不允许指针移动,但可以修改指针p2指向的内容。
const int * const p3 = &a;  // 不允许修改指针指向的内容,同时不允许指针移动。

并且,const 修饰的底层指针 只能赋给const底层指针,不能赋给非const底层指针或const顶层指针。原因很简单,因为const底层指针不允许对其指向的内容改动,假如能赋给非const底层指针,那么非const底层指针就可以对其指向的内容修改,这就违背了const底层指针的意愿。

5. 修饰参数传递

  • pass by value,这种加不加const效果是一样的,因为pass by value传递的是实参的副本,无论函数中怎么对其修改,都不会影响原实参的值:
// 对传入参数的副本加10,在赋给该副本,并没有影响实参。
void fun(int a){
    
    
	a += 10;
}

int main(){
    
    
	int age = 5;
		fun(age)
	//这里age还是等于5,加不加const效果一样,所以没必要加const
	std::cout << age << std::endl; // 5
	return 0;
}
  • pass by pointer,指针传递,表示不允许对指针指向的内容修改,实参要传入某变量的地址;
  • pass by reference,不能对引用的变量修改,可以提高参数传递的效率:void fun(const T& a);如果传入参数临时对象的构造浪费时间,这将会是一个不错的选择。

与类相关的const

1. cosnt类对象

const修饰类对象,意味着该对象只能调用const成员函数,且不能对该对象的成员变量进行任何改动。而非const类对象可调用const与非const成员函数。
note:构造函数和析构函数不能声明为const

2. const成员函数

const成员函数,const出现的位置在参数列表后,函数体前,且const关键字在声明时和定义时中都必须加上。

class Date{
    
    
private:
	int year_;
	const int month_;
	static const int num_ = 30;
public:
	Data(int year) : year_(year){
    
    } // const 成员变量可在构造函数中初始化
	int GetYear() const;
	int GetMonth() const {
    
    
		return month_
	}
};

void Data::GetYear() const {
    
    
	return year_;
}
  • const成员函数表示该函数为只读,不能对非static成员变量做任何修改,也不能调用非const成员函数。
  • 类的const成员变量可在定义时是直接赋初值,也可在构造函数的初始化列表中初始化,不可再函数体中赋值
  • static const 成员变量也可在类内直接定义,如上述的static const int num_ = 30;

总结

本文记录了const关键字几种用法与注意事项,希望能加深自己及读者记忆!

猜你喜欢

转载自blog.csdn.net/weixin_42286660/article/details/125756987
今日推荐