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

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

一、全局函数成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加参数是 对象本身指针 ; 在 Student 中 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...Student* pThis 在 列表开始位置 ; 详细代码 , 参考最后完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身成员 ; 在全局函数中 , 实现两个 Student 相加 , 接收两个...返回一个匿名对象 , 该匿名对象 是在 成员函数 中新创建对象 ; // 成员函数中, 两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个

17020

《C++Primer》第十六章 模板与泛型编程

: 模板中函数参数是const引用 函数体中条件判断仅使用<比较运算 通过函数参数设定为const引用,我们保证函数可以用于不能拷贝类型。...类型转换与模板类型参数 能在调用中应用于函数模板包括如下三: 顶层const无论是在形参中还是在实参中都会被忽略 const转换:可以一个非const对象引用(或指针)传递一个const引用...从右值引用函数参数推断类型 当一个函数参数是一个右值引用(即形如T&&),正常绑定规则告诉我们可以传递给它一个右值: template void f3(T&&); f3(42...显然)可以传递给它右值,也可以传递给它左值。...compare一个字符串字面常量或者一个数组时,编译器才会调用第二个版本,如果我们传递给它字符指针,就会调用第一个版本(我们无法一个指针转换为一个数组引用): const char *p1 = "hi

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

C++小结(1)

1. overload 仅仅返回值类型不同函数不能被重载. 2. 所谓私有,是指该成员只能被本身方法访问----即使是这个对象也不能直接访问. 3....表现在以下方面: (1)const成员函数:const位于形参括号之后,分号之前.该函数不能修改成员变量. (2)const:对一个说明使用了const,实际上是说明了一个const型this指针...指针用于: A:处理自由存储区中数据; B:访问成员数据和成员函数; C:通过引用传递方式给函数传递对象或变量. 7. 关键字new分配堆中内存。...*对一个被delete指针再次使用delete可能导致程序崩溃.解决办法是delete一个指针后.立即给它赋值0,而对一个空指针使用delete是安全....对一个指向对象指针使用new运算符分配空间时,会调用对象构造函数.与此类似,使用delete删除一个对象指针时,会调用一个析构函数. 9. 成员变量如果是指针变量。

57390

this指针介绍和用法

记录时间:2019-3-4 this指针介绍 this指针是面向对象程序设计概念,在C++中,它表示当前运行对象。在实现对象方法时,this指针来获得该对象自身引用。...this作用域是在内部,而且是在非静态成员函数中使用,实际引用并操作对象a成员。 当在非静态成员函数中访问非静态成员时候,编译器会自动将对象本身地址作为一个隐含参数传递函数。...在a非const成员函数里,this类型就是*a。但是this不是一个常规变量,所以不可以获取this地址或者给它赋值。...由此可见,this在成员函数开始前构造,在成员结束后清除。 这个生命周期同任一个函数参数是一样,没有任何区别。 当调用一个成员函数时,编译器指针作为函数this参数传递进去。...this是通过函数参数首参数来传递。this指针是在调用之前生成实例后函数,没有这个说法。在实例化时,只分配变量空间,并没有为函数分配空间。

45820

Java This和Super用法

如上面这段代码中,有一个成员变量name,同时在方法中有一个形式参数,名字也是name,然后在方法中将形式数name传递成员变量name,虽然我们可以看明白这个代码含义,但是作为Java编译器它是怎么判断呢到底是形式参数...为此在上面这个代码中,this.name代表就是对象中成员变量,又叫做对象属性,而后面的name则是方法形式参数,代码this.name=name就是形式参数传递成员变量。...(见下面Super 引用构造函数) Super super可以理解为是指向自己超(父)对象一个指针,而这个超指的是离自己最近一个。...(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数形参与成员数据同名,这时需用this来指明成员变量名) 调用super()必须写在子类构造方法第一行,否则编译不通过。...this和super不能同时出现在一个构造函数里面,因为this必然会调用其它构造函数,其它构造函数必然也会有super语句存在,所以在同一个构造函数里面有相同语句,就失去了语句意义,编译器也不会通过

83240

【Java】final关键字&权限修饰符&内部类&引用类型用法

