首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++从入门到精通——this指针

前言 this指针是一个特殊指针,在C++成员函数中使用。它指向调用该成员函数对象地址。通过使用this指针,成员函数可以访问和修改调用它对象属性和其他成员函数。...它引入主要是为了解决成员函数与成员变量同名问题。 在一个类中,成员函数可以访问成员变量。当类成员变量与成员函数参数同名,如果没有使用this指针,编译器无法区分两者。...C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问...在类成员函数中,可以使用this指针来访问当前对象成员变量和成员函数。在C++中,每个非静态成员函数都隐含地包含一个this指针。...在C++中,this指针指向当前对象地址,如果对象不存在,即为空,this指针也将为空。在访问对象成员函数,需要先判断this指针是否为空,以避免访问空指针错误。

16210

C++奇迹之旅:隐含this指针

当我们调用 d1.Print() 和 d2.Print() ,Print() 函数会分别访问 d1 和 d2 对象 _year、_month 和 _day 成员变量。...我们在上节第三种猜想可以知道对象存储方式:只保存成员变量,成员函数存放在公共代码段 类成员函数代码只保存一份,存放在程序公共代码段中。每个类对象中只保存成员变量实际数据。...当通过对象调用成员函数,编译器会根据成员函数名称和类型,找到对应函数代码地址,并传入对象自身this指针,来完成函数调用 总结来说:当成员函数print()通过this指针,访问这些成员变量...那类对象d1,d2是怎么找到两个函数,this 指针是一个指向当前对象指针。当我们调用一个类成员函数,编译器会自动将当前对象地址传递给 this 指针。...小结:成员函数调用如果没有依赖于this指针指向对象实例化某个成员变量有效内存地址,也就是不访问对象成员变量成员函数,通过nullptr调用不会发生运行时错误,Print() 函数只是简单地打印一个字符串

8210
您找到你想要的搜索结果了吗?
是的
没有找到

C语言重点突破(五) 动态内存管理

前言 动态内存管理是指在一个程序运行期间动态地分配、释放和管理内存空间过程。在应用程序中,当程序需要使用变量或对象,需要在内存中分配一段空间,并在使用完毕后释放该空间,以提高程序效率和性能。...在C/C++中,NULL指针是一种特殊指针,其取值为0,在进行指针解引用操作,程序会试图访问地址为0内存,这个地址是无效,可能会导致程序崩溃。...当我们使用malloc或new等函数在堆上动态开辟空间,如果我们访问这些内存空间之外位置,就会导致指针指向了非法内存地址。...因此,当我们需要释放内存,只需要释放动态开辟内存即可,对于非动态开辟内存,不要手动进行释放操作。...数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。 4. 代码段:存放函数体(类成员函数和全局函数)二进制代码

9210

深入解构iOS系统下全局对象和初始化函数

程序运行崩溃C++全局对象 可以肯定一点就是那个第三方库由于对全局C++对象使用不当而产生了问题。我们知道每个C++对象在创建都会调用对应构造函数,而对象销毁则会调用对应析构函数。...但是当我们定义了一个C++全局对象因为没有明显可执行代码上下文,所以我们无法很清楚了解到全局对象构造函数和析构函数调用时机。...可以明确就是当我们定义了全局对象并生成了_GLOBAL__sub_I_XXX系列函数时或者当我代码中存在着attribute(constructor)声明C函数,系统在编译过程中为了能在进程启动时调用这些函数来初始化全局对象...所以当我们在调试或者查看崩溃日志,如果问题出现在了全局对象构造函数或者析构函数内部,我们看到函数调用栈里面会出现两个相同函数名字 ? 全局对象同名构造函数 这个实现机制非常令我迷惑!...后记:崩溃修复方法 最后我想再来说说那个崩溃事件,本质原因还是对于全局对象使用不当导致,当进程将要被杀死,主线程执行了exit方法调用,exit方法内部析构了所有定义全局C++对象,并且当主线程在执行在全局对象析构函数

3.9K20

C++进阶之路:探索访问限定符、封装与this指针奥秘(类与对象_上篇)

代码中,我们不能直接通过类名来访问或修改对象成员变量,因为类本身并不存储具体实例数据。 我们需要先创建类实例(即对象),然后通过该对象访问或修改其成员变量。...这是因为 Print 函数是一个不依赖于 this 指针中存储对象状态(即不访问任何成员变量)成员函数。 在 C++ 中,成员函数通常通过 this 指针隐式地访问对象成员。...在 C++ 中,当你有一个指向对象指针,并试图通过该指针调用成员函数,编译器会生成代码来隐式地传递一个指向该对象 this 指针给成员函数。...由于 p 是空,this 指针也是无效,因此程序崩溃。 this指针存在哪里? this 指针是 C++ 编译器在调用成员函数自动添加一个隐式参数。...这是因为即使函数体内不直接访问任何成员变量,成员函数被调用时仍然需要一个有效 this 指针来作为上下文。当这个上下文不存在(即你试图通过一个空指针来调用成员函数),程序行为就是未定义

