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

每日一问:c++成员函数,能作为线程参数

问:类成员函数可以传入线程参数? 回答: 如果c语言全局函数可以。 如果是类静态成员函数可以 如果是类普通成员函数,不可以 为什么?...《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态,虚函数,那么我们有以下结论: (1) &类名::函数名 获取成员函数实际地址; (2) 对于函数x来讲obj.x()编译器转化后表现为...x(&obj),&obj作为this指针传入; (3) 无法通过强制类型转换在类成员函数指针与其外形几乎一样普通函数指针之间进行有效转换。...所以,要在回调函数中传入一个类普通成员函数时,this指针无处安放使得回调函数比较复杂。 怎么解决?...,该函数参数为void*,返回值为void* FUNC callback = (FUNC)&MyClass::func;//强制转换func()类型 int ret

2.2K30

C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法 函数对象 参数是值传递 )

文章目录 一、函数对象中存储状态 1、函数对象中存储状态简介 2、示例分析 二、函数对象作为参数传递时值传递问题 1、for_each 算法 函数对象 参数是值传递 2、代码示例 - for_each...函数 函数对象 参数在外部不保留状态 3、代码示例 - for_each 函数 函数对象 返回值 一、函数对象中存储状态 1、函数对象中存储状态简介 在 C++ 语言中 , 函数对象 / 仿函数...() 来实现 ; 函数对象一个重要特性是 " 可以存储状态 " ; 这意味着你可以 在类成员变量中存储数据 , 这些数据可以函数调用之间保持不变 ; 普通函数 是 无法存储状态 , 因为...在 多次函数调用 之间不变情况下非常有用 , 例如 : 在 STL 算法中 , 函数对象经常被用作 谓词 或 用于在容器每个元素上执行某种操作函数 , 由于它们可以存储状态 , 因此可以根据算法需要进行定制...二、函数对象作为参数传递时值传递问题 1、for_each 算法 函数对象 参数是值传递 下面开始分析 for_each 函数函数对象 作为参数 具体细节 ; for_each 算法调用代码如下

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

揭开了「对象」神秘面纱,就这?

比如规则系统接收蛇、食物、障碍物作为参数可以判定是否吃到食物或者碰到墙壁。 动画系统则可以接收蛇、食物、障碍物等作为参数,然后在屏幕上动态显示出来。...我们都知道函数在 C/C++、Java 这类语言中都不是一等公民,一等公民意思就是能够像其它整数、字符串变量一样,可以被赋值或者作为函数参数、返回值等。...我们可以函数作为参数传递给其它函数,那么这里其实就有了多态雏形,我们可以传递不同函数来实现不同行为。...所以当调用成员函数时候,我们还需要传入一个参数 this,用来指代当前是哪个对象在调用。 由于 C 语言不支持面向对象,所以我们需要手动 animal 作为参数传递给 eat、work 函数。...,经过编译器之后会变成下面这个样子: eat(animal, "牛肉"); work(animal); 然后,编译器还会在编译阶段默默地 this 作为成员函数一个形参添加到参数列表。

76010

闭关多日,整理一份C++中那些重要又容易忽视细节

文章目录 基础篇 喜欢用内联函数? 头文件与名空间,好用吧! 引用 返回引用高效性 何时使用引用参数? 类 控制对成员访问,是公有?是私有?...C++在编译时候,会将每个函数编译成一条条机器语言指令,在执行常规函数时,程序将会跳转到相应地址,参数复制到堆栈,跳到标记函数起点内存单元,执行函数代码,并在函数结束时返回。...返回引用时,应避免返回函数终止时不再存在内存单元引用(在指针里说过同样的话)。 为避免这种问题,最简单方法就是:返回一个作为参数传递函数引用。 ---- 何时使用引用参数? 想用时候呗。...---- 运算符重载 C++允许运算符重载扩展到用户定义类型,重载运算符可以使代码看起来更自然。...非成员函数可以访问类中公有成员,但是如果数据成员都定义为公有的,这又破坏了隐藏特性。

57410

