详解C++ 中的 const 关键字(详细讲类中的成员函数使用const)

1 篇文章 0 订阅

​​​目录

前言

一、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是什么?为什么用const?

       const是C/C++中的类型修饰符,用于使所修饰数据类型变为常量。

       const的使用会提供很多便利:

        1.定义const常量,此时编译器通常不为const常量分配存储空间,使得它成为一个编译期间的常量,使得效率得到提高;(对此方面,本文不做具体阐述)

        2.保护被修饰的数据,防止被意外的修改,增强程序的健壮性。

二、如何使用const

1.定义const变量

        任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。

    const double e = 2.71828182845905;
    const char msg[] = "warning: ";

2.const修饰指针

        (1) 指针本身是常量不可指向的
             int* const ptr;
        (2) 指针所指向的内容是常量不可变
             const int *ptr;或者 int const *ptr;
        (3) 两者都不可变
              const int* const ptr;

        (4) 因此可以这样判断:
                const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
                const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

3.函数中使用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()看作成一个变量,即指针本身不可变

4.类中使用const(本文重点)

首先我们创建一个类

#include <iostream>
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<<a.getData()<<" "<<b.getData()<<" "<<c.getData()<<endl;
    //输出: 1 2 3
 
	a=b+c;
 
	cout<<"计算结果:"<<endl;
	cout<<a.getData()<<" "<<b.getData()<<" "<<c.getData()<<endl;
    //结果为:5 2 3
 
	return 0;
}

让我们一个一个说,揭开const的面纱!

(1)const修饰返回值

如前所述,这样做主要为了返回值不可作为左值,从而使其被修改

        将第一个const去掉后我们再把a=b+c改为a+b=c。

        按理来说a+b=c是不该被使用的,但此时不仅程序成功运行了,还输出了这样的结果:

1 2 3
计算结果:
1 2 3

所以,这里的const可以说是为了返回值不可作为左值而存在。

(2)const修饰参数

如前所述,这样做主要为了使传入的参数不被修改

a=b+c是想要得到b+c的结果,因而我们不希望c的值发生改变。

const修饰之后使得程序效率提高,且增强其健壮性,防止数据被意外的修改

(3)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使其成为常成员函数,可以避免发生这样的情况。

(4)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"<<endl;
        return data[i];
    }

    const int& operator[](int i) const{ //cout<<"const"<<endl;
        return data[i];
    }

    friend ostream& operator<<(ostream& os, const Array& a){
        for (size_t i = 0; i < a.len; i++)
            os<<a[i]<<" ";  //a[i]调用const int& operator[](int i) const
        return os;
    }

    friend istream& operator>>(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<<a<<endl;
    a[4] = 30;  //a[i]调用int& operator[](int i) 放在=的左边
    cout<<a[4]; //a[i]调用const int& operator[](int i) const放在运算符<<的右边
    return 0;
}

这里有一种情况,即const对象只能调用const成员函数时的使用。(即此时的cout输出)

const对象有如下规则

        const类对象表示该对象为常量对象,其中的任何成员都不能被修改。

        const对象对该类的任何非const成员函数都不能调用,因为任何非const成员函数均会有修改成员变量的企图。

        const成员函数能够访问对象的const成员,而其他成员函数不可以。

 


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了const的使用,主要是对类中使用const进行具体的说明。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值