8910

C++基础知识

从中可看出,调用静态成员函数使用如下格式:::(); C++和C区别 设计思想上 C++是面向对象语言,而 C 是面向过程结构化编程语言 语法上 C++具有重载...此时不会报错,p2 剥夺了 p1 所有权,但是当程序运行时访问 p1 将会报错。所以 auto_ptr存在潜在内存崩溃问题。 2.unique_ptr 替换 auto_ptr。...当我们调用 release(),当前指针会释放资源所有权,计数减一。当计数等于 0 ,资源会被释放。...普通函数,默认是extern,也就是说,可以被其它代码文件调用该函数。 虚函数表 当一个类中包含被virtual 关键字修饰成员函数,该成员函数就成为了一个虚函数。...常量区:只读数据,比如字符串常量,程序结束由系统释放。rodata段,read only。 init段:程序初始化入口代码,在main() 之前运行。

1.4K32

Java最大竞争对手是谁?

public class GlobalVar{ public static global_var; //全局变量也叫成员变量或成员属性 } 要定义全局变量,只能通过在一个类中定义公用、静态变量来实现一个全局变量...而在C和C++ 中,依赖于不加封装全局变量常常造成系统崩溃。...,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C或C++私有成员,从而破坏安全性,造成系统崩溃。...6) 严格控制数据类型转换 一种数据类型数据转换成另外一种数据类型数据,常常会出现数据精度丢失问题,在C、C++ 中,通过指针进行任意数据类型转换极不安全,而在Java中,运行时系统对对象处理要进行类型相容性检查...而Java不支持头文件,类成员类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员操作。同时,Java中用import语句来与其他类进行通信,以便使用它们方法。

1.6K110

C++初阶-类和对象

C++类和对象起点之章 一、前言 二、面向过程/对象区别 三、类引入 四、类定义 五、类访问限定符及封装 1、访问限定符 2、封装 六、类作用域 七、类实例化 八、类对象模型 1、类对象大小计算...五、类访问限定符及封装 1、访问限定符 C++封装方式: 用类将对象属性与方法结合在一块,让对象更加完善,通过访问权限选择性将其接口提供给外部用户使用 分类: public(公有):...,由此引入this指针 具体操作: C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有成员变量操作,都是通过该指针去访问...可以为空,当我们在调用函数时候,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作才可以为空(当我们在其中什么都不放或者在里面随便打印一个符串),如果调用函数需要指向当前对象...会在调用Print成员函数崩溃,因为此时this是空指针,当使用成员函数操作对象成员变量,需要对指针进行解引用操作,而对空指针解引用操作会崩溃 觉得不错的话,欢迎多多点赞三连支持博主!!

46550

CC++面试题之语言基础篇(一)

private:私有继承,派生类继承基类私有成员,这些成员在派生类中变为私有的,不能被外部访问。 C语言和C++区别 与C语言区别: C语言是面对过程,而C++是面对对象。...编译区别:由于C++支持函数重载,因此编译器编译函数过程中会将函数参数类型也加到编译后代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码函数一般只包括函数名。...简述C++代码到可执行二进制文件.exe过程 有四个过程,预编译、编译、汇编、链接 C++函数只声明,不定义会在哪步报错 实际错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起...对于C++全局或静态对象对象首次用到时才进行构造。 静态局部变量,全局变量,局部变量特点 首先从作用域考虑: 全局变量:全局作用域,可以通过extern作用于其他非定义源文件。...结构体比较,怎么判断两个对象是否相等 需要逐个比较它们成员变量(字段) 继承关系中子类能访问父类哪些成员变量以及成员函数 在继承关系中,子类(派生类)通常可以访问父类(基类)以下成员变量和成员函数

19110

整理了70道C语言与C++常见问答题

「注意」:编程 static 记忆性,和全局特点可以让在不同时期调用函数进行通信,传递信息,而 C++静态成员则可以在多个对象实例间进行通信,传递信息。...一个C、C++程序编译内存分为5 大存储区:堆区、栈区、全局区、文字常量区、程序代码区。...C语言结构体中数据成员是没有private、public和protected访问限定。而C++成员有这些访问限定。 C语言结构体是没有继承关系,而C++类却有丰富继承关系。...33 C++中类成员访问权限 C++通过 public、protected、private 三个关键字来控制成员变量和成员函数访问权限,它们分别表示公有的、受保护、私有的,被称为成员访问限定符。...在类外部(定义类代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性成员,不能访问 private、protected 属性成员 34 什么是右值引用,跟左值又有什么区别?

3K01

c++lambda使用注意事项,可能导致崩溃问题分析

lambda表达式(也称为lambda函数)是在调用或作为函数参数传递位置处定义匿名函数对象便捷方法。通常,lambda用于封装传递给算法或异步方法几行代码 。...对divisor引用会空悬 ); } 崩溃原因分析 先说结论吧,以上三个示例均会导致崩溃崩溃原因分析: 示例一,崩溃在QtConcurrent::run开启线程里访问了arg1。...6、注意捕获是可见(在创建lambda作用域可见)非static局部变量(包含形参)。 每一个非static成员函数都有一个this指针,然后每当你使用类成员变量都用到这个指针。...正常情况下,lambda表达式中访问对象成员变量需要捕获this,但是这里捕获是this指针,指向对象引用,正常情况下可能没问题,但是如果多线程情况下,函数作用域超过了对象作用域,对象已经被析构了...,还访问成员变量,就会有问题。