C++初阶 类和对象(下)

为什么这个形参得是被类对象引用呢,直接传递这个要拷贝目标不可以,不是一样操作。...1.4 拷贝构造函数有什么用? 学到这里,大家恐怕也是明白了,拷贝构造函数就是简单地目标内容拷贝给新定义对象罢了, 那么它有用,这是很多初学者疑惑,实际上它不仅仅是有用,它是很有用。...,d2);就不能d1+d2C++中,是可以实现,这个操作就叫做运算符重载,也就是对运算符进行补充定义。...想说是,这样多少有点舍本逐末了,因为在C++中之所以会有类原因,有一部分就是因为多个结构体函数和变量过于混乱,而按你方法去做,那么这个类成员变量所有人都可以进行操作,那哪还有什么规矩,这个类创建又有什么意义....作为成员函数重载时,其形参看起来比操作数数目少1,因为成员函数第一个参数为隐 藏this 5. .* :: sizeof ?

14110

C++之类和对象

访问限定符 在类和对象阶段主要研究C++封装,而C++实现封装方法是用类将对象属性和方法结合到一块,让对象更加完善,通过访问权限选择接口提供给外部用户使用。...解答:this指针作为参数传递时是可以为空,但是如果成员函数用到了this指针,可能会造成空指针解引用。 3.下面两段代码运行结果分别是什么? //下面两段代码编译运行结果是?...而this指针作为参数传递时是允许为空,在成员函数里也没有对this指针进行解引用。 代码2运行崩溃,因为在成员函数中对this指针进行解引用了,而this指针是一个空指针。...最后,我们来做几个思考题: const对象可以调用非const成员函数?-- 不可以,权限扩大; 非const对象可以调用const成员函数?...-- 可以,权限缩小; const成员函数可以调用其它非const成员函数?-- 不可以,权限扩大; 非const成员函数可以调用其它const成员函数

1.1K00

C++】类与对象(上)

浸泡可以选不同水温,水质等; 柔洗可以选择不同洗涤剂,揉搓力度等; 晾干可以选择不同方式,自然风干,加热速干等; 这些都是每一类中属性,那么单有属性是不可以,我们还需要行动即方法。...调用函数时,是通过其地址去找到函数,那么是函数指针?? 2.类对象存储方式猜测 那成员函数到底怎么存储呢??...C++ 中通过引入 this 指针解决该问题,即: C++ 编译器给每个 “ 非静态成员函数 “ 增加了一个隐藏 指针参数,让该指针指向当前对象 ( 函数运行时调用该函数对象 ) ,在函数体中所有...this 指针本质上是 “ 成员函数形参 ,当对象调用成员函数时,将对象地址作为实参传递给 this 形参。所以 对象中不存储 this 指针 。...1.p本身就作为地址,直接传递给void Print(),p为空指针,但没有解引用,可以

35710

C++初阶-类和对象上

C++是基于面向对象,关注是对象,一件事情拆分成不同对象,靠对象之间交互完成。...五、类访问限定符及封装 1、访问限定符 C++封装方式: 用类将对象属性与方法结合在一块,让对象更加完善,通过访问权限选择将其接口提供给外部用户使用 分类: public(公有):...,由此引入this指针 具体操作: C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有成员变量操作,都是通过该指针去访问...this指针类型:类类型* const 只能在“成员函数内部使用 this指针本质上其实是一个成员函数形参,是对象调用成员函数时,将对象地址作为实参传递给this形参...而this指针参数则是存放在寄存器中。类静态成员函数因为没有this指针这个参数,所以类静态成员函数也就无法调用类非静态成员变量 this指针可以为空

46350

日更系列:使用函数指针小伎俩

