C++:this指针详解

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

目录

一、this指针

 二、C++和C语言实现Stack对比


一、this指针

• Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这里就要看到C++给了一个隐含的this指针解决这里的问题

• 编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针,比如Date类的Init的真实原型为, void Init(Date* const this, int year, int month, int day)

• 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this- >_year = year;

• C++规定不能在实参和形参的位置显示的写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;
};

运行下面两串代码,会发现两个代码虽然只差了一行代码,结果却差别很大

#include<iostream>
using namespace std;
class A
{
public:
 void Print()
 {
 cout << "A::Print()" << endl;
 }
private:
 int _a;
};
int main()
{
 A* p = nullptr;
 p->Print();
 return 0;
}
#include<iostream>
using namespace std;
class A
{
public:
 void Print()
 {
 cout << "A::Print()" << endl;
 cout << _a << endl;
 }
private:
 int _a;
};
int main()
{
 A* p = nullptr;
 p->Print();
 return 0;
}

     这里先说结果,第一串代码能正常运行,第二串代码会运行崩溃,第一串代码在调用了p->Print时这个函数,但是并没有对p这个空指针进行解引用,所以第一串代码能够正常运行,而第二串代码,再调用print函数之后,里面的_a实际是this->_a,对p进行了解引用,而p是空指针,而对于空指针的访问只有在运行时才会发生,编译器在编译阶段不会发现,所以不会程序报错,会在运行时崩溃。

     在C++中,this指针是一个隐含的指向当前对象的指针,它不是由程序员分配的,而是编译器自动创建并插入到每个成员函数的隐式参数列表中的,this指针位于函数调用帧的局部变量区,通常称为栈空间,用于存储函数执行时需要的临时数据和指向自身对象的数据,当函数被调用时,this 指针会被初始化为指向调用它的对象实例,这对于访问类的私有成员变量特别有,this 永远不会为空,除非是在静态成员函数或者非成员函数中,这时没有特定的对象关联。

 二、C++和C语言实现Stack对比

    面向对象三大特性:封装、继承、多态,下面的对比我们可以初步了解⼀下封装,通过下面两份代码对比,我们发现C++实现Stack形态上还是发生了挺多的变化,底层和逻辑上没啥变 化。

C实现stack代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack
{
 STDataType* a;
 int top;
 int capacity;
}ST;
void STInit(ST* ps)
{
 assert(ps);
 ps->a = NULL;
 ps->top = 0;
 ps->capacity = 0;
}
void STDestroy(ST* ps)
{
 assert(ps);
 free(ps->a);
 ps->a = NULL;
 ps->top = ps->capacity = 0;
}
void STPush(ST* ps, STDataType x)
{
 assert(ps);
if (ps->top == ps->capacity)
 {
 int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
 STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * 
sizeof(STDataType));
 if (tmp == NULL)
 {
 perror("realloc fail");
 return;
 }
 ps->a = tmp;
 ps->capacity = newcapacity;
 }
 ps->a[ps->top] = x;
 ps->top++;
}
bool STEmpty(ST* ps)
{
 assert(ps);
 return ps->top == 0;
}
void STPop(ST* ps)
{
 assert(ps);
 assert(!STEmpty(ps));
 ps->top--;
}
STDataType STTop(ST* ps)
{
 assert(ps);
 assert(!STEmpty(ps));
 return ps->a[ps->top - 1];
}
int STSize(ST* ps)
{
 assert(ps);
return ps->top;
}
int main()
{
 ST s;
 STInit(&s);
 STPush(&s, 1);
 STPush(&s, 2);
 STPush(&s, 3);
 STPush(&s, 4);
 while (!STEmpty(&s))
 {
 printf("%d\n", STTop(&s));
 STPop(&s);
 }
 STDestroy(&s);
 return 0;
}

C++实现stack代码

#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:
 // 成员函数 
 void Init(int n = 4)
 {
 _a = (STDataType*)malloc(sizeof(STDataType) * n);
 if (nullptr == _a)
 {
 perror("malloc申请空间失败");
 return;
 }
 _capacity = n;
 _top = 0;
 }
void Push(STDataType x)
 {
 if (_top == _capacity)
 {
 int newcapacity = _capacity * 2;
 STDataType* tmp = (STDataType*)realloc(_a, newcapacity * 
sizeof(STDataType));
 if (tmp == NULL)
 {
 perror("realloc fail");
 return;
 }
 _a = tmp;
 _capacity = newcapacity;
 }
 _a[_top++] = x;
 }
 void Pop()
 {
 assert(_top > 0);
 --_top;
 }
 bool Empty()
 {
 return _top == 0;
 }
 int Top()
 {
 assert(_top > 0);
 return _a[_top - 1];
 }
 void Destroy()
 {
 free(_a);
 _a = nullptr;
 _top = _capacity = 0;
 }
