当前位置: 首页 > 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.dtcms.com/a/303606.html

相关文章:

  • 一文理清 Linux 软件管理核心知识:从程序组成到包管理工具
  • C语言中的数据结构--栈和队列(2)
  • VMware Workstation Pro 详细安装步骤
  • 线程安全
  • C++常见的仿函数,预定义函数,functor,二元操作函数(对vector操作,加减乘除取余位运算等 )
  • 异步通讯组件MQ
  • HTML应用指南:利用GET请求获取全国小米之家门店位置信息
  • 基于深度学习的医学图像分析:使用3D CNN实现肿瘤检测
  • hot100——第九周
  • 在Linux上使用DuckCP实现从csv文件汇总数据到SQLite数据库的表
  • 数据开源 | “白虎”数据集首批开源,迈出百万数据征途第一步
  • Zynq SOC FPGA嵌入式裸机设计和开发教程自学笔记:硬件编程原理、基于SDK库函数编程、软件固化
  • 2.DRF 序列化器-Serializer
  • 第五章:进入Redis的Hash核心
  • 小架构step系列28:自定义校验注解
  • 【算法训练营Day17】二叉树part7
  • 【VASP】二维材料杨氏模量与泊松比的公式
  • OpenLayers 综合案例-信息窗体-弹窗
  • 打卡day5
  • C++面试5题--5day
  • C++中的“对象切片“:一场被截断的继承之痛
  • 【SpringMVC】MVC中Controller的配置 、RestFul的使用、页面重定向和转发
  • rhel9.1配置本地源并设置开机自动挂载(适用于物理光驱的场景)
  • c++ 基础
  • windows内核研究(异常-CPU异常记录)
  • 嵌入式分享合集186
  • STM32时钟源
  • JavaScript手录09-内置对象【String对象】
  • 第一章:Go语言基础入门之函数
  • wrk 压力测试工具使用教程