3.4K10

0xc0000005发生访问冲突解决_更改兼容性还是c0000005

发生这个问题,一般意味着: 访问数组元素发生了 越界; 将静态常量地址赋给了普通指针(可读写指针),随后又尝试写该普通指针指向实体,这等价于写访问一个只读内存块; 对空指针或野指针解引用...错误案例 越界访问是指:一个数组容量为 N,试图访问下标为 N,即第 N+1 个元素 —— 这里我就不举越界例子了,因为它发生原因多种多样。我们展开说一下后两种错误原因。...由于 数组可以退化为指针,所以把这种字符数组赋值给 char 指针,是一种隐式取址操作,而不是拷贝。编译器并不知道你要拿这个指针干什么,会不会进行写操作,所以编译是通过;运行时崩溃。...空指针或野指针解引用 新手常见下饭操作 —— 编译器不报错,IDE 也很难给出有效提示,而一旦运行就会崩溃,经常让刚学指针数组小白内心严重动摇(进而放弃学习 C++)…… // 开心地定义一个类,包含一个数据成员...实际上,我们只为 paFoo 这个数组 本身 申请了内存(用于存储 3 个指针),却没有为每个指针可能指向对象申请内存,那当然就不可能将 bar 拷贝构造到一个不存在内存上了;换言之,指针数组刚被创建

81620

C++中类和对象以及成员函数

参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己属性和行为,属性是私有的,行为是共有的,在C++中实体对应就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。 ...面向对象思想三大特征:  封装、继承、多态(静多态,动多态)  访问限定符:  public:任意位置都可以访问。  protected:(继承和派生)一子类可以访问父类保护成员。 ...成员函数我们可以将它们定义在类里,也可以定义在类外,一般建议定义在类外,在类里进行声明即可,这样会使代码看上去更美观,类里代码不会过多,看上去头重脚轻。...运行的话程序会崩掉,因为good2,good3同时指向一块内存,调用析构函数,good3会先析构内存块就会被释放,good2就变成了野指针,析构delete就会崩溃。  ...good3指向变了之后指向了内存块1,析构内存块1被释放,产生野指针再析构时会崩溃,内存块2没有被释放会产生内存泄漏。

1.3K20

C++入门】—— C++入门 (上)_命名空间

C++学习前言 1.1 C++发展史 1979年,贝尔实验室本贾尼等人试图分析unix内核时候,试图将内核模块化,于是在C 语言基础上进行扩展,增加了类机制,完成了一个可以运行预处理程序,...,我们可以直接将整个命名空间展开变成全局域 using namespace pxt; 我们以后在编写C++代码是会经常用到 using namespace std; // std就是C++标准库,...,空间中所有成员都可以直接使用 2.2 C++输入&输出 在每次接触到新语言,我们都会以全新方式打个招呼,我们来看看C++是怎么实现!...cout和cin是全局对象,endl是特殊C++符号,表示换行输出,他们都包含在包含头文件中。 >是流提取运算符。...在项目开发中,由于代码多,规模大,不建议直接展开使用 写项目使用时,应该使用指定命名空间展开常用对象方式 3.

9710

总结c++ primer中notes