private:
// 成员变量 
 STDataType* _a;
 size_t _capacity;
 size_t _top;
};
int main()
{
 Stack s;
 s.Init();
 s.Push(1);
 s.Push(2);
 s.Push(3);
 s.Push(4);
 while (!s.Empty())
 {
 printf("%d\n", s.Top());
 s.Pop();
 }
 s.Destroy();
 return 0;
}

• C++中数据和函数都放到了类里面,通过访问限定符进行了限制,不能再随意通过对象直接修改数据,这是C++封装的一种体现,这个是最重要的变化,这里的封装的本质是一种更严格规范的管 理,避免出现乱访问修改的问题,当然封装不仅仅是这样的,我们后面还需要不断的去学习。

• C++中有一些相对方便的语法,比如 Init 给的缺省参数会方便很多,成员函数每次不需要传对象地 址,因为this指针隐含的传递了,方便了很多,使用类型不再需要typedef用类名就很方便。


      本篇关于this指针的内容就到这里了,希望对各位有帮助,如果有错误欢迎各位指出。

【深度解析C++this指针 一、为什么需要this指针this指针C++当中用于指向当前对象的指针,它是成员函数内的一个隐式参数,指向调用该成员函数的对象的内存地址(this指针存放的内容就是对象的内存地址),this指针的主要用途是在成员函数内部访问对象的成员变量和调用其他的成员函数。在类的成员函数当中,如果存在与类的成员变量同名的局部变量或者函数参数,编译器可能无法区分它们,这个时候我们就需要使用this指针可以明确地指出成员变量属于当前对象。 阅读详情

相关推荐

c++中的this的作用及使用方法

本文介绍了c++this的作用及使用方法

chen_znn的博客 1947

c++this指针的用法详解

为什么引入this指针?     最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。 1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this...

程小二的博客 3万+

C++中的`this`指针详解

当一个非静态成员函数被调用时,编译器在幕后传递了一个隐藏的参数给函数,这个参数就是this指针this指针包含了被调用的对象的地址。public:std::cout << "MyClass的地址是: " << this << std::endl;在上面的例子中,当Display()函数被调用时,this指向调用它的MyClass对象。this指针C++中的一个重要概念,它提供了一个指向调用成员函数的对象的指针this指针的作用多样,能够简化代码,提高可读性和维护性。了解this

小灰灰的博客 1615

c++中的this

c++中的this一、c++中为何要有this二、this定义说明三、this总结 一、c++中为何要有this 1、先来看一个例子 #include "stdafx.h" #include <iostream> using namespace std; class Student{ private: char *m_name; int m_age; float m_score; public: void setage(int m_age); //声明构造函数 Student(cha

junxuezheng的博客 2万+

C++关键字—this

C++关键字—this一、this是什么二、this可以用在哪三、this可以用来做什么四、示例代码 一、this是什么 thisC++ 中的一个关键字 this是一个 const 指针 this 指针是所有成员函数的隐含参数 二、this可以用在哪 this 只能用在类的内部 this可用于调用类的成员函数和成员变量 三、this可以用来做什么 它指向当前对象,通过它可以访问当前对象的所有成员(包括 private、protected、public 属性的成员) 友元函数没有 this

LiuXF93的博客 6495

C++this 指针详解:从底层原理到实际应用

