在C语言中,定义一个日期类型的结构体,并给出设置和打印的方法
函数setDate和printDate中,第一个参数是一个结构体类型的指针,用来接收结构体类型变量的地址,通过这个参数就知道要调用这个方法给哪个变量来设置值或是打印。
#include<stdio.h>
struct Date {
int year;
int month;
int day;
};
void setDate(struct Date* p,int year, int month, int day) {
p->year = year;
p->month = month;
p->day = day;
}
void printDate(struct Date* p, int year, int month, int day) {
printf("%d.%d.%d", p->year ,p->month ,p->day );
printf("\n");
}
void main() {
struct Date p1,p2,p3;
setDate(&p1, 2020, 4, 13);
setDate(&p2, 2021, 5, 20);
setDate(&p3, 2032, 10, 1);
printDate(&p1, p1.year, p1.month, p1.day);
printDate(&p2, p2.year, p2.month, p2.day);
printDate(&p3, p3.year, p3.month, p3.day);
}
在C++中定义一个简单的日期类
#include<iostream>
using namespace std;
class Date {
public:
void setDate(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
void printDate(int year, int month, int day) {
cout << year << "." << month << "." << day << endl;
}
void thisTest(...) {
Date* const& rthis = this;
cout << this << endl;
cout << &rthis << endl;
}
private:
int _year;
int _month;
int _day;
};
int main() {
Date p1,p2,p3;
p1.setDate(2020, 5, 10);
cout << &p1 << endl;
p1.thisTest();
}
类中的两个方法并没有给出关于调用对象的标记,因为在内部C++编译器给每个成员函数增加了一个隐藏的指针参数,该指针指向调用该函数的对象,并通过指针去访问对象的成员变量。这个参数叫做this指针。
this指针的类型是 类类型*const ,只能在成员函数的内部使用,其本质是成员函数的一个形参,当对象调用成员函数时,将对象地址作为实参传递给形参。由编译器通过ecx寄存器自动传递。
写个方法看一下他们的地址
第一个是p1的地址,就是p1对象中第一个成员的地址。第二个是this指针指向的地址,两个的值相同,可以印证this指针的指向。第三个是this指针自身的地址。this指针在栈上。
this指针的值
在主函数中进行如下的操作,
Date p1;
Date* p = &p1;
p->setDate(2020, 5, 10);
p->printDate();
p = nullptr;
p->thisTest();
打印出来的this指针是空值
所以this指针是有可能为空的,总结一下,this指针的存在是为了区分当前成员函数内部访问的成员变量是属于哪个对象的。this指针如果为空了,后续程序如果调用需要访问成员变量的函数就会发生崩溃,如果当前的方法不访问任何成员变量,那程序不会崩溃。