当前位置: 首页 > news >正文

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 可以为空吗?

技术上可以,但访问成员变量会导致崩溃

http://www.lryc.cn/news/602798.html

相关文章:

  • Deepseek + browser-use 轻松实现浏览器自动化
  • “本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止”解决方式
  • Linux系统之Ansible安装与入门
  • Word VBA快速制作试卷(2/2)
  • STM32——寄存器映射
  • 安宝特新闻丨安宝特与Logivations正式建立合作伙伴关系,共筑物流新未来
  • AI应用—C++在AI中的应用
  • 1.DRF 环境安装与配置
  • 《C++继承详解:从入门到理解公有、私有与保护继承》
  • Ansible+Shell框架中,如何管理敏感信息
  • [蓝牙通信] NimBLE init启动 | 时间抽象-转换
  • C语言基础第15天:从数组指针到指针函数
  • 快速构建基于React.js的用户注册与登录的Web应用程序
  • 图像识别边缘算法
  • 数学建模算法-day[13]
  • QGIS基于规则的道路分级制图及Leaflet集成展示实例
  • Polkadot 的 Web3 哲学:从乔布斯到 Gavin Wood 的数字自由传承
  • 开始记录一步步学习pcl
  • Go语言-->变量
  • DBAPI 实现分页查询的两种方法
  • 若依【(前后端分离版)SpringBoot+Vue3】
  • JVM 笔记:类加载、内存管理、垃圾收集与垃圾收集器
  • JVM 垃圾回收机制全景解析:从对象回收到收集算法
  • C++---初始化列表(initializer_list)
  • Flutter在购物场景中BLoC的应用
  • shell每日三题大神之路:第三天
  • 轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
  • AR眼镜:工业4.0时代高风险作业的安全守护者
  • 深度思考和搜索研究 最新的GSPO强化学习算法
  • 解决 xshell 无法连接win10 、win11的linux子系统