局部变量 —— 引用类型 引用类型局部变量,被 fifinal 修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内 部成员变量值 修改,代码如下: 3....内部类 3.1 概述 什么是内部类 一个 A 定义在另一个 B 里面,里面的那个 A 就称为 内部类 , B 则称为 外部类 。...格式 使用方式 以接口为例,匿名内部类使用,代码如下: 定义接口: 创建匿名内部类,并调用: 通常在方法形式参数是接口或者抽象时,也可以匿名内部类作为参数传递。...定义武器增加攻击能力: 定义穿戴盔甲类,增加防御能力,也就是提升生命值: 定义角色: 测试作为成员变量时,对它进行赋值操作,实际上,是赋给它该类一个对象。...接口作为成员变量时,对它进行赋值操作,实际上,是赋给它该接口一个子类对象。 4.3 interface作为方法参数和返回值类型 当接口作为方法参数时 , 需要传递什么呢?

39850

c++面试题

C++多态性具体体现在运行和编译两个方面:在程序运行时多态性通过继承和虚函数来体现; 在程序编译时多态性体现在函数和运算符重载上 虚函数:在基中冠以关键字 virtual 成员函数。...10.引用”作为函数参数有哪些特点? (1)传递引用函数传递指针效果是一样。...“引用”与指针区别是什么? 指针通过某个指针变量指向一个对象后,对它所指向变量间接操作。程序中使用指针,程序可读性差;而引用本身就是目标变量别名,对引用操作就是对目标变量操作。...多态:是父对象设置成为和一个或更多子对象相等技术,赋值之后,父对象就可以根据当前赋值给它子对象特性以不同方式运作。简单说,就是一句话:允许子类类型指针赋值给父类型指针。...当子类重新定义了父函数后,父指针根据赋给它不同子类指针,动态调用属于子类函数,这样函数调用在编译期间是无法确定(调用子类函数地址无法给出)。

1.2K11

构造器、static、this 关键字讲解

2、构造器虽然有返回值(返回该类对象),但是不能定义返回类型 (返回值类型肯定是本类),不能在构造器里调用 return。 3、如果我们没有定义构造器,则系统会自动定义一个无参构造函数。...static关键字 在中,用 static 声明成员变量为静态成员变量. 1、它为该类公用变量,属于,被该类所有实例共享,在被载入时被显式初始化, 2、对于该类所有对象来说,static...4、用static声明方法为静态方法 5、不需要对象,就可以调用(名.方法名) 6、在调用该方法时,不会将对象引用传递给它,所以在 static 方法中不可访问非 static 成员。...7、可以通过对象引用名(不需要实例化)访问静态成员。...this 就由此产生了,通过 this (其实还有 super)隐式传入到每个普通方法上系统就可以分辨出是谁在调用这个方法,这样就可以达到一个方法多个对象使用。

35120

【C++】深入剖析C++11新特性

按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?因为:有些场景下,可能真的需要用右值去引用左值实现移动语义。当需要用右值引用引用一个左值时,可以通过move函数左值转化为右值。...(例如我们不能用模版参数来作为完美转发参数,因为在初识化时候就已经实例化了。) ---- 八、新功能 1.默认成员函数 原来C++中,有6个默认成员函数: 1....包装器包装成员函数时候,非静态函数一个参数需要传名,在赋值时候需要带上域,函数需要取地址,静态函数只需要在赋值时候需要带上域(这里建议都取地址,方便记忆)。...原因:静态成员函数没有 this 指针,所以 function 实例化时不需要添加一个成员函数所属类型参数,在调用时也不需要传递一个成员函数所属对象;而非静态成员则有,所以需要借助对象来传递...在使用包装了成员函数包装器时候,我们第一个参数也要传一个对象。

30840

JDK1.9-引用类型用法总结

基本类型可以作为成员变量、作为方法参数、作为方法返回值,那么当然引用 型也是可以。 1.1 class作为成员变量 在定义一个Role(游戏角色)时,代码如下: ?...定义武器增加攻击能力: ? 定义穿戴盔甲类,增加防御能力,也就是提升生命值: ? 定义角色: ?...,对它进行赋值操作,实际上,是赋给它该类一个对象。...接口作为成员变量时,对它进行赋值操作,实际上,是赋给它该接口一个子类对象。 4.3 interface作为方法参数和返回值类型 当接口作为方法参数时,需要传递什么呢?...所以,当我们看见 List 接口作为参数或者返回值类型时,当然可以 ArrayList 对象进行传递或返回。 请观察如下方法:获取某集合中所有的偶数。