比如下面这段程序可以看出,如果没有cout << endl;刷新缓冲区, 那么要等10秒后,程序结束,才能打印出字符串。...如果某种类型不支持某种操作,那么这种类型对象也就不能执行该操作。 在 C++ 中,操作是否合法是在编译检查。当编写表达式,编译器检查表达式中对象是否按该对象类型定义使用方式使用。...const 对象默认为文件局部变量 在全局作用域里定义非 const 变量,它在整个程序中都可以访问。...常量表达式是编译器在编译就能够计算出结果整型表达式。整型字面值常量是常量表达式,正如一个通过常量表达式自我初始化const 对象也是常量表达式一样。 枚举成员值可以是不唯一。...用 class 和struct 关键字定义类唯一差别在于默认访问级别:默认情况下,struct 成员为 public,而class 成员为 private。

1.6K90

CC++关键字详解-----`const`使用

const,无法使this指针中成员变量进行修改。...因此,可以使用指针指向字符串常量,但不能修改字符串内容。 在 C++ 中,字符串常量被视为指向常量指针(const char*),因此使用指针指向字符串常量,不能修改字符串内容。...在 C++ 中,const 关键字用于声明函数参数,表示参数是只读,即函数内部不会修改该参数值。这种用法有助于提高代码可靠性和安全性。...const 成员函数: 在 C++ 中,const 关键字还用于声明成员函数,表示该成员函数不会修改对象状态。...这样成员函数被称为 const 成员函数,可以在 const 对象上调用,从而提高了 const 对象使用灵活性。

14110

C++】自引用this指针秘密

当调用成员函数a.disp(),编译系统就会把对象a起始地址赋值给this指针,于是在成员函数引用数据成员,就可以通过this指针索引到对象a数据成员。...有可能,可以定义一个类对象指针并使其初始化为NULL,具体实现见代码及测试图。...可能是栈,也可能是寄存器,甚至全局变量。 this指针是如何访问类中变量? 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中变量呢?如果你明白这一点的话,那就很好理解这个问题了。...在C++中,类和结构是只有一个区别的:类成员默认是private,而结构是public。this是类指针,如果换成结构,那this就是结构指针了。...静态成员函数并不是针对某个类实例对象,而是属于整个类,为所有的对象实例所共有。它在作用域范围内是全局,独立于类对象之外。它只对类内部静态成员变量做操作。

79420

嵌入式软件工程师笔试面试指南-CC++

C++中,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。 代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序机器代码。...将可能会被继承父类析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针可以释放掉子类空间,防止内存泄漏。 为什么C++默认析构函数不是虚函数?...在类外部(定义类代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性成员,不能访问 private、protected 属性成员 C++中struct和class区别是什么...但当我试图从 FinalClass2 继承一个类并创建它实例,却不同通过编译。...这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定必要性。 5.为什么C++不支持友元函数为虚函数?

1.5K11

Qt高级编码约定

对于字符串:使用\nnn(其中nnn是要在其中输入字符串任何字符编码八进制表示形式)或\xnn(其中nn是十六进制)。...另外重构代码,编译器会立即通知您是否强制转换会很危险。 编译器/平台特定问题 使用问号运算符要格外小心。如果返回类型不同,则某些编译器会生成在运行时崩溃代码(您甚至不会收到编译器警告)。...s : "nothing"; // 运行时崩溃:QString与const char * 要非常小心对齐: 每当强制转换指针以增加目标的所需对齐方式,在某些体系结构上,生成代码可能会在运行时崩溃。...union AlignHelper { char c; int i; }; 任何具有构造函数或需要运行代码进行初始化对象都不能用作库代码全局对象,因为在运行该构造函数/代码(在首次使用时...因为,除了上述链接提到原因外。当运算符是成员,参数也不相等。

1.7K30

面试总结-C++

C++面试题总结 编程基础 C++ 内存管理方式 堆、栈、自由存储区、全局/静态存储区、常量存储区 自由存储区存储malloc申请内存 (1)从静态存储区域分配 。...起到了隐藏作用 在类 static 成员变量属于整个类所拥有,对类所以对象只有一份拷贝 在类中 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问 static...功能: sizeof():获得保证能容纳实现所建立最大对象字节大小 strlen():返回字符串长度。...浅拷贝和深拷贝: 多态 多态:对于不同对象接收相同消息产生不同动作。C++多态性具体体现在运行和编译两个方面: 编译多态:函数和运算符重载。 运行时多态:继承和虚函数。...类型安全代码不会试图访问自己没有被授权内存区域。 对于C语言来说,很多操作都不是类型安全

2.1K11
领券