this本质是一个隐含参数:编译器将this作为成员函数的第一个参数传入,类型为(const 成员函数中为const它指向当前正在操作的对象。核心作用在成员函数中访问对象的所有成员(包括私有成员)区分同名的成员变量和局部变量/参数返回对象自身的引用(*this),实现链式调用通过比较this指针检测自赋值重要限制this本身不可修改(不能改变指向)静态成员函数中没有this指针构造函数和析构函数中可以使用this,但要谨慎操作(特别是在虚函数调用场景)设计应用。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 1324

C++ this指针详解:从内存模型到实战应用与陷阱规避

C++面向对象编程中,理解对象的内存模型是掌握语言核心的关键。每个非静态成员函数都隐式接收一个指向当前对象实例的指针,即this指针,它解决了多个对象共享同一份成员函数代码时如何访问各自数据的根本问题。这一机制不仅是实现多态、支持链式调用的技术基础,更是编写高效、安全代码的核心。通过this指针开发者可以精确控制对象状态,实现如构建器模式等高级设计模式,并规避空指针访问、对象生命周期管理等常见陷阱。本文聚焦this指针C++中的核心原理与实战应用,深入探讨其在内存模型、链式调用、多线程场景下的正确使用

weixin_30457465的博客 310

C++知识:this 指针详解

每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。 注意:友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。 示例代码 : #include <iostream> using namespace std; class Array { public: Array(int Len = 0) : Len(Len) { cout << "Array.

Yifancoder的博客 477

C++this指针详解

成员函数中this是指向正在调用该函数的对象,this指正在创建对象内部的成员。同一个类中的函数可以通过this相互调用,普通函数不能通过this调用构造函数,但构造函数可以通过this访问普通函数!.h文件ifndef TEACHER_H_#define TEACHER_H_class Teacher {public: int age; int no; Teacher(); ~Teacher()...

Makefilehoon的博客 496

C++类与对象:从定义到this指针详解

限定符类内同一包子类不同包public✅✅✅✅protected✅✅✅❌默认✅✅❌❌private✅❌❌❌!!注意!!!class定义成员没有被访问限定符修饰时默认为private,struct默认为public。一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

lijinghanwudi的博客 1162

[C++ this指针详解]:探究this指针C++中的作用和实际应用

在该示例中,我们定义了一个名为MyClass的类,其中包含一个名为print()的成员函数。在C++中,this指针是一个自动定义、局部变量,在每个成员函数内部提供了对当前对象的指针。因此,在类的内部,访问类的成员变量时,可以省略对象名直接调用,而是使用this指针来访问。总之,在C++中,this指针是一个非常有用的工具,它能够帮助我们访问当前对象,并且可以在类的内部进行各种操作。在该示例中,我们定义了一个名为MyClass的类,其中包含一个名为num的成员变量和一个重载的+运算符。

2301_79365003的博客 147

C++默认成员函数之一: 构造函数详解以及this指针

C++中的构造函数以及this指针详解

weixin_68539386的博客 1709

C++】类与对象:类成员函数this指针详解

本文介绍了C++this指针的特性及其使用场景。通过Date类示例展示了成员函数如何通过隐式this指针访问对象数据。this指针由编译器自动传递,类型为类类型*const,只能在成员函数内使用。当this指针为空时,是否导致程序崩溃取决于是否解引用该指针:访问成员变量会引发崩溃,而仅调用不涉及成员变量的函数仍可正常运行。这解释了为何空指针调用PrintA()会崩溃而Show()却能执行。

C语言、数据结构、单片机、嵌入式实时操作系统、C++ 学习路径记录 1554

C++this指针的10大核心用法详解:从原理到实战

C++this指针的10大核心用法详解:从原理到实战

m0_69718028的博客 1183

【性能与安全并重】:详解C++11中lambda如何安全捕获this指针

掌握C++11 lambda的捕获this技巧,解决成员函数中lambda生命周期与对象安全访问难题。适用于回调函数、异步编程等场景,通过值捕获或智能指针确保对象存活,避免悬空引用。性能与安全性兼备,值得收藏。

PixelFlow的博客 437

《吃透 C++ 类和对象(上):封装、实例化与 this 指针详解

本文详细介绍了C++中类和对象的核心概念,通过大量代码示例讲解了类定义、访问限定符、实例化、this指针等关键知识点。主要内容包括:1. 类定义的两种方式(class和struct)及其区别;2. 访问限定符(public/private/protected)的作用和使用规范;3. 类实例化的过程和对象内存分配原理;4. this指针的底层实现机制;5. 通过C与C++实现Stack的对比,展示面向对象编程的封装特性。文章包含多个测试题目和详细注释的代码示例,帮助读者深入理解类和对象这一C++核心概念,为后

会当凌绝顶,一览众山小 1789

第十二章:C++中的this指针详解

本文详细介绍了C++中的this指针的概念和用法。this指针是一个特殊的指针,指向当前对象的地址,允许在成员函数内部访问和操作对象的成员变量和成员函数。通过合理地使用this指针,我们可以更加灵活地编写面向对象的代码,并实现各种功能。希望本文能够帮助你理解并准确应用C++中的this指针,提高代码的可读性和可维护性。

jakelihua 434

吃透C++类和对象(上):封装、实例化与 this 指针详解

本文详细讲解了C++中类和对象的核心概念,主要包括: 访问限定符的作用及使用场景、类的定义方式(class与struct的区别)和类域的概念、对象实例化过程和内存分配原理(成员变量存储在对象中,成员函数存储在代码区) this指针的底层机制及其在成员函数中的隐式使用 对象大小的计算规则(遵循内存对齐原则) C++与C语言实现栈的对比,体现面向对象封装特性 文章通过代码示例详细说明了类成员访问控制、成员函数定义、对象实例化等关键知识点,帮助读者深入理解C++面向对象编程的基础概念。

2501_91275995的博客 875
上一篇: C语言:编译与链接
下一篇: C++:构造函数、析构函数
敲代码的奥豆
博客等级 码龄2年 1793粉丝 36原创
评论 67
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值