37010

【Example】C++ 回调函数及 std::function 与 std::bind

一,回调函数 回调函数创建步骤大概为: 1,声明一个函数指针类型。 2,拟写使用回调函数函数函数指针类型及变量名声明作为参数传递。...3,拟写符合函数指针类型实现函数实现函数指针作为参数传递给使用它函数。...二、std::function 与 std::bind 上面演示了最简单回调函数创建及使用,然而,上面的代码却出现了一个局限性,就是: 如果需要去回调一个成员函数函数指针则无法指向成员函数。...当用作成员函数绑定时,第一个参数仍然是作为成员可调用对象引用,第二个参数则是对象指针,而第三个参数开始对应可调用对象参数表。...: 1,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptr 与 std::unique_ptr),指向访问其成员对象。

4.3K30

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

名空间支持是一C++特性,旨在让我们比阿尼写大型程序以及多个厂商现有代码组合起来程序时更容易。...返回引用时,应避免返回函数终止时不再存在内存单元引用(在指针里说过同样的话)。 为避免这种问题,最简单方法就是:返回一个作为参数传递函数引用。 ---- 何时使用引用参数? 想用时候呗。...数据对象是对象,使用const引用设计语义常常要求使用引用,因此,在传递对象参数标准方式是按引用传递。 对于修改调用函数中数据函数: 如果数据对象是内置数据类型,使用指针。...派生对象包含一个指向独立地址表指针。如果派生提供了虚函数新定义,该函数保存新函数地址;如果派生没有重新定义虚函数,该vtbl保存函数原始版本地址。...cout<<"这是友元函数通过对象引用直接访问私有变量例子!"

57310

C++中与有关注意事项(更新中~~~)

