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

C++ this指针:用于在成员函数中指向调用函数对象

C++中this指针是一个指向当前对象指针。在成员函数中,可以使用this指针来访问调用函数对象成员变量和成员函数。...二、作为返回值this指针 this指针可以作为返回值返回。这种情况下,返回是指向调用函数对象指针。为了实现这个功能,需要将返回类型设置为类引用指针类型。...,返回是指向调用函数对象指针。...这里使用了*this来访问调用函数对象。 三、作为函数参数this指针 this指针也可以作为函数参数传递。这种情况下,可以在函数内部访问其他对象成员变量和成员函数。...在getName函数内部,使用了this指针访问调用函数对象成员变量name。

19140

调试试炼开始

2.1 调试是什么 调试是发现和减少计算机程序电子仪器设备中程序错误一个过程。...调用堆栈 调用堆栈,主要是程序有多个函数并且存在嵌套调用时可以观察到函数调用关系和当前调用所处位置。 反汇编 查看程序汇编代码,更加底层。...: const在*左边,此时const修饰指针所指向对象,而不是指针本身。...不是语法错误,一般是代码中出现了未定义函数等外部符号,链接错误一般不给出错误出现代码行,但会标识除未定义符号,可以使用查找功能进行排查。...; Print();//该函数虽然定义了,但定义函数名与引用函数匹配 return 0; } 5.3 运行错误 逻辑错误等,需要进行调试找出错误所在,最不好找!。

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

万字长文【C++】高质量编程指南

