🔥个人主页:胡萝卜3.0

📖个人专栏:  《C语言》、《数据结构》 、《C++干货分享》、LeetCode&牛客代码强化刷题

⭐️人生格言:不试试怎么知道自己行不行


🎥胡萝卜3.0🌸的简介:

前言:在前面的学习中,我们学习了前四个默认成员函数:构造函数、析构函数、拷贝构造、赋值运算符重载,这四个默认成员函数是很重要的,那么接下来,我们接着学习剩下的两个成员函数:const成员函数和取地址运算符重载。

目录

一、const成员函数

二、取地址运算符重载

2.1 普通取地址运算符重载

2.2 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,写到这里,类和对象(中)就结束了,类和对象(中)的内容是非常重要的,这里学习的内容是在为后面的学习做铺垫,所以需要勤敲代码复习!!!

更多推荐