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

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

---- 1. this指针 在上篇讲C++,对象,封装,继承(派生),多态的时候,this指针出现在成员函数,并使用->成员提取符操作成员变量。... C++ ,每一个对象都能通过 this 指针来访问自己的地址,this 指针是所有成员函数的隐含参数,实际上成员函数默认第一个参数T* const register this,this指针成员函数的开始执行前构造的...静态成员 变量或者函数前面加上关键字:static,它就变了一个静态变量或者静态函数,当static出现在中被修饰成员,被成为静态成员。...而静态成员无需构造对象情况下,可以使用名访问。...友元函数友元 所谓友元函数,就是,用friend关键字声明一个函数,这个函数的声明,但不作为成员函数,虽然友元函数不属于成员函数,却可以访问成员,不论成员是public,pirvate

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

【Kotlin】的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数定义成员属性 | 次构造函数 | 构造函数默认参数 )

文章目录 一、主构造函数定义临时变量 二、主构造函数定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- Kotlin , 可以 声明 时 名后...定义 " 主构造函数 " ; 构造函数 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 构造函数 , 可以定义 临时变量 , 临时变量 一般使用 以下划线开头 的名称...---- 构造函数 定义临时变量 , 格式 : class 名(_临时变量名: 临时变量类型){} 构造函数也可以 定义成员属性 , 格式 : class 名(var 成员属性名:...成员属性类型){} 代码示例 : class Hello( // 主构造函数, 直接在主构造函数定义属性 var name: String, var age: Int ){}...---- Kotlin 只允许 定义时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义 Kotlin 内部 , 可以定义 多个 次构造函数

4.8K20

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

一、常量成员函数 1、const 修饰成员函数分析 C++ , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 下面的 Student , 定义了 void fun(int... * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // void...使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 对象的 任何成员变量 ; class Student { public: void fun

18520

【小家java】静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑

如果超没有不带参数的构造器,并且子类的构造器又没有显式地调用超的其他构造器,则 java 编译器将报告错误 情况四:子类和父有同名同类型的静态常量的时候 public class Main...我觉得脑子里应该浮现出一个这样的知识点: Java赋值顺序: 1、父静态变量赋值 2、自身的静态变量赋值 3、父成员变量赋值和父块赋值 4、父构造函数赋值 5、自身成员变量赋值和自身块赋值...因此上面如果我们这样写static final int b=112它哪怕准备阶段,值就应该是112了 的初始化阶段:需要做的是执行构造器(请注意:这里不是指的构造函数)。...构造器:编译器收集所有静态语句块和变量的赋值语句,按语句源码的顺序合并生成构造器 因此现在执行:st = new StaticTest().此时我们发现,就会进行对象的初始化了(看到没,这个时候...b变量的赋值语句还没有执行哦~~~) 而对象初始化的顺序成员变量 -> 普通代码块 -> 构造函数 因此这一波过后:a=110了。

1.4K20

为什么应该尽可能避免静态构造函数初始化静态字段?

不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...如下所示的两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo没有显式定义静态构造函数,但是编译器会创建一个默认的静态构造函数,针对静态字段的初始化就放在这里。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

16510

【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 成员变量 提供初始值 ; 初始化列表 可以 调用 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 const 成员变量初始化 1、初始化 const 常量成员 如果 定义了 被 const 修饰 的 成员变量...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

18530

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

, 这个增加的参数是 对象本身的指针 ; Student , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...的 print 成员函数 , 转为 全局函数 , 转换后的代码 : // 将成员函数 void print() // 转为 全局函数 void Student_print(Student* pThis...Student* pThis 列表的开始位置 ; 详细代码 , 参考最后的完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身的成员 ; 全局函数 , 实现两个 Student 相加 , 接收两个...---- Student 定义了有参构造函数 , 则其默认的无参构造函数 , 就不会生成 ; // 带参构造函数 Student(int age, int height) { this

18120

【Groovy】Groovy 方法调用 ( Groovy 构造函数成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

文章目录 一、Groovy 构造函数成员赋值 二、Groovy 函数的参数传递与键值对参数 三、完整代码示例 一、Groovy 构造函数成员赋值 ---- Groovy 没有定义构造函数 ,...但是可以使用如下形式的构造函数 , Groovy 设置初始值 ; new 名(成员名1: 成员值1, 成员名2: 成员值2) 顺序随意 : 成员的顺序随意 , 没有强制要求 , 只需要 成员名...student2 : ${student2.name} , ${student2.age}" println "student3 : ${student3.name} , ${student3.age}" 执行结果...: student : Tom , 18 student2 : Jerry , 16 student3 : Jim , null 二、Groovy 函数的参数传递与键值对参数 ---- Groovy...的构造函数 , 可以使用 成员名1: 成员值1, 成员名2: 成员值2 类型的参数 , 这是键值对 map 类型的集合 ; 但是对于普通的函数 , 不能使用上述格式 , 如果出现 变量名1: 变量值

9.1K20

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

地方 , 都可以使用 " 公有继承 " 的 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 私有继承 " 的 派生 , 是 不具有 基 的 完整功能的 , 因为 最终继承 后的派生 , 无法 外部调用 父的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父对象 使用 ; 赋值 : 将 子类对象 赋值给 父对象 ; 初始化 : 使用 子类对象 对象 初始化 ; 指针 : 父指针 指向...子类对象 , 父指针 子类对象 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型的引用 ; 二...// 通过父指针调用父函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父指针函数 // 也是可以的 fun_pointer

23020

如何把CPP源程序改写成C语言?

下面对C++的一些特性,以及如何在c里实现或者替代,作一些初步的探讨: 说明: 函数Ixxxx的构造函数的实现。 原成员函数改为前缀结构体名+‘_’的函数。...函数指针U的析构函数的声明; C语言学习资源汇总【最新版】 U+结构体名称为原的析构函数的实现; Fun-_+结构体名为对该结构体成员函数指针进行指向; 以后遇到上述情况将不再说明。...成员函数里,实际上参数列里也隐含有一个指向自身的this指针。 3)对于静态成员则要定义成全局变量或全局函数,因为结构体不能有静态成员。...二.构造函数 实例化的时候会调用的缺省构造函数struct里,要定义一个同名函数指针指向一个具有构造函数功能的初始化函数,与构造函数不同的是,要在初始化函数里加入进行函数指针初始化的语句....成员函数U需要像一般成员函数一样fun_名()函数中指定。 的析构函数是由系统调用的,C则要显式调用。至于何时调用,要准确判断。

2.1K20

C++心决之类和对象详解(下篇)(封装进阶篇)

再谈构造函数 1.1 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值。...成员变量 声明次序 就是其初始化列表的 初始化顺序 ,与其初始化列表的先后次序无关 1.3 explicit关键字 构造函数不仅可以构造与初始化对象, 对于接收单个参数的构造函数,...不可以,非静态成员函数是要隐式的传this指针的,而静态成员函数没有this指针 2. 非静态成员函数可以调用静态成员函数吗?...,但不是成员函数 友元函数不能用const修饰(友元函数并不是成员函数成员函数中有this指针,this指针才需要被const修饰)(非成员函数不允许使用类型限定符) 友元函数可以定义的任何地方声明...比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time的私有成员变量,但想在Time访问Date私有的成员变量则不行。

7910

【C++】与对象—— 初始化列表 、static 静态成员

与对象 1 再谈构造函数 1.1 构造函数体赋值 创建对象时,编译器通过调用构造函数,给对象各个成员变量一个合适的初始值,以我们之前实现的Date对象例。...所以一般建议养成使用初始化列表的习惯,这样可以避免某些意想不到的编译错误,特别是遇到包含构造函数初始值的成员时。 初始化顺序: 显然构造函数每个成员只能出现一次。...注意: 每个成员变量初始化列表只能出现一次(初始化只能一次) 包括以下成员,必须在初始化列表进行初始化 : 引用成员变量 const成员变量 自定义类型成员(并且该类没有默认构造函数时)...静态成员变量的类型可以是常量,引用,指针类型等。 并且,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。...总结 静态成员所有对象所共享,不属于某个具体的对象,存放在静态静态成员变量必须在外定义,定义时不添加static关键字,只是声明 静态成员即可用 名 :: 静态成员 或者 对象.静态成员

26210

C++知识概要

静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员的所有对象中共享的成员,而不是某个对象的成员。...后者是把构造、析构函数设为 protected 属性,再用子类来动态创建 建立的对象有两种方式: 静态建立,静态建立一个对象,就是由编译器对象栈空间中分配内存; 动态建立,就是使用 new...这个过程分为两步,第一步执行operator new()函数搜索一块内存并进行分配;第二步调用构造函数构造对象 什么情况会自动生成默认构造函数 带有默认构造函数成员对象 带有默认构造函数的基...带有一个虚函数 带有一个虚基 合成的默认构造函数,只有基子对象和成员对象会被初始化。...this 指针调用成员变量时,堆栈会发生什么变化 当在的非静态成员函数访问的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是 this 指针

1.1K20

【笔记】C++面向对象高级编程

, 作用域结束的时候就会被清理, 也称为自动对象 函数定义的静态对象函数作用域结束后依然存在, 直到程序结束 全局域定义的称为全局对象, 也属于一种静态对象, 同样到程序结束才结束 静态成员必须外定义...委托, 利用指针实现, 功能来自内一个指向另一个指针 构造的时候都是从小到大(从父到子类), 析构则相反, 内存分配也是大套小的 设计模式 普通单例: 静态成员内, 只要一写出这个就会构造...Meyers单例: 核心的静态成员放在函数体内, 这样主动调用这个之前都不会进行构造 模板方法: 是继承和虚函数的一种典型应用....因此我们说多态继承的时候是继承了函数的调用权而不是函数本身的空间 虚指针指向虚函数表, 虚函数表按照目标函数的声明顺序对函数地址指针进行排列, 函数指针指向代码段函数代码位置 对象的函数调用分为静态绑定和动态绑定两种..., 静态绑定是指非虚函数和不满足多态条件的虚函数调用, 静态绑定的情况下, 编译后的代码实际上直接调用call跳转到真正函数的地址进行执行 动态函数绑定需要满足三个条件: 通过指针进行调用, 指针是从子类上转型到父

89630

【C++】特殊的设计 | 类型转换

创建 为了保证每次获取的都是同一个对象,就定义了一个静态类型的指针 _p 而静态成员变量,需要在外面初始化 ---- 定义静态成员变量时 创建对象 ---- 此时也可添加add增加和print...) 饿汉模式的代码的基础上进行改造 ---- 定义静态成员变量时设置空 ---- 若_p指针空,创建对象,并返回 调用getinstallce函数时才创建对象 ---- 虽然看似没有问题...,但是多线程下还存在线程安全的问题 定义一个静态锁,用于保护getinstallce函数的实例对象 ---- 初始化时,是不需要显示给值的 ---- 每次获取对象都要加锁解锁,但实际上只需要保证第一次即可...,则都是使用 成员静态指针进行new创建对象的,谁先new是控制不住的 而两者都是饿汉,则都是getinstallce函数创建对象, 可以控制单例1先在getinstallce函数创建对象,再让单例...5 因为编译器进行优化,把a的值放入寄存器,而b所修改实际上是寄存器的a值而不是内存的a值,所以a依旧10 dynamic_cast C++独有的 dynamic_cast用于将一个父对象的指针

16430

C++:特殊设计和四种类型转换

一、特殊设计 1.1 不能被拷贝的 拷贝只会放生在两个场景:拷贝构造函数以及赋值运算符重载,因此想要让一个禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。...将构造函数私有,拷贝构造声明成私有(可以直接delete掉)。防止别人调用拷贝栈上生成对象。 注意:拷贝构造可以直接delete掉,但是构造函数不行!!...因为我们还需要利用构造函数堆上创建对象。 2. 提供一个静态成员函数静态成员函数完成堆对象的创建。...注意:这里涉及到的是先有鸡还是先有蛋的问题,因为如果不去创建这个对象就没有办法去调用他的构造函数,但是没有调用构造函数就没有办法创建对象。所以这里必须通过静态成员函数的返回值去构造堆对象。...这里有两个方案:一种是设置能静态成员函数域调用),一种是设置成普通成员函数(对象自己调用)。