C程序中,可以用宏代码提高执行效率,宏代码本身不是函数,但使用起来像函数,预处理器用复制宏代码方式替代函数调用,省去了参数压栈,生成汇编语言CALL调用,返回参数,执行return等过程,从而提高了速度...内联函数,编译器在符号表里放入函数声明,包括名字,参数类型和返回值类型,如果编译器没有发现内联函数存在错误,那么该函数代码也被放入符号表里,在调用一个内联函数时,编译器首先检查调用是否正确,进行类型安全检查...,仅仅省去了函数调用地开销,但是如果函数体内执行代码时间相比于函数调用开销大,将没有收益 2,函数体内代码比较长,使用内联将导致内存消耗代价较高 3,函数体内出现循环,那么执行函数体内代码时间要比函数调用开销大...根据经验,不少难以察觉程序错误是由于变量没有被正确初始化清除造成,因此把对象初始化放在构造函数,把清除工作放在析构函数,当对象被创建时候,构造自动执行,对象消亡时,析构自动执行,不要担心忘记对象初始化和清除工作了...8.4.2.构造函数初始化列表 初始化列表工作发生在函数体内任何代码被执行之前 1,如果类存在继承关系,派生类必须在其初始化列表里调用基类构造函数 class A {… A(int x); //

1.4K20

【C++】类型转换 ④ ( 子类 和 父类 之间类型转换 - 动态类型转换 dynamic_cast )

* ; // 函数接收 父类对象 作为参数, 可传入子类对象 void objSay(Father* obj) { } // 调用函数, 传入子类对象指针 objSay(&son); 3、子类 和 父类..., 避免出现更大错误 ; 下面的代码中 , 使用取地址运算符 &son 获取 Son* 类型 指针 , 将其使用 静态类型转换 static_cast 转为 Father* 类型指针 , 在...说明被转换对象 不是 指定类型对象 ; 下面代码作用是 : 将Father* obj 父类对象 强转为 Son* 子类对象 , 如果转换成功, 说明 obj 对象就是 Son 子类对象 , 则执行...= NULL) { // 转换成功 // 执行 Son 特有工作 son->son_say(); } 完整代码 , 参考下面章节 完整代码示例 ; 二、完整代码示例 1、代码示例 #include...* obj) { // 调用 父类 纯虚函数 可发生多态调用 // 传入不同子类 调用是不同函数 obj->say(); // 动态类型转换 dynamic_cast // 可用于在

33610

「音视频直播技术」JNI编程常见问题

字符串函数返回jchar *jbyte *,它们是C样式指向原始数据指针,而不是本地引用。它们被保证有效,直到调用Release,这意味着当native方法返回时它们不会自动释放。...扩展检查 JNI几乎没有错误检查,错误通常会导致崩溃。Android提供了一种称为CheckJNI模式,在调用标准实现之前,将JavaVM和JNIEnv函数指针切换到执行扩展系列检查函数表。...扩展检查包括: 数组:尝试分配负大小数组。 错误指针:将一个坏jarray/jclass/jobject/jstring传递给JNI调用,或者传递一个NULL指针到一个不可空参数JNI调用。...jmethodIDs:在进行调用时,使用错误jmethodID方法做JNI调用:不正确返回类型,静态/非静态匹配,错误类型为'this'(非静态调用错误类(用于静态调用)。...库没不是用NDK编译。这可能导致依赖于设备上不存在函数库。

1.5K20

❤️ Go 有别于其他语言九个特性 ❤️

Go 是按值调用 在 Go 中,当你提供一个原始值(数字、布尔值字符串)一个结构体(类对象粗略等价物)作为函数参数时,Go 总是会复制变量值。...在 Java、Python 和 JavaScript 等许多其他语言中,原语是按值传递,但对象(类实例)是按引用传递,这意味着接收函数实际上接收是指向原始对象指针,而不是其副本。...Foo 指针并改变原始对象。...按值调用与按引用调用这种明显区别使您意图显而易见,并降低了调用函数无意中改变传入对象可能性(当它不应该发生时(许多初学者开发人员很难做到这一点)握紧)。...调用函数然后检查错误返回值,并处理错误抛出自己错误

59730

Robust generic functions on slices

调用这些函数时,我们必须明确是原始切片已经无效了,因为底层数组已经被修改。忽略返回值调用这些函数将是一个错误: slices.Delete(s, 2, 5) // incorrect!...这将带来额外工作,使Delete稍微不那么高效。将指针清零(将它们设置为nil)可以使这些对象在无法访问时启用垃圾回收。 哪一个更好呢?第一个提供了默认性能,而第二个提供了默认内存节约。...在Go 1.22中,调用Delete后内存情况如下: 体现在代码中,就是这五个函数中使用了新内置函数clear[10](Go 1.21),将废弃元素设置s元素类型零值: 当E是指针、切片、映射...那么你可能会错误地假设s包含任何nil指针,可以在Go Playground[11]中查看具体示例。...不正确,使用 := 而不是 = !! 那么你可能错误地假设s包含任何nil指针。示例[14]。 最后 slices包API比传统泛型前语法在删除插入元素方面有了很大改善。

7010

【C++】异常+智能指针+特殊类和类型转换

try用于激活某一段需要测试代码块,即这段代码块会对某种错误发生时抛出异常对象。...如果用智能指针来管理我们所申请到资源,我们就不用再担心没有回收资源而产生内存泄露问题了,就算是抛异常我们也害怕,因为当执行流离开函数栈帧时候,由于函数栈帧销毁,则智能指针对象也会跟着销毁,此时会调用析构函数完成智能指针所指向资源回收工作...,无法完成拷贝赋值工作。...private: //封为私有,不让你随便在任意内存位置创建对象,但没有说不让你创建对象 HeapOnly(){} }; 首先需要知道一点是,栈和数据段上对象在其作用域结束程序终止时,会自动调用析构函数完成对象资源清理工作...至于子类对象指针引用转为父类对象指针引用,这个过程是天然,不需要强制转换,只有反过来时候才需要强制类型转换。

30440

【C++】类和对象核心总结

,其实都会报运行错误,注意是运行错误,而不是编译错误,只有在程序跑起来时,编译器才会报运行错误,语法检查上面,编译器认为你这两个行为是合理。...下面代码如果将注释内容放开,代码就会编译失败,因为我们显示定义了构造函数,编译器就不会生成构造函数了,但是我们显示定义构造函数无法完成实例化对象初始化工作,所以代码就会编译失败。 a....编译器对于内置类型处理,对于自定义类型会调用构造函数,这个构造函数既有可能是默认构造也有可能是无法完成初始化工作构造函数。 c....下面是证明过程,在C++入门那篇博文我们就提到过,如果代码过长,编译器为了防止代码膨胀发生是会拒绝展开代码,如果展开代码,自然函数就要被调用,也就会开辟函数栈帧等等,有些人可能会觉得如果开辟了函数栈帧...之前我们所学构造函数可以给新创建对象赋初值,这点我们是知道,但是它并不是对成员变量初始化,而是赋值工作。 因为初始化只能初始一次,而构造函数赋值是可以赋值多次

69730

第 15 章 面向对象程序设计

动态类型:变量表达式表示内存中对象类型,直到运行时才可知。如果表达式既不是引用也不是指针,则它动态类型永远与静态类型一致。...即使一个基类指针引用已经绑定在一个派生类对象上,也不能执行从基类向派生类转换。可以使用 dynamic_cast执行运行时安全检查 static_cast来强制覆盖掉编译器检查工作。...假设调用合法,则编译器将根据调用是否是虚函数而产生不同代码: 如果 mem是虚函数且我们是通过引用指针进行调用,则编译器产生代码将在运行时确定到底运行该虚函数哪个版本,依据是对象动态类型...反之,如果 mem不是函数或者我们是通过对象(而非引用指针)进行调用,则编译器将产生一个常规函数调用。...假如基类析构函数不是函数,且指针静态类型与动态类型不一致,则此时只能调用基类析构函数,那派生类对象部分则无法完成析构,从而产生未定义行为。

99830

面试总结-C++

用 std::vector/std::string 自己编写 Buffer class 来管理缓冲区,自动记住用缓冲区长度,并通过成员函数不是指针来修改缓冲区。 空悬指针/野指针。...见为什么不能建立引用数组 将引用作为函数参数时,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当希望传入引用参数不被改变时,使用const引用。...而对于析构函数来说,又必须是虚函数,因为只有先从子类对象进行销毁,才能保证资源泄露。 在构造函数和析构函数中都不要调用函数也是这个道理。...导致代码丑陋混乱优雅 解决异常安全问题: 1.多使用RAII,使用智能指针来管理内存。...4.流对象,资源对象,new对象,不应该直接作为参数,一旦抛出异常,就可能会导致严重问题,函数也许会被错误执行,资源也许会泄漏。 5.减少全局变量使用。

2.1K11

C++ 新特性学习(四) — Bind和Function

+函数传入参数), >(T::*f ,t [,…]) // 非自动推断 绑定组合 需要注意问题: 绑定参数数量匹配将会在绑定时编译错误(特别注意是绑定类成员时遗漏类实例) 绑定参数类型匹配将会在调用时编译错误...占位符匹配将会在调用时编译错误 绑定对象必须是函数成员函数指针 绑定对象默认为c++函数且不支持变长参数函数,如printf,某些编译器上extern “C”函数(如: std::strcmp...std::function作用就在于把函数函数对象转换成function对象,并用于保存和后期调用。 其中和std::bind配合使用例子上面已经有了,就不重复。...当空函数结构调用时候 std::function 行为可以预见, 类型安全 函数指针更小 函数指针更快(std::function 在析构时可能会释放函数对象函数指针对C语言库向后兼容性更好...函数指针错误信息更容易理解 性能 对象大小: 包含两个函数指针大小 复制性能: 取决于所关联函数函数对象,建议采用函数函数对象引用传给std::function来提高复制性能

2.3K10

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

这个this指针指向调用该成员函数对象地址。 当你创建Date类两个对象d1和d2,并分别调用它们Init函数时,编译器会自动将this指针设置为指向当前对象(d1d2)地址。...然而,如果成员函数访问任何成员变量(也不调用其他访问成员变量成员函数),那么实际上并不需要有效 this 指针。...即使 PrintA 函数直接访问 _a 成员(实际上它是通过 this 指针隐式访问),但调用成员函数本身就需要一个有效对象实例。...在 C++ 中,当你有一个指向对象指针,并试图通过该指针调用成员函数时,编译器会生成代码来隐式地传递一个指向该对象 this 指针给成员函数。...它实际上是一个指向调用该成员函数对象实例)指针。这个指针不是真正存储在对象本身内存布局中,而是在成员函数调用时,由编译器在函数调用栈帧(stack frame)中创建并管理

