const修饰函数、返回值、参数(2.24)

参考来源:https://blog.csdn.net/youoran/article/details/8517611#
在学习过程中,我了解到const修饰变量只是很简单的一种应用,实际开发过程中const广泛的用来修饰函数。
const修饰函数主要有三种情况:

int& fun(const A &a); //修饰形参 
const int& fun(A &a); //修饰返回值 
int& fun(A &a) const{} //const成员函数

一、const修饰形参
const修饰形参通常用于输入参数,对于输入参数函数只是利用这个参数来实现一些操作,是不能更改的。
一般用在向函数内部传指针。如strcpy(const char *src,char *desc),这里src就是输入型参数,desc就是输出型参数。
详情在(C++输入型参数与输出型参数)
那么就有一个问题,输入类型参数有两种,除了const修饰的指针型参数外,还有传入的普通类型,那么普通类型需要用const修饰以防被更改吗?
不用。这涉及到了形参变量其本质的问题。形参列表接收一个变量,是会在函数里面产生一个临时变量来存储它的。也就是说普通变量在函数里面的修改根本不会影响外面的值,除非作为返回值返回并且在外部接收。
这样就又涉及到另外一个问题,在向函数内部传自己的自定义类的时候,怎么传才效率更高?
void Func(A a)? 或者void Func(A &a)?
因为上面说了形参在接收的时候是会创建一个临时变量的,那么对于传递的自定义类,他会new一个对象出来,这个对象调用构造函数构造,而在函数结束时还要调用析构函数析构,这样带来的开销就非常大了。
这里面有一个很容易忽略的点:string。string本身就不是基本的数据类型,而是语言封装好的工具类。如果需要传string的时候比如 strcpy(string a,string b),就会经历构造、析构等。而实际上这种开销不是必要的,我们只需要用string &a来给他绑定一个别名就好了。
但是这样引用传递又会导致另一个问题:我们把外部的数据地址给了函数,如果函数对其修改,而我们不希望它修改时怎么办?
这时候就需要在引用前面+const。 即 void Func(const A &a)。这样既能节省不必要的开销,又能让我们放心的将数据交给函数。

二、const修饰返回值
我一直有一个疑问,const修饰返回值有什么意义呢?函数通过return来返回处理好的值,而外部调用函数的时候需要用另一个空间来接收它,那么我直接外部const不就行了吗?
比如

int add(int a,int b){
return a + b;
}
const int c =  add( a,b)

经过学习后,我了解到,在值传递的过程种,将返回值的属性指定为const确实是没有任何意义的。只有在返回值是指针类型的时候,才会用到const。
而这种用法是 声明一个返回值为const char * 的函数,那么返回的时候也必须用const char*去接。
image.png
但是对于非const 的返回值就没有这种要求:
image.png
三、const修饰成员函数
与const修饰返回的指针目的一样,const修饰成员函数的目的也是为了提高程序的健壮性。
const修饰成员函数的用法是 int Stack : : getCount() const { }。
其意义是表明const 成员函数不会修改类的成员变量,而一旦在成员函数中对于类的成员变量进行了修改,那么编译器就会报错。所以全部的不修改成员变量的函数都应该用const进行修饰。
而const成员函数只能调用const成员函数,对于非const函数,即使在函数内部没有修改成员变量,也不能被const函数所调用。这可能导致的问题是,有些工具的函数并不是const的,所以在调用的时候或i进行报错。

class Test
{
public :
int & GetValue()const;
private:
int value;
};
int &Test::GetValue() const
{
return value; //value此时具有const属性,与返回值类型int &的非const属性不匹配
}

image.png
以上,对于类的成员变量的修改,即使不是修改值,而是将成员变量从一个int型变为一个地址,这样也是一种对于成员变量的改变。而在const修饰的函数中,对于成员变量是给予了const属性的。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值