const的使用有以下四种情况:
- const int* p
- int const *p
- int* const p
- const int* const p
我们可以通过以下图解来理解这四种情况const到底修饰的是谁:
- 当const在 “ * ” 的左边,则指向的值不能被修改
- 当const在 “ * ” 的右边,则自身不能被修改
观察如下代码,我们会发现,Date类中有Display和SetDate两个成员函数,函数体中没有关于不同对象的区分,那么当d1调用SetDate函数时,该函数是如何知道应该设置d1对象,还是设置d2对象呢?
#include<iostream>
using namespace std;
class Date
{
public:
void DisPlay()
{
cout << _year <<"_"<< _month <<"_"<< _day << endl;
}
void SetDate(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1, d2;
d1.SetDate(2018, 12, 15);
d2.SetDate(2021, 4, 8);
d1.DisPlay();
d2.DisPlay();
return 0;
}
为了解决上述问题,C++中引入了this指针
C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(谁调用此函数,谁就是当前对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
- this指针的类型:类的类型* const
- 只能在”成员函数“的内部使用
this指针本质上其实是一个成员函数的形参
,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针
this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
this指针代表了当前对象的地址
,一般情况是隐藏的
验证一:
此处为什么会报错呢?因为this指针一般是由编译器通过ecx寄存器自动传递的,不需要用户传递,而用户写入this指针相当于完成了编译器的工作,所以会报错
验证二:
哪种情况需要我们写入this指针呢?
如上图所示,我们会发现情况一,如果不使用this指针,相当于将自己赋值给自己,和私有属性中的_year,_month,_day没有关系,这样写没办法区分哪个私有属性中的哪个是参数中的,所以,只需向情况二一样,在私有成员前加是this指针即可
编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的相关首地址存放在寄存器ECX中(VC++编译器是放在ECX中,其他编译器有可能不同)。也就是成员函数的其他参数正常都是存放在栈中,而this指针参数存放在寄存器中
当我们调用函数时,如果函数内部不需要使用到this指针,也就是不需要通过this指针指向当前对象并对其进行操作时,this指针可以为空(eg:在函数中什么都不放,或者随便打印一个字符串);如果调用的函数需要this指针指向当前对象,并进行操作时,this指针不能为空,否则就会发生错误(空指针引用)
在一个普通成员函数后面加上const修饰,就是常成员函数
- 常方法可以访问对象中的常成员,也可以访问普通成员
- 常方法不允许修改任何数据数据的值
意义:可以防止程序员不下心修改了成员变量的值
2月23日消息 据外媒 Windows Latest 今日报道,借助 Windows 10 Sun Valley 更新...
橡皮擦一个逗趣的互联网高级网虫。 观前提醒本篇文章涉及知识点巨大建议先收藏再...
Greediness(贪婪型):最大匹配 X、X*、X+、X{n,} 是最大匹配。例如你要用 “....
3月22日消息 外媒 Winfuture 报道,此前微软面向 Insider 预览用户公布了 Window...
这些日子一直在简书上使用markdown写作,已经渐渐的痴迷于这种简洁纯粹的写作方...
1 . 目标 演示下图的git reset 各选项的效果。 2. Git Reset操作说明 图中说明:...
Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可...
从另一台机器上复制过来的项目,由于两台机器的库目录不一致,导致了stdio.h等很...
本文实例讲述了正则表达式中的操作符及说明。分享给大家供大家参考,具体如下: ...
ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里...