9610

C++核心编程学习

, 属性2(值2), 属性3(值3)...{}; 7、对象作为成员 构造函数及其析构函数的顺序:构造函数::由里到外,,,, 析构函数::由外到里 8、静态成员 静态成员变量:所有对象共享同一个数据...声明对象前加const称该对象常对象,常对象只能调用常函数; 12、友元(目的就是让一个函数访问内的私有成员) (1)全局函数做友元: 内任意位置:friend void func(const...,所有的非静态成员变量(包括private)都要继承到子类(不论权限);只是子类访问的时候,编译器会把private类型的数据隐藏起来 先构造父亲,再构造儿子;;先析构儿子,再构造父亲 (4...)继承同名成员的处理方式 同名成员变量:访问子类的,自己点后面接变量名就行Son s; s.m_A, 访问父的需要加作用域; Son s; s.Base::m_A,; 同名成员函数:(没有重载的时候...(1)静态动态:函数重载和运算符重载属于静态多态,复用函数名; (2)动态多态的条件:(1)有继承关系, (2)子类重写父的虚函数,(3)一般指针或者引用,执行子类对象使用 (3)静态多态地址早绑定

37310

C++之面向对象(下)

前言 本文继续介绍与C++与面向对象相关的内容,介绍了构造函数的初始化列表、隐式类型转换、静态成员、友元、内部类、匿名对象以及编译器对拷贝构造的优化等概念。...---- 一、再谈构造函数 1.构造函数体赋值 创建对象时,编译器通过调用构造函数给该对象各个成员变量一个合适的初值。...静态成员变量一定在外进行初始化,静态成员函数没有this指针。 2.特性 静态成员所有对象所共享,不在某个具体的对象,而是存放在静态区。...静态成员变量必须在外定义,不用加static,只是声明; 静态成员可用名::静态成员或者对象名.静态成员的方式来访问; 静态成员函数没有this指针,不能访问任何非静态成员静态成员也是成员...2.友元的说明 友元关系是单向的,不具有交换性; 比如上述Time和DateTime声明Date其友元,那么可以Date中直接访问Time的私有成员变量,但想在Time访问

37340

面试总结-C++

起到了隐藏的作用 的 static 成员变量属于整个所拥有,对的所以对象只有一份拷贝 的 static 成员函数属于整个所拥有,这个函数不接收 this 指针,因而只能访问的 static...当存在const或者引用时成员变量时,必须使用初始化表。...原理也很清晰,构造函数,由于构造顺序是从基到派生,所以调用虚函数,可能派生还没有构造出来,没有意义。...因为静态成员属于整个,而不属于某个对象,如果在内初始化,会导致每个对象都包含该静态成员,这是矛盾的。...重写拷贝构造函数 一般会默认生成的拷贝构造函数,但是当涉及动态分配存储空间时,默认的拷贝构造函数就会有问题,因此需要重写拷贝构造函数,并且采用深拷贝。

2.1K11
领券