C++干货:const成员函数与取地址重载详解

🔥个人主页:胡萝卜3.0
📖个人专栏: 《C语言》、《数据结构》 、《C++干货分享》、LeetCode&牛客代码强化刷题
⭐️人生格言:不试试怎么知道自己行不行
🎥胡萝卜3.0🌸的简介:


前言:在前面的学习中,我们学习了前四个默认成员函数:构造函数、析构函数、拷贝构造、赋值运算符重载,这四个默认成员函数是很重要的,那么接下来,我们接着学习剩下的两个成员函数:const成员函数和取地址运算符重载。
目录
一、const成员函数
将const修饰的成员函数称之为const成员函数。
我们先来看一段前面写过的日期类的代码:

ok啊,如果我们按照上图红方框内的写法是没有任何问题的,但是如果我们在Date的前面加上const呢?那还是对的吗?

那为什么会报错呢?它说不能将“this”指针从“const Date”转换成“Date &”,这好像是在说权限的放大?那这是权限的放大吗?
在前面的学习中,我们知道this指针默认的类型是Date*,准确来说是:Date* const this.
那既然是这样的话,那我们是不是就知道为什么会报错了:

我们知道,权限是可以缩小,平移,但是权限不可以放大!!!那我们应该怎么修改呢?
我们要在成员函数中加上const,const修饰成员函数放到成员函数参数列表的后面。
也就是这样:
const 修饰的是*this ,也就是this指针指向的内容,成员函数中不能修改this指针指向的内容。
注意:如果声明和定义分离,都要加上const!!!

这里有个问题:我们知道const修饰的对象可以调用const修饰的成员函数,那普通对象可以调用const修饰的成员函数吗?
其实是可以的,普通对象可以使用const修饰的成员函数。

原因:普通对象调用被const修饰的成员函数是权限的缩小!!!
ok,所以说被const修饰的成员函数可以被const对象掉调用,也可以被普通对象调用。
那既然这样的话,我们可不可以在成员函数上都加上const?不可以,加了const,成员函数就无法修改成员变量了,如果该成员函数中不需要修改成员变量,应该都加上const。
注意:
构造函数中不加const
那这是就有UU想问了,那构造怎么初始化const Date d呢?如何调用构造函数呢?
其实const 修饰对象,早初始化时做了特殊的处理,可以认为const修饰的对象在初始化时无const 属性,在初始化之后就有了const 属性,析构、拷贝构造、赋值重载也不需要。
总结:不需要修改成员变量的成员函数都应该加上const,加上const,普通对象和const修饰的都可以调用。
注意:const可以修饰成员函数,但是不可以修饰普通函数
原因:const修饰的this指针,普通函数没有this指针
二、取地址运算符重载
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。
2.1 普通取地址运算符重载
Date* operator&()
{
return this;
}
2.2 const取地址运算符重载
const Date* operator&()const
{
return this;
}
以上两种取地址运算符重载很简单,库里面有,不需要我们自己显示写,编译器自动生成的就可以了。
这时候就有UU想问了,为什么这里会有两种取地址运算符的代码呢?
这是因为对象可以是const对象,也可以是普通对象,不同的对象的地址返回值不同, const对象:const Date* ;普通对象是:Date*

总结:平时默认生成的就可以,不需要自己显示写!!!
ok,写到这里,类和对象(中)就结束了,类和对象(中)的内容是非常重要的,这里学习的内容是在为后面的学习做铺垫,所以需要勤敲代码复习!!!
更多推荐


所有评论(0)