C++入门自学Day2-- c++类与对象(初识2)
一、c++类与对象
C++ 的类与对象是面向对象编程(OOP)的核心,类是“模板”,对象是“实例”,类的实例化 --> 就是用自己定义的类型定义出对象。
c++往期回顾
类与对象(初识)
c++基础知识
二、c++类与对象的核心-->“this 指针”
1、 什么是 this 指针?
在类的非静态成员函数内部,编译器会自动传入一个指向当前对象的指针,这个指针就叫 this。
class Date{public:void Init(int year,int month,int day){_year = year;_month = month;_day = day;}void Print(){cout<< _year<<"-"<<_month<<"-"<<_day<<endl;};private:int _year;int _month;int _day;};int main(){Date d1;d1.Init(2025,7,28);d1.Print();}
注意这里的我们定义的成员函数Print():
void Print(){cout<< _year<<"-"<<_month<<"-"<<_day<<endl; };//隐含了this 指针void Print(Date* this){cout<< this->_year<<"-"<<this->_month<<"-"<<this->_day<<endl; };
C++ 编译器实际上会把成员函数转成一个普通函数,并把 this 指针作为隐藏参数传进去。
因为这里的_year,_month,_day是由this->指针传入的。
那么同样的,另外一个定义的函数void Init()
void Init(int year,int month,int day){_year = year;_month = month;_day = day; } //等价于void Init(Date*this,int year,int month,int day){this->_year = year;this->_month = month;this->_day = day; }//隐含了this 指针
当你在主函数中调用这些函数,都隐含了this指针,编译器会自动处理。
int main(){Date d1;d1.Init(2025,7,28);d1.Print();}//等价于int main(){Date d1;d1.Init(&d1,2025,7,28);d1.Print(&d1);}//这里的&d1相当于传入的this指针变量。
【面试题分享】
1、this指针 存在哪里?进程地址空间的哪个区域?
this指针 是一个 局部变量,存储在栈帧(stack frame)中,属于函数调用时的局部参数。
一个典型 C++ 进程的地址空间结构如下(从低地址到高地址):
[代码段] Text Segment:存放程序指令(函数代码)
[数据段] Data Segment:全局/静态变量
[BSS段] 未初始化的全局/静态变量
[堆] Heap:动态内存分配(new、malloc)
[栈] Stack:局部变量、函数参数、返回地址等class MyClass { public:int x;void Show() {std::cout << "this: " << this << std::endl;} };int main() {MyClass obj;std::cout << "&obj: " << &obj << std::endl;obj.Show(); // this 是 &obj,存在于栈帧中//编译器背后等效于:Show(&obj); }
输出结果:
&obj: 0x16d06ec6c
this: 0x16d06ec6c
所有成员变量访问都隐含为:this->x
2、this指针可以为空吗?
技术上可以为空,但只要你访问它指向的成员(比如 this->x)就会崩溃(段错误)!
(野指针调用)
这里class MyClass { public:void Print() {// std::cout << "hello" << std::endl;std::cout << x <<endl;} private:int x; };int main() {MyClass* p = nullptr;p->Print(); // undefined behavior!但这可能运行成功!// 当print没有去访问成员变量时,当访问成员变量,段错误 }
如果 Print() 函数没有访问成员变量,它就像普通函数调用,不一定崩。
一旦访问成员变量,如:std::cout << x <<endl; 访问了成员变量x,野指针访问,程序崩溃。
总结!
场景
是否安全?
p == nullptr; p->func() 中函数不访问成员变量
可能没问题(但极不推荐)
函数内访问了 this->xxx
一定崩溃
C++20 之后
可用 [[nodiscard]] 或 if (this) 检查
问题
解答
this 存在哪?
函数调用的栈帧中(即栈空间)
this 可以为空吗?
技术上可以,但访问成员变量会导致崩溃