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

c++系列之二 指向成员函数的指针(烧脑)

,原文详细解释了C++中指向成员函数的指针,因为带有“教程”一词,所以比较通俗易懂。...如果对翻译君的翻译质量有意见,建议前往 原地址 围观。 咦?还不走?那废话少说,我们开始了啊。 关于成员函数指针 成员函数指针是C++最少用到的语法之一,甚至有经验的C++码农有时候也会被它搞晕。...所以,静态成员函数不是类的一部分,成员函数指针的语法对常规函数指针并不成立,例如上面例子中的静态成员函数指针。...我们可以将一个指向派生类的指针赋值给一个指向其基类的指针(即"is-a"关系),而所谓的“逆变性规则”(翻译君:不知道是啥,原文是contravariance rule)正是这种规则的反面。...因为 “一个指向虚成员的指针能在不同地址空间之间传递,只要二者使用的对象布局一样” (此话来自C++老爸 Bjarne Stroustrup 的 《C++程序设计语言》 )。

3.1K20

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

C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义的一个常量指针。它存储了当前对象的地址,可以通过它访问当前对象的成员变量和成员函数。...二、作为返回值的this指针 this指针可以作为返回值返回。这种情况下,返回的是指向调用该函数的对象的指针。为了实现这个功能,需要将返回类型设置为类的引用或指针类型。...,返回的是指向调用该函数的对象的指针。...四、总结 this指针在C++中是一个非常重要的概念,可以用来访问调用该函数的对象,作为返回值返回,或者作为函数参数传递。掌握this指针的使用可以帮助我们更好地编写面向对象的程序。

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

    C++类的this指针,静态成员,友元函数友元类

    ---- 1. this指针 在上篇讲C++中类,对象,封装,继承(派生),多态的时候,this指针出现在成员函数中,并使用->成员提取符操作成员变量。...在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址,this 指针是所有成员函数的隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针在成员函数的开始执行前构造的...,它可以用来指向调用对象,并且只可以在成员函数中调用,对于全局函数,静态函数,友元函数,都不能使用this指针。...静态数据成员和普通数据成员一样遵从public,protected,private访问规则。 相对于类的成员,必须在构造对象以后才会分配内存空间,只能通过对象名访问。...友元函数友元类 所谓友元函数,就是在类中,用friend关键字声明一个函数,这个函数的声明在类中,但不作为类的成员函数,虽然友元函数不属于成员函数,却可以访问类中的成员,不论成员是public,pirvate

    1.5K10

    【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

    一、常量成员函数 1、const 修饰成员函数分析 在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 在 下面的 Student 类中 , 定义了 void fun(int...void fun(int age, int height) const const 修饰的是 fun 函数的 第一个参数 Student* pThis 指针指向的内存空间 ; C++ 编译器会将 void...在 * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 类的成员函数 // const 关键字可以 // 在 void...函数的 第一个参数 Student* pThis 指针指向的内存空间 和 指针本身 // // C++ 编译器会将该函数转为 Student_fun(Student* pThis, int age...fun 函数的 第一个参数 Student* pThis 指针指向的内存空间 和 指针本身 // // C++ 编译器会将该函数转为 Student_fun(Student* pThis, int

    23020

    【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的类和没有定义虚函数类的大小 )

    对比 定义了 虚函数 的类 与 没有定义虚函数的类 的大小 , 其它成员都相同 , 定义了虚函数的类多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 虚函数表...虚函数指针 : " 虚函数表 " 是 存储 " 类成员函数指针 " 的 数据结构 , 是一个 函数指针数组 , 数组中的元素都是函数指针 , 具体存储的都是 指向 类中的虚函数 的指针 ; 如果 子类...中 , 重写了 父类的 virtual 虚函数 , 那么 C++ 编译器会在 子类 虚函数表 中放入该 子类虚函数的 函数指针 ; 如果 C++ 类中存在 virtual 虚函数 , 在创建对象时 ,...会生成 虚函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码时 , 会自动为该类 添加 一个 vptr 指针 成员变量 , 该指针 会指向 虚函数表...vptr 指针指向 虚函数表 首地址 Child c; // 将父类指针指向子类对象 p = &c; // 通过父类指针调用子类对象的 fun 函数 p->fun(1); // 打印

    22740

    C++CLI(一)-C++CLI简介

    因为引用类的成员函数不会用const来限定,CLI也没有概念上的const函数;把参数声明为一个const句柄将会使它成为另一种类型,这样它就不再能被System::Object::Equals重载了(...nullptr关键字表示常量空值,当使用在一个句柄上下文中时,它表示空句柄——没有指向任何对象的句柄;当使用在一个指针上下文中时,它表示空指针——没有包含任何地址的指针。...在一个非引用类(指本地类)中,this是一个实例函数调用时指向对象的指针,可带有const限定符;在一个引用类中,则是实例函数调用时指向对象的句柄——此处要再次提醒大家,不允许带有const限定符。...也可以通过类似以指针访问成员时的指向操作符 ->,来访问类中成员,只不过此处使用的是句柄。...在目前的C++/CLI版本中,引用类的对象只能驻留于堆栈或托管堆中,与其他CLI语言不同,C++/CLI可以让你编写能被传递,并通过复制构造函数或 = 操作符赋值的引用类,还可以重载Clone函数,实现虚拟

    3K30

    【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加的参数是 对象本身的指针 ; 在 Student 类中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个 Student 引用类型的参数 , 引用相当于一级指针...// this 是指针 , *this 是指针指向的 自身对象 return *this; } 返回 引用 , 就是返回自身对象 ; this 是指针 , *this 是指针指向的 自身对象...this->height + s2.height; // 注意 : 返回的是一个引用 , 就是返回自身对象变量 // this 是指针 , *this 是指针指向的 自身对象 return

    23820

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer...// 通过父类指针调用父类函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer

    31020

    Unity3d底层数据传递分析

    二 封送 在C#中的string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象的字符串类型指针,这个转换就是封送(Marshalling)。...因为堆内容无法互通,当返回到托管代码时,会经历以下步骤: 1. 托管代码调用非托管代码,返回了指向在非托管内存中的结构体的指针。 2....四 内存分配 类与结构体 对于托管代码与非托管代码,类与结构体有不一样的传递方法。 1、类的传递 类是在托管堆上分配的,因此不能以值类型传给非托管代码,而只能传引用。...依照上面的非托管代码定义,结构体包装可以是: ? 结构体在非托管代码中,可以作为值返回,但不可以返回ref或out。所以要想返回指向结构的指针,就必须使用IntPtr,或在外部定义unsafe。...成员变量 对于类与结构体的成员变量,乖巧的做法是:不要将包含引用类型(比如说类)的类或结构体传给非托管代码。因为非托管代码不能安全的操作非托管引用,托管代码也不一定会深封送数据。

    1.4K20

    Unity3d底层数据传递分析

    [1.png] 二、封送 ---- 在C#中的string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象的字符串类型指针,这个转换就是封送(Marshalling)。...因为堆内容无法互通,当返回到托管代码时,会经历以下步骤: 托管代码调用非托管代码,返回了指向在非托管内存中的结构体的指针。 在托管代码中找到对应的托管类并实例化,将非托管内容封送到托管类中。...四、内存分配 ------ 类与结构体 对于托管代码与非托管代码,类与结构体有不一样的传递方法。 1、类的传递 类是在托管堆上分配的,因此不能以值类型传给非托管代码,而只能传引用。...所以要想返回指向结构的指针,就必须使用IntPtr,或在外部定义unsafe。如果使用IntPtr做返回值,可以用Marshal.PtrToStructure系列函数,将指针转换为托管结构体。...成员变量 对于类与结构体的成员变量,乖巧的做法是:不要将包含引用类型(比如说类)的类或结构体传给非托管代码。因为非托管代码不能安全的操作非托管引用,托管代码也不一定会深封送数据。

    3.6K21

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

    在C++中,当你有一个类(比如Date类)并且这个类有成员函数(比如Init和Print),编译器确实为每个非静态成员函数增加了一个隐藏的指针参数this。...这个this指针指向调用该成员函数的对象的地址。 当你创建Date类的两个对象d1和d2,并分别调用它们的Init函数时,编译器会自动将this指针设置为指向当前对象(d1或d2)的地址。...在C++中,编译器为每个非静态成员函数隐式地传递一个名为this的指针,该指针指向调用该函数的对象。 这使得成员函数能够知道它们应该操作哪个对象的数据成员。这个过程对用户是透明的。...在 C++ 中,当你有一个指向对象的指针,并试图通过该指针调用成员函数时,编译器会生成代码来隐式地传递一个指向该对象的 this 指针给成员函数。...由于 p 是空的,this 指针也是无效的,因此程序崩溃。 this指针存在哪里? this 指针是 C++ 编译器在调用成员函数时自动添加的一个隐式参数。

    16310

    【C++】 解决 C++ 语言报错:Invalid Use of ‘this’ Pointer

    this 指针在类的成员函数中指向调用该函数的对象,错误地使用 this 指针会导致程序行为不可预测,甚至可能引发运行时错误。...无效使用 this 指针的成因 无效使用 this 指针的错误通常由以下几种原因引起: 在静态成员函数中使用 this 静态成员函数不属于某个具体对象,而属于类本身,因此无法访问 this 指针。...代码审查 通过仔细审查代码,特别是类的成员函数和构造函数,可以发现并修复 this 指针使用问题。...无效使用 this 指针的预防措施 避免在静态成员函数中使用 this 在静态成员函数中,使用类名直接访问静态成员和函数,避免使用 this 指针。...代码审查 通过仔细审查代码,特别是类的成员函数和构造函数,可以发现并修复 this 指针使用问题。 总结 无效使用 this 指针是 C++ 编程中常见的错误之一。

    21010

    C++CLI 简单介绍

    C++/CLI简介 托管的C++(MC++)饱受诟病的一个地方就是语法格式和普通的编程语言差别很大,很多人都评价为: ugly 和 twisted 语法。...改进前的MC++有如下缺点: 1、 语法格式不雅观,比如很多双下划线的关键字; 2、 托管的C++在和CLI交互是并不能使用全部的功能,比如在C#或者VB.NET中可以使用 for-each 等语法,而...MC++不可以; 3、 MC++提供不了一些标准C++的语言特性,比如:C++中的模板,和CLI的内存收集(garbage collection); 4、 非托管的指针和托管的引用指针在语法上都用*表示...Handler 和 C++中的指针的区别如下: 1、 语法上 用 ^和*区别; 2、 Handler是建立在托管堆上的一个被(CLI)管理的引用,而指针指向一个物理的内存地址; 3、 指针不受垃圾回收器的影响...,而handler实际指向的内存地址则收垃圾回收器的管理; 4、 使用指针必须用声明使用delete来释放内存,而handler可以使用也不可以使用; 5、 Handler是类型安全的,每个指向托管对象的

    1.2K40

    2019-10-21-C++CLI委托回调

    我们都习惯了在c#中使用事件,但是c++中没有默认的事件机制,所以在编写c++/cli时,这将是一个令人困扰的问题 ---- 在c++中常见的方式是传入一个回调,在特定的时机,通过调用回调函数,执行上层的代码...另外常见的回调对象,要求一次实现多个回调函数,这样容易将各个业务的处理都聚集在同一个回调对象中,不利于解耦。 在c++/cli中,一种可以参考的处理方式是使用一个托管类对非托管的回调类进行封装。...向非托管的回调类传入一个托管类的委托函数后,由委托函数重新引发.NET事件。...: 我们生成了一个托管的委托,DelegateOnFoo,但是对于非托管的回调来说他只能接受对应的函数指针,因此,需要使用Marshal::GetFunctionPointerForDelegate将其转换为指针...此时我们得到的是一个IntPtr智能指针对象,我们需要使用ToPointer方法将其转换为void*,然后再强转为参数匹配的(void(*)(void))格式,才能传入非托管方法 另外,最容易忽略的一点是我们通过

    75350

    【C++】C++入门 — 类和对象初步介绍

    因此,在C++中编译器默认会对类的成员变量进行内存对齐,当然也可以通过预定义的编译器宏(如#pragma pack)或者显式指定成员变量的对齐方式来控制类的内存布局。...C++中通过引入this指针解决该问题 即:C++ 编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...this指针存在于哪里? 在C++中,this指针是一个隐含的、非静态成员函数内部可用的特殊指针,它指向当前正在调用该成员函数的对象实例。...因此,this指针实际上是存在于每个非静态成员函数的执行上下文中,并且它始终指向当前调用该函数的对象实例。 this指针可以为空吗?...,移动构造函数或移动赋值运算符中,当源对象即将被移动(资源转移)后置为无效状态时,也可能出现类似情况,但这不是this本身为空,而是对象即将变成无效状态。

    12210

    把C++CLI委托传入本地代码

    参考: http://resnikb.wordpress.com/2009/05/18/passing-ccli-delegate-to-native-code/ C++/CLI可以直接执行C++, 这个没有问题...比如底层C++进行一项任务, 完成了需要通知上层的C++/CLI, 总不能在上面不停地查询吧? 通常这是通过回调来实现的, 说漂亮点就是观察者模式, 说成.net的就是委托....而委托, 本质是就是函数指针....以前也提到过C++委托的实现. .net提供了一个方法把委托转换成函数指针: Marshal::GetFunctionPointerForDelegate  跟String的转换一样, 需要注意保证内存指针不会被托管机制移动...EventDelegate(int i);   ref class NativeInterface   {   public:       NativeInterface()       {   // 从成员函数创建一个委托

    93760

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    虚函数是允许被其子类重新定义的成员函数。 可以实现用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。...有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员,从而实现多态。...都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 野指针,指的是没有被初始化过的指针。...free一次后,原来指针所指向的堆中的内容已经被清空了,但指针本身的值并没有被置为null,还是指向原来它所指向的内存空间。 再free一次时,由于堆中的内容已经是无效的东西,所以就会出错。...浅拷贝: 在拥有指针成员的类中,一个对象利用拷贝构造函数或者赋值函数拷贝或者赋值给另一个对象的时候,直接将这个对象的指针成员赋值给另一个对象的指针成员,将一个指针赋值给另一个指针,就会使两个指针指向同一个空间

    2.2K20

    面试题:CC++引用和指针的区别?

    面试题:C/C++引用和指针的区别? C/C++中的指针(pointer)和引用(reference)都是用来处理变量间的关系和交互的工具,但是它们有一些不同点。...指针可以重新赋值并指向其他对象,而引用在被初始化后就不能再指向其它的对象。 指针可以为空或无效(null),但是引用必须总是指向某个有效对象。 指针可以被比较,而引用没有比较运算符。...引用相当于指针的语法糖,它的声明和使用更为简便。 指针和引用的应用场景 指针通常用于动态内存分配、数组、字符串、函数参数传递等方面。...例如: int *p = new int[10]; char *str = "hello"; void swap(int *a, int *b); 引用通常用于函数参数传递、运算符重载、类成员变量等方面...指针可以重新赋值并指向其他对象,具有一定灵活性,通常用于动态内存分配、数组、字符串、函数参数传递等方面;引用不能重新赋值,但是定义和使用更为简便,通常用于函数参数传递、运算符重载、类成员变量等方面。

    11210

    C# unsafe 性能提升

    这通常在执行某些低级操作,或者需要与未托管代码(例如C或C++编写的代码)交互时非常有用。...创建和使用指针类型:在unsafe context中,可以声明和操作指针类型。例如,可以创建指向整数、浮点数或自定义类型的指针。...调用本地函数:如果你需要调用使用C或C++编写的本地DLL,那么可能需要使用到 unsafe代码。许多Windows API函数都需要指针参数,因此必须在unsafe context中调用它们。...与unsafe关键字结合使用的其他关键字和运算符主要包括以下几个: 指针操作符:这些操作符用于处理指针变量。 * (解引用操作符):返回指针指向的变量值。...->(成员选择操作符):访问指针指向的结构体或类的成员。 &(取址操作符):获取变量的地址。 fixed 关键字:在unsafe代码块中,可以使用fixed语句来固定一个变量,防止垃圾收集器移动它。

    48330

    C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱

    : 析构函数体->清除成员变量->析构基类部分(从右到左)->析构虚基类部分 所以上面代码中在test_lambda_base的析构函数中执行子类test_lambda的成员变量fun时,fun作为一个...因为问题的原因不是lambda表达捕获的this指针不对,而是在基类的析构函数中,lambda表达式所捕获的this指针所指向的子类对象部分的数据已经无效,不可引用了。...解决问题 解决这个问题的办法很多种, 总的原则就是:如果要在析构函数中调用lambda表达,就要避免lambda使用类成员变量, 对于这个例子,最简单的办法就是修改test_lambda构造函数...总结 如果在基类的析构函数中执行子类提供lambda表达式,lambda表达式中要避免使用子类中类成员变量。...因为这时子类的类成员变量已经被析构了,但是子类中的指针类型、基本数据类型变量因为不存在析构的问题所以还是可以用的。

    1.7K10
    领券