闲谈
C++语音博大精深,一个关键字有多种不同的用法与用途,有时候看过就懂了,懂了就忘了,忘了就得搜索,搜索还得再看……。因此,在此记录const关键字,以备查看。
const
const 即constant 的意思,旨在告诉编译器不允许程序对其改动。下面枚举几种用法:
与类无关的const
1. 修饰变量
const int a = 10;
变量a的值是常量,不允许对其修改。 note:const变量(非类成员变量)要在定义的时候必须初始化,且之后不可更改。
2. 可代替宏
宏定义#define 无类型检查,新手容易出错,可用const 和constexpr 实现宏定义的功能,切带有类型检查,使用较安全,因此C++推荐使用。例如:
#define X 1 + 2
constexpr int Y = 1 + 2;
cout << "X * 3 = " << X * 3 << endl;
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;
int * const p2 = &a;
const int * const p3 = &a;
并且,const 修饰的底层指针 只能赋给const 底层指针,不能赋给非const 底层指针或const 顶层指针。原因很简单,因为const 底层指针不允许对其指向的内容改动,假如能赋给非const 底层指针,那么非const 底层指针就可以对其指向的内容修改,这就违背了const 底层指针的意愿。
5. 修饰参数传递
- pass by value,这种加不加const效果是一样的,因为pass by value传递的是实参的副本,无论函数中怎么对其修改,都不会影响原实参的值:
void fun(int a){
a += 10;
}
int main(){
int age = 5;
fun(age)
std::cout << age << std::endl;
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){}
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关键字几种用法与注意事项,希望能加深自己及读者记忆!
|