目录
前言
一、const是什么?为什么用const?
二、如何使用const
1.定义const变量
2.const修饰指针
3.函数中使用const
4.类中使用const(本文重点)
(1)const修饰返回值
(2)const修饰参数
(3)const成员函数
(4)const修饰返回值为引用(很少见)
总结
前言
我在学C语言时,便见识过const关键字,却因为使用场景有限而不曾重视。最近随着对C和C++的不断学习,终于加深了对const的理解。今天我想详细讲讲const,加深印象,也是作为总结,以便以后查阅。(本人为初学者,如有错误,望指正!)
const是C/C++中的类型修饰符,用于使所修饰数据类型变为常量。
const的使用会提供很多便利:
1.定义const常量,此时编译器通常不为const常量分配存储空间,使得它成为一个编译期间的常量,使得效率得到提高;(对此方面,本文不做具体阐述)
2.保护被修饰的数据,防止被意外的修改,增强程序的健壮性。
任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。
const double e = 2.71828182845905;
const char msg[] = "warning: ";
(1) 指针本身是常量不可指向的
int* const ptr;
(2) 指针所指向的内容是常量不可变
const int *ptr;或者 int const *ptr;
(3) 两者都不可变
const int* const ptr;
(4) 因此可以这样判断:
const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
(1)const修饰函数参数
以下为具有C风格的代码,不难发现fun1和fun2都是无意义的。
void fun1(const int var);//var本身作为形参,就不会被修改
void fun2(const int *var);//var所指的数据只读不会被改变
void fun3(int *const var );//无意义,int *var作为形参
在C++中函数参数为引用时,const的作用得以体现:
void fun4(const int &var);//引用参数在函数内为常量不可变
void fun5(const Class &var);//引用参数为类在函数内为常量不可变
其中fun5在类的成员函数亦或友元函数中有极大作用。
(2)const 修饰函数返回值
const修饰函数返回值并不常见,往往返回值会作为常量。往往只有在返回值需要不可作为左值时使用const修饰函数返回值。它的含义和const修饰普通变量以及指针的含义基本相同。
const int fun1() //参数返回本身就是赋值,无意义
const int * fun2() //把fun2()看作成一个变量,指针所指内容不可变
int* const fun3() //把fun3()看作成一个变量,即指针本身不可变
首先我们创建一个类
#include
using namespace std;
class Int
{
public:
Int()
{
m_data=0;
}
Int(int data)
{
m_data=data;
}
~Int(){ }
int getData() const
{
return m_data;
}
const Int operator + (const Int & l) const //连用3个const,是不是很复杂?
{
return m_data + l.m_data;
}
private:
int m_data;
};
在这个Int类里,最为瞩目的当属这段代码了:
const Int operator + (const Int & l) const
{
return m_data + l.m_data;
}
我们使用以下代码测试:
int main()
{
Int a(1);
Int b(2);
Int c(3);
cout<
让我们一个一个说,揭开const的面纱!
将第一个const去掉后我们再把a=b+c改为a+b=c。
按理来说a+b=c是不该被使用的,但此时不仅程序成功运行了,还输出了这样的结果:
1 2 3
计算结果:
1 2 3
所以,这里的const可以说是为了返回值不可作为左值而存在。
a=b+c是想要得到b+c的结果,因而我们不希望c的值发生改变。
const修饰之后使得程序效率提高,且增强其健壮性,防止数据被意外的修改
常成员函数, 它不改变对象的成员变量。
即:它不修改this所指对象
const Int operator + (const Int & l)
{
m_data += l.m_data;
return *this;
}
若不加const,即有可能出现这样的代码,结果如下:
1 2 3
计算结果:
5 5 3
不难发现,b的值也变为5。显然这不是我们想要的结果。因此,在函数后加const使其成为常成员函数,可以避免发生这样的情况。
class Array {
private:
int len;
int* data;
public:
Array(int len):len(len),data(new int[len]){ }
~Array(){ delete[] data; }
Array(const Array& a):len(a.len),data(new int[a.len]){
std::copy(a.data, a.data+len, data);
}
int& operator[](int i){ //cout<<"here"<>(istream& is, Array& a){
for (size_t i = 0; i < a.len; i++)
is>>a[i]; //a[i]调用int& operator[](int i)
return is;
}
};
int main(){
Array a(10);
cin>>a;
cout<
这里有一种情况,即const对象只能调用const成员函数时的使用。(即此时的cout输出)
const对象有如下规则
const类对象表示该对象为常量对象,其中的任何成员都不能被修改。
const对象对该类的任何非const成员函数都不能调用,因为任何非const成员函数均会有修改成员变量的企图。
const成员函数能够访问对象的const成员,而其他成员函数不可以。
以上就是今天要讲的内容,本文仅仅简单介绍了const的使用,主要是对类中使用const进行具体的说明。