8810

分享丨CC++内存管理详解--堆、栈

所以栈在程序中是应用最广泛,就算是函数调用也利用栈去完成,函数调用过程中参数,返回地址,EBP和局部变量都采用栈方式存放。所以,我们推荐大家尽量用栈,而不是用堆。   ...含有这种错误函数每被调用一次就丢失一块内存。刚开始时系统内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。...因此C++语言需要一个能完成动态内存分配和初始化工作运算符new,以及一个能完成清理与释放内存工作运算符delete。注意new/delete不是函数。...函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。...对于非内部数据类型对象而言,new在创建动态对象同时完成了初始化工作。如果对象有多个构造函数,那么new语句也可以有多种形式。

97221

JNI开发中,你需要知道一些建议

原始数据指针,像GetStringUTFChars和GetByteArrayElements返回值,也都不是对象(它们能够在线程间传递,并且在调用对应Release函数之前都是有效)。...坏指针:传入一个不完整jarray/jclass/jobject/jstring对象到JNI函数,或者调用JNI函数时使用空指针传入到一个不能为空参数中去。...jmethodIDs:当调用Call*Method函数时时使用了类型错误jmethodID:不正确返回值,静态/非静态匹配,this类型错误(对于非静态调用)或者错误类(对于静态类调用)。...当与Native代码交互时,在大多数情况下这不是需要担心,但是如果打算存储指针变量到对象整型字段(integer field)这样Native结构中,这就变得非常重要了。...在合适地方缓存一个ClassLoader对象引用,然后直接发起loadClass调用。这需要额外些工作。 FAQ: 使用Native代码怎样共享原始数据?