,尽管先定义了它对象成员,不过它不会立即调用其默认构造函数,而是去看看你有没有写相应初始化(注意:这里是指在里面,而不是指main函数内以及函数,对于函数应注意,在定义同时必须给它附上一定值...里面的任何成员变量在定义时是不能初始化,尽管你可以编译过。 一个对象调用了一次构造函数之后,是不允许再次调用构造函数。...如果一个是另一个友元,那么该类友元函数将不能访问另一个私有成员。...关于运算符重载需要注意以下几点: 作为成员重载函数(以名作为返回类型),其形参看起来比操作数少一个,因为隐式传递,限定为第一个操作数,举个例子,如下: T operator + (const Data...+,自增完后返回一个临时*/ 赋值必须返回对*this引用(如+=, =) 下标运算符 [ ] 一般作为成员函数,中间加上const就更好了。

69720

static使用总结

也不能在构造函数中初始化该成员,因为静态数据成员各个对象共享,否则每次创建一个对象则静态数据成员都要被重新初始化静态成员可以被初始化,但只能在体外进行初始化。...一般形式:数据类型 名::静态数据成员名=初值。 静态成员不可在体内进行赋值,因为它是被所有该类对象所共享。你在一个对象里给它赋值,其他对象里成员也会发生变化。...静态成员属于整个所有,不需要依赖任何对象,它在对象中不占用存储空间。 静态成员仍然遵循public,private,protected访问准则。 可以通过名直接访问public 静态成员。...可以通过对象名访问public静态成员静态函数 静态成员函数和静态数据成员一样,它们都属于静态成员,它们都不是对象成员,所以对静态成员引用不需要用对象名。...静态函数成员必须通过参数列表中传递对象指针来实现对对象非静态成员变量进行访问。

1K20

java基础提升篇:Static关键字

可以通过引用或者名访问静态成员   原来一个里面的成员变量,每new一个对象,这个对象就有一份自己成员变量,因为这些成员变量都不是静态成员变量。...不需要对象,就可以调用(名.方法名) 在调用该方法时,不会将对象引用传递给它,所以在static方法中不可访问非static成员。 【实例1】 student: ?...这个例子没有这个实例化,所以没有用到构造函数。倘若需要实例化该类时候,则构造方法执行顺序也是在静态初始化块之后。...”一个引用对象,通过属性值就可以找到位于数据区里面的字符串对象“mimi”。...非静态成员专属于某一个对象,想访问非静态成员必须new一个对象出来才能访问。   静态变量可以通过对象名去访问,也可以通过名去访问,两者访问都是同一块内存。

26220

C++ 构造函数和析构函数

不允许使用数据成员初始值设定 }; 因此,初始化只能发生在创建对象过程中,但是由于访问权限原因,无法在外访问某些成员变量,因此下面这种做法有时候是无效: circle C1; // 实例化一个对象...众所周知,在数值作为函数参数进行传递时候,会重新拷贝出来一份数据作为参数传递用完即销毁,这种方式不仅浪费了内存空间,而且无法修改原始数据。为了结合这两者之间优点,于是经常采取引用作为函数参数。...综上:同一个所有实例化出来对象共享同一份静态成员变量,所以一改全改。既然同一个不同对象共享同一份成员函数,那么成员函数怎么区分该访问哪个对象普通成员变量呢?...3、this指针 接着上一小节问题,this指针为上述问题提供了一个完美的解决方案,它指向用来调用成员函数对象(被当作参数隐式地传递成员函数),我们通过一张图来理解它: 此外,this指针一个用途是当成员函数需要返回对象时...**由于函数通过传递方式返回 person 类型,所以整个 person 类型复制了一份返回,返回值继续调用 addPerson(p1), **最后结果赋值给了新对象 p3。

93100

Python与面向对象

用于定义如何使用成员变量,因此一个行为和接口是通过方法来定义 方法和变量: 私有:内部使用 公共:外部可见 面向对象程序设计方法 所有的东西都是对象 程序是一大堆对象组合 通过消息传递,各对象知道自己该做什么...一个重要特性为“能发什么样消息给它” 同一个所有对象都能接收相同消息 对象接口 定义一个后,可以根据需要实例化出多个对象 如何利用对象完成真正有用工作?...状态和转换这些状态操作 数据: 变量:类属性 方法: 函数:操作变量引用数据代码 间关系 依赖:一个方法操作另外一个对象 聚合:A对象包含B对象 继承:描述特殊与一般关系 面向对象编程原则..._字典属性或Python内置dir()函数来获取属性 实例属性 实例仅拥有数据属性(严格意义上来说,方法是类属性) 这些数据属性独立于其它实例或 方法中可用变量 实例变量:指定变量名称及实例自身进行引用...Python运算 可重载所有Python表达式运算符 也可重载打印、函数调用、属性点号运算等内置运算 重载使实例行为像内置类型 重载通过提供特殊名称方法实现 运算符重载并非必需,并且通常也不是默认

1K80

C++——构造函数使用注意事项及static用法

引用成员 const成员变量 自定义类型成员函数(该类没有默认成员函数) 必须放在初始化列表位置初始化 #include using namespace std; class A...const int _n;//const A _aobj;//没有默认构造函数 }; int main() { return 0; } 引用、const修饰必须在定义时候初始化 而自定义类型...没有默认构造函数即不用传参就可以调用函数 (没有给它赋值) 也就需要定义时候初始化 例题 #include using namespace std; class A { public...成员变量在中声明次序就是初始化列表初始化顺序,与其初始化列表中先后次序无关 _a2声明在前面 所以先初始化 _a2,先进行 _a2(_a1),而此时_a1为随机值,所以_a2为随机值 然后才进行...传值给 a ,属于值传递,发生了拷贝调用 由于 f1 函数 是 值返回 ,所以 会再次发生 拷贝调用,生成一个临时对象 所以 f1(a1)共产生 2个对象 同理 , f1(a2)也产生 2个对象 共有

52520

Java抽象与oop三大特征

调用方法时通过传递给它不同参数个数和参数类型给它不同参数个数和参数类型给它不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性; 重载时候,方法名要一样,但是参数类型和个数不一样...同一个事件发生在不同对象上会产生不同结果。 多态存在三个必要条件 多态弊端 : 提高扩展性,但是只能使用父引用指向父成员。...注意: 在多态情况下,字符存在同名成员成员变量和成员函数)时,访问是父成员,只有是同名非静态成员函数时,才访问子类成员函数; 多态用于 形参 类型时,可以接受多个类型数据; 多态用于返回类型时...对于前半句意思就是:当父变量引用子类对象时,在调用成员函数时,应该调用向子类成员函数,但前提是此函数时被子类重写函数。 A B C D继承关系如下: ?...对于4,本来由于a2引用是其子类B一个对象,因此调用成员函数应为B.show(B obj),但是由于B.show(B obj)不是重写函数,因此不会调用B.show(B obj)。

77040
领券