这个接口函数可以是普通函数,类静态函数,类成员函数可以? 三、使用类成员函数作为函数指针可以 再来看一个例子: 我们有1个接口类,和个实现接口类实现类。...,然后认为需要遵守函数单一指责原则。...然后在do里面另分出一个truncate函数,然后把truncated_calculator_vec->IsTrancated传递过去,这样是否可行,能这样写?...在实现方面,编译器不能使用简单函数地址,因为你不知道要调用地址(想想虚函数)。当然,还需要知道对象才能提供this隐式参数。 如果要提供指向现有代码函数指针,应该编写类静态成员函数。...静态成员函数不需要this,因此需要将该对象作为显式参数传入。 但是如果非要传入成员函数咋办,因为有时候成员函数会改变类一些成员变量,不能静态化。

70060

C++初阶】类和对象修炼上

这一专题是C++学习者第一道小坎,分为上中下三节给大家讲解 类和对象上:类和对象引入,包括一些细碎知识点,包括面向对象思想,类实例化,this指针等 类和对象中:类和对象中六大默认成员函数中最常用...,成员函数放在公共代码段中 优点:节约了空间.猜想合理且成立 ps:其实仔细一想我们也能理解,我们在C语言中写函数目的就是为了防止重复造轮子,打印你这个数组和打印这个数组,其实都可以只调用一个函数...指针 还记得第7点我们讲类中成员函数存储布局?...只能在“成员函数内部使用 this指针本质上是“成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。...this指针是“成员函数”第一个隐含指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递 其实:我们细想一下,我们在学C语言时候,对于传参,我们一般都是选择传一个变量(比如栈或数组

66540

《逆袭进大厂》第三弹之C++提高篇79问79答

例如,绘画程序中,shape作为一个基类可以派生出圆形、矩形、正方形、梯形等, 如果要求面积总和的话,那么会可以使用一个 shape * 数组,只要依次调用派生类area()函数了。...函数指针还允许函数作为变元传递给其他函数; 5) 两种方法赋值: 指针名 = 函数名; 指针名 = &函数名 114、 内存泄漏后果?如何监测?解决方法?...当在类非静态成员函数访问类非静态成员时,编译器会自动将对象地址传给作为隐含参数传递函数,这个隐含参数就是this指针。...166、引用作为函数参数有哪些好处? 1) 传递引用给函数传递指针效果是一样。...如果你把函数指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向函数时,我们就说这是回调函数; 4) 因为可以把调用者与被调用者分开。

2.2K30

C++程序员经常问11个问题

C++程序员经常问11个问题 这篇文章收了好长时间,但还是觉得贴出来,作为收藏,在网上这样浮躁环境,很少能认认真真地看这样长文章,有时间也要把《Effective C++读书笔记作出来...要点2:用引用传递参数时应注意地方   在用引用传递参数时,最好把引用声明为const类型。这样做好处是:告诉程序不能修改这个参数。...在下面的这个例子中函数f()就是传递引用: void f(const int & i); int main() {  f(2); /* OK */ }    这个程序传递一个参数2给f()...要点5:避免使用复杂构造指向函数指针   指向函数指针是C++中可读性最差语法之一。你能告诉下面语句意思?...指向成员指针是C++语法中最难以理解构造之一,但是这也是一个C++最强大特性。它可以让你调用一个类函数成员而不必知道这个函数名字。这 一个非常敏捷调用工具。

84320

C++】类和对象(第一篇)

4.1 访问限定符 C++实现封装方式:用类将对象属性(成员变量)与方法(成员函数)结合在一块,让对象更加完善,通过访问权限选择将其接口提供给外部用户使用: 【访问限定符说明】 class...即:C++编译器给每个“非静态成员函数“增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有“成员变量”操作,都是通过该指针去访问。...比如在上面的Date类中,this指针类型就是Date* const 只能在“成员函数内部使用 this指针本质上是“成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给this形参...C语言和C++实现栈Stack对比 回忆一下,我们当时C语言实现栈是怎么写可以看到,在用C语言实现时,Stack相关操作函数有以下共性: 每个函数第一个参数都是Stack* 函数中必须要对第一个参数检测...那C++要实现栈呢: C++中通过类可以数据 以及 操作数据方法进行完美结合,通过访问权限可以控制哪些方法在类外可以被调用,即封装,在使用时就像使用自己成员一样,更符合人类对一件事物认知。