1.3K30

第 13 章 拷贝控制

试图拷贝对象用户代码在编译阶段被标记为错误(因为不可访问),成员函数友元中拷贝操作将会导致链接错误(因为只有声明没有定义)。...直接交换两个指针,而不是对象本身,往往具有更高运行效率。...注意,swap函数应该调用 swap,而不是 std::swap。这是因为使用swap()调用方式,由于普通函数优先级高于模板函数,所以会优先调用类版本 swap函数。...当编写一个抛出异常移动操作时,需要通知标准库。除非标准库知道移动构造函数不会抛出异常,否则它会认为移动我们对象时可能会抛出异常,并且为了处理这种可能性而做一些额外工作。...在参数列表后放置引用限定符 & &&,可以限定能够调用函数对象左值/右值属性。

96250

C++:33---类成员指针

成员指针概述: 当初始化一个这样指针时,我们令其指向类某个成员,但是指定该成员所属对象 直到使用成员指针时,才提供成员所属对象 成员指针是指可以指向类非静态成员指针 一般情况下,指针指向一个对象...*与->*运算多想。然而pmf与pmf2并不是一个函数,因此代码错误 char c1 = myScreen.*pmf(); //错误//其等价于myScreen....; //调用muScreen.homemyScreen.move(Screen::DOWN); //调用muScreen.down return 0;} 三、将成员函数用作可调用对象 成员指针不是调用对象...*运算符->*运算符来调用。因此与普通函数指针不同,成员指针不是一个可调用对象,这样指针不支持函数调用运算符....因此在find_if源码内部执行如下形式代码,从而导致无法通过编译: //检查对当前元素断言是否为真if(fp(*it)) //错误,想要通过成员指针调用函数,必须使用->*运算符 显然该语句试图调用是传入对象

83030

C语言与C++面试知识总结

它指向调用该成员函数那个对象。 当对一个对象调用成员函数时,编译程序先将对象地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。...当一个成员函数调用时,自动向它传递一个隐含参数,该参数是一个指向这个成员函数所在对象指针。...内联函数相比宏函数来说,在代码展开时,会做安全检查自动类型转换(同普通函数),而宏定义则不会。 在类中声明同时定义成员函数,自动转化为内联函数,因此内联函数可以访问类成员变量,宏定义则不能。...inline virtual 唯一可以内联时候是:编译器知道所调用对象是哪个类(如 Base::who()),这只有在编译器具有实际对象不是对象指针引用时才会发生。...合法,但: 必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配 必须保证调用 delete this 成员函数是最后一个调用

4.9K41

C++内存管理(建议收藏)

因此C++语言需要一个能完成动态内存分配和初始化工作运算符new,以及一个能完成清理与释放内存工作运算符delete。注意new/delete不是函数。...任何试图将他对一个普通指针赋值都会产生一个编译期错误,因为类型匹配。...比如,下面的函数定义: Type fun(Type object); 这个函数至少产生两个临时对象,首先,参数是按值传递,所以会调用拷贝构造函数生成一个临时对象object_copy1 ,在函数内部使用不是使用不是...其实,在main()函数显示代码执行之前,会调用一个由编译器生成_main()函数,而_main()函数会进行所有全局对象构造及初始化工作。...,那么我们可以将这些准备工作写到一个自定义全局对象构造函数中,这样,在main()函数显式代码执行之前,这个全局对象构造函数会被调用,执行预期动作,这样就达到了我们目的。

2.8K40

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

前言 this指针是一个特殊指针,在C++类成员函数中使用。它指向调用该成员函数对象地址。通过使用this指针,成员函数可以访问和修改调用对象属性和其他成员函数。...因此,this指针引入使得编译器能够准确地识别成员变量与成员函数参数。 this指针可以在非静态成员函数中使用,它指向调用函数对象,可以通过this指针访问对象成员变量和成员函数。...: Date类中有 Init 与 Print 两个成员函数函数体中没有关于不同对象区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?...可以调用其他成员函数:使用this指针可以调用当前对象其他成员函数。 可以用于比较和判断是否为同一对象:使用this指针可以比较两个对象是否为同一个对象。...例如,缺少括号、缺少分号、错误变量命名等。 类型错误:如果代码中使用了错误类型进行了兼容类型转换,编译器将报错。例如,将字符串赋值给整数类型变量、使用未声明变量等。

14510
领券