11010

c++】类和对象(二)this指针

this指针是隐式传递成员函数,是成员函数一个隐含参数 可以理解为,编译器处理后处理为上述样子,调用地方,编译器也会处理: 它会把调用对象当做形参进行传递 这里我们也能知道,为什么...,某些编译器可能选择this指针存储在某个寄存器中,尤其是在成员函数调用时。...: 每个函数第一个参数都是Stack* 函数中必须要对第一个参数检测,因为该参数可能会为NULL 函数中都是通过Stack*参数操作栈 调用时必须传递Stack结构体变量地址 结构体中只能定义存放数据结构...+中通过类可以数据以及数据方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己成员一样,更符合人类对一件事物认知。...而且每个方法不需要传递Stack*参数了,编译器编译之后该参数会自动还原,即C++中 Stack * 参数是编译器维护,C语言中需用用户自己维护 感谢大家阅读!!!

7210

C++】类和对象 (上篇)

,它会到整个类中去寻找,然后再到全局去寻找;所以在C++中,我们是可以成员变量定义成员函数后面的; 上面解释了成员函数定义在成员变量之前可行性,下面借用 《高质量C/C++编程》中解释来阐述为什么要将成员函数定义在成员变量前面...,但可以修改其指向对象 (我们可以通过 this 指针修改成员变量值,但不能让 this 指向其他对象) this 指针本质上是“成员函数一个形参,当对象调用成员函数时,将对象地址作为实参传递给...; 2、this 指针可以为空?...答:this 指针作为参数传递时是可以为空,但是如果成员函数中使用到了 this 指针,那么就会造成对空指针解引用; 3、下面这两个程序编译运行结果分别是什么?...,编译器会直接把这个指针作为形参传递给Print函数 this 指针,而 this 作为参数传递是时可以为空,在Print函数内部我们也并没有对 this 指针进行解引用。

58600

C++之面向对象(上)

1.类定义 继承自C语言struct可以作为关键字,但是C++也有定义类新关键字class。...答:这个问题是因为C++中引入了this指针这个概念,即:C++编译器给每个“非静态成员函数”增加了一个隐藏this指针参数,让this指针指向当前对象(还是南湖运行时,调用函数对象),在函数中所有...this指针存在函数调用时函数栈帧里,即栈区。 2.this指针可以为空(nullptr)? 看以下两个选择题: //1.以下程序编译运行结果是?...相关操作函数由以下共性: 每个函数第一个参数都是Stack*; 函数中必须要对第一个参数进行检测,避免该参数为NULL,造成程序崩溃; 函数都是通过Stack*指针参数操作栈函数调用必须传递Stack...而且每个方法不需要传递Stack*参数,编译器编译之后参数会自动还原,即C++中Stack*参数是由编译器进行维护,而C语言中需要用户自己维护。

30120

【细品C++】初识类和对象

C++中通过引入this指针解决该问题,即:C++编译器给每个非静态成员函数(即没有static修饰成员函数)增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数对象),在函数体中所有...this指针本质上是成员函数形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。...this指针只是在调用成员函数作为形参传参,所以只有调用成员函数时this指针才存在,并且是跟普通形参一样,存在新开函数栈帧中,也就是栈区。 this指针可以为空?...C++中通过类可以数据以及操作数据方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己成员一样,更符合人类对一件事物认知。...而且每个方法不需要传递指针参数了,编译器编译之后该参数会自动还原,即C++中指针参数(this)是编译器维护,C语言中需用用户自己维护。

14730

c++面试选择题_C语言经典笔试题

8.“引用”作为函数参数有哪些特点? (1)传递引用给函数传递指针效果是一样。...(2)使用引用传递函数参数,在内存中并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本;如果传递是对象,还将调用拷贝构造函数...10.“引用”作为函数返回值类型格式、好处和需要遵守规则?...(3)可以返回类成员引用,但最好是const。这条原则可以参照Effective C++[1]Item 30。...注意当数组作为函数参数进行传递时,该数组自动退化为同类型指针。

1.1K10
领券