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

【C++】类的封装 ② ( 封装最基本的表层概念 | 类对象作为参数传递的几种情况 )

一、类的封装 : 将数据和方法封装到一个类中 1、封装最基本的表层概念 将数据和方法封装到一个类中 , 是封装最基础的概念 ; 类的封装 最基本的功能 就是将 若干数据 和 若干方法 , 封装到一个类中..., 这些数据在内存中以一个整体的形式进行运作 ; 封装 Encapsulation : 将 数据 和 操作 封装在类中 , 可以将 类 内部的 实现细节 隐藏 , 只暴露有限的 接口 与外部进行交互...double m_r; // 定义属性成员 , 圆的面积 double m_s; 3 个成员方法 ; 定义该 Circle 类对象 circle , 则借助 circle 对象 , 可以直接访问其中的...( 指针 / 引用 / 直接 ) 使用 类 对象 作为函数参数时 , 分别讨论下面三种情况 ; 第一种情况 : 使用 类对象 指针作为参数 , 传参时 , 传入的必须是一个指针值 , 也就是地址值 ,...: 使用 类对象引用作为 参数 ; 传参时 , 可以直接将 circle 对象传入 , 因为 C++ 编译器在编译引用时 , 会自动为 引用参数 添加 & 取地址 , 在函数内部访问时 , 会自动为引用添加

30110

每日一问: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.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Swift 周报 第三十八期

    我们提供了此类生成器的参考实现,它支持 macOS 作为主机平台和一些主要的 Linux 发行版作为目标平台。 区分 Swift SDK 作者和 Swift SDK 用户非常重要。...通过向函数添加参数并在 @Test 属性中指定其参数,可以使用不同的输入轻松重复测试多次。...@Test 属性可以包含参数,并且该函数将被重复调用并传递每个参数: @Test(arguments: [Food.burrito, .taco, .iceCream]) func foodAvailable...我想知道是否可以将两者删除。 特别是,@Sendable 属性意味着传递给闭包的类型必须是 Sendable,这施加了相当严格的限制。因此,如果我们可以省略它,那就方便多了。...它实质上通过添加 @ObservationTracked 宏将存储属性转换为计算属性,并添加与 ObservationRegistrar 相关的内容来实现。

    23430

    Swift5.0的Runtime机制浅析

    每次对象方法调用都会至少传递对象和对象方法名称作为开始的两个参数,方法的调用过程都会通过一个被称为消息发送的C函数objc_msgSend来完成。...虽然可以将方法函数名称赋值给某个变量,但是这个变量的值并非是类方法函数的真实地址,而是一个包装函数的地址。 第二个就是Swift中的类方法调用和参数传递的ABI规则和其他语言不一致。...在OC类的对象方法中,对象是作为方法函数的第一个参数传递的。在机器指令层面以arm64体系结构为例,对象是保存在x0寄存器作为参数进行传递。...而在Swift的对象方法中这个规则变为对象不再作为第一个参数传递了,而是统一改为通过寄存器x20来进行传递。需要明确的是这个规则不会针对普通的Swift函数。...当然我们也可以通过为类定义一个extension方法,然后将这个extension方法函数的指针来替换掉虚函数表中类的某个原始方法的函数指针地址,这样能够解决对象作为参数传递的寄存器的问题。

    2.3K21

    【面试必备】Swift 面试题及其答案

    在Objective-C中,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。...在Swift中,在函数和数据结构中都可以使用泛型,例如类、结构体和枚举。 泛型一般是用来解决代码复用的问题。...上面的代码达到预想的结果,并且防止了传递不同类型的参数。 问题4- Swift 1.0 or later 哪些情况下你不得不使用隐式拆包?说明原因。...它们使用后的效果是一样的,但是本质上是不同的。能解释一下为什么不同吗? 答案: static修饰的属性或者修饰的函数都不可以重写。但是使用class修饰符,你可以重写属性或者函数。...1.0 or later 你能通过extension(扩展)保存一个属性吗?

    2.8K20

    【面试必备】Swift 面试题及其答案

    ---- 答案:optional 类型被用来表示任何类型的变量都可以表示缺少值。在 Objective-C 中,引用类型的变量是可以缺少值,并且使用 nil 作为缺少值。...上面的代码达到预想的结果,并且防止了传递不同类型的参数。 问题4- 哪些情况下你不得不使用隐式拆包?...它们使用后的效果是一样的,但是本质上是不同的。能解释一下为什么不同吗? 答案: static 修饰的属性或者修饰的函数都不可以重写。但是使用 class 修饰符,你可以重写属性或者函数。...---- 你能通过 extension (扩展)保存一个属性吗?请解释一下原因。 答案:不能。扩展可以给当前的类型添加新的行为,但是不能改变本身的类型或者本身的接口。...高级 问题1- 能解释一下用泛型来声明枚举的问题吗 ---- 在 Swift 中,你能解释一下用泛型来声明枚举的问题吗?

    6.9K30

    iOS面试题-Swift篇

    ,使用 copy-on-write将值传递与复制开销降到最低 如何将Swift 中的协议(protocol)中的部分方法设计为可选(optional)?...当闭包作为一个实际参数传递给一个函数或者变量的时候,我们就说这个闭包逃逸了,可以在形式参数前写 @escaping 来明确闭包是允许逃逸的。...关联值--有时会将枚举的成员值跟其他类型的变量关联存储在一起,会非常有用 原始值--枚举成员可以使用相同类型的默认值预先关联,这个默认值叫做:原始值 将一个很长的闭包表达式作为函数的最后一个实参 使用尾随闭包可以增强函数的可读性...自动闭包是一种自动创建的用来把作为实际参数传递给函数的表达式打包的闭包。它不接受任何实际参数,并且当它被调用时,它会返回内部打包的表达式的值。...Swift中跟实例对象相关的属性可以分为2大类 存储属性(Stored Property) 类似于成员变量这个概念 存储在实例对象的内存中 结构体、类可以定义存储属性 枚举不可以定义存储属性 计算属性(

    3.6K40

    Swift底层-对象&结构&属性

    InlineRefCounts refCounts } 很明显,swift 有两个常驻成员1.元类数据 指针8字节 2.引用计数,本质上是一个类 也是指针占8字节 相对于OC类的不同可以看我以前写的文章...Class继承的是NSObject的话,那么kind就是isa 反之,则是普通的swift类,为普通的unsigned lonog kind 六·属性观察者 var name: String = ""...init处调用吗?...init不会调用属性观察者,如果调用了,那么访问的是上面内存空间的空白处,也就是所谓的野指针,但是这在Swift中是不被允许的,所以print无法打印self.age 观察者对象的访问方法 1.定义的储存属性...var name: Sting = "xx" 2.类继承的存储属性 class T1:T2{override var name:String} 3.继承计算属性 var age:Int{get

    1.1K00

    Swift入门:类

    您可以将一个类定义为基于另一个类,添加任何您想要的新内容。 当你创建一个类的实例时,它被称为一个对象。如果复制该对象,默认情况下,两个副本都指向同一个数据——更改一个,副本也会更改。...其次,因为传入的参数名与要分配的属性名相同,所以使用self.为了让你的意思更清楚——“这个对象的clothes属性应该设置为传入的clothes参数。”...相反,Swift有一个更聪明的解决方案:我们可以将CountrySinger定义为基于Singer,它将获得其所有属性和方法,以便我们建立: class CountrySinger: Singer {...向超类传递数据是通过方法调用完成的,并且在给定所有属性值之前,不能在初始化器中进行方法调用。 因此,我们需要先设置自己的属性(noiseLevel),然后传递其他参数供超类使用。...} } 注意它的初始值设定项是如何接受三个参数,然后调用super.init()将name和age传递给Singer超类的——但只有在设置了它自己的属性之后。

    75410

    Swift解读专题一——Swift2.2语言预览

    print(132) } f(count:0) 通过这种写法,开发者在将函数作为参数传递时,无需再创建中间函数,示例如下: //参数中有函数 func func1(param1:Int,param2:...关键字来定义类,类内部可以声明与定义一些属性与方法,类的实例对象可以通过点语法来调用类的属性和方法,示例如下: class MyClass {     var count = 100     let name...,可以通过重写init方法来重写类的默认构造方法,如果这个类有继承的父类,则需要遵守如下3条规则: 1.必须先将子类的属性初始化完成。...另外,在set方法中会自动生成一个命名为newValue的变量作为传递进来的值,开发者也可以自定义这个变量的名称,在set后加小括号即可,示例如下: var privateCount:Int{         ...中使用struct关键字来进行结构体的创建,结构体的功能和类相似,支持属性与方法,但不同的是,结构体在传递时会被赋值,类的实例则会以引用的方式传递。

    2.1K20

    Swift基础语法(二)

    在Swift中,函数参数是可以变化的,可以接受不确定数量的参数 可变参数必须具备相同的类型 可以通过在参数类型后面加入 ......in 关键字将闭包分割成两部分:参数与返回值(可以理解成函数的类型)与闭包体 3,闭包中的参数不同于函数中的参数的一点是,闭包中的参数不能提供默认值,而函数中的参数可以提供默认值。...结构体既可以定义属性(变量、常量),也可以定义方法(函数)。 Swift中的结构体是值类型。...OC中的NSString、NSArray和NSDictionary,他们是作为类来实现的,所以NSString、NSArray和NSDictionary的实例对象总是作为一个引用,而不是拷贝来实现赋值和传递...) 类有析构函数 类有引用计数的概念 开发中类与结构体的使用场景 类与结构体都可以用来定义自定义的数据类型,结构体实例总是通过值来传递,而类实例总是通过引用来传递。

    2.2K20

    Swift进阶一:Swift简介

    Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递...,所以我们可以使用Swift来进行函数式编程,另外Swift也提供了很多高阶函数来辅助我们进行函数式编程;Swift也提供了属性的权限限定等面向对象的基础设置,因此在Swift中也可以面向对象来编程。...如果代码中使用一个字符串String,那么你不能错误地传递一个整型Int给它,因为Swift是类型安全的,它会在代码编译的时候做类型检查,并且把所有不匹配的类型作为一个错误标记出来,这使得程序员在开发中尽可能早得发现和修正错误...4,枚举类型的增强 在Swift中,枚举可以使用整型、浮点型、字符串等来表示其枚举成员的原始值,还能拥有属性和方法,甚至支持泛型、协议、扩展等等。...7,函数和闭包 在Swift中,函数是一等公民,可以直接定义函数类型的变量,可以将函数作为其他函数的参数来传递,也可以将函数作为其他函数的返回值。这些特性可以让我们在Swift中进行函数式编程。

    2.8K20

    Kotlin、Swift、Scala 的延迟求值

    简单来说,Kotlin 的 Lazy 是一个很普通的类,它可以承载 Kotlin 当中各种对于延迟计算的需求的实现,用在属性定义上时借用了属性代理的语法,用作函数参数时就使用高阶函数 lazy 来构造或者直接传入函数作为参数即可...Scala 的函数参数除了可以传递值以外,还有一种叫做传名参数,即仅在使用时才会触发求值的参数。...但类内部仍然可以修改 value 的值,所以这个方法的作用也很有限。 接下来看下 Swift 当中函数参数的延迟求值。...不难想到,我们将函数作为参数传入就可以实现这一点: [Swift] func assertAllTrue(_ conditions: () -> Bool ...) -> Bool { conditions.allSatisfy...简单总结一下,Swift 通过 lazy 关键字来实现类属性的延迟求值,这一点写法上虽然与 Scala 很像,但只能修饰类或结构体的成员,而且是可读写的成员;Swift 同样可以通过传入函数的形式来支持函数参数的延迟求值

    1.8K20

    Swift基础语法简化版(续)

    由 in 关键字将闭包分割成两部分:参数与返回值(可以理解成函数的类型)与闭包体 3,闭包中的参数不同于函数中的参数的一点是,闭包中的参数不能提供默认值,而函数中的参数可以提供默认值。...尾随闭包是一个在函数调用的时候,书写在函数括号之后的闭包表达式。当函数中最后一个参数是闭包表达式的时候,在调用该函数的时候,就可以将作为最后一个参数的闭包表达式写成尾随闭包。...、数组Array类型,是作为结构体来实现的,这意味着,当String、Dictionary、Array类型的实例被赋值到一个新的常量或者变量,或被传递到一个函数中的时候,其实传递的是拷贝后的值。...OC中的NSString、NSArray和NSDictionary,他们是作为类来实现的,所以NSString、NSArray和NSDictionary的实例对象总是作为一个引用,而不是拷贝来实现赋值和传递...可以使用它来指定参数类型或者返回值的类型。在真正调用的时候会被实际的类型替代,如传递的是Int,就替换为Int;如果传递的是Double,就替换为Double等等。

    1.6K20

    Swift教程(九)--类和结构体

    新实例属性的初始化值可以通过属性名称传递到成员初始化器中: let name = Name(firstName: "super", secondName: "man") 与结构体不同,类实例不会接收默认的成员初始化器...Swift 中所有的结构体和枚举都是值类型,这意味着你所创建的任何结构体和枚举实例——和实例作为属性所包含的任意值类型——在代码传递中总是被拷贝的。...这是 MyClass的 x参数在改变而不是引用 MyClass的常量的值在改变。 特征运算符 因为类是引用类型,在后台有可能有很多常量和变量都是引用到了同一个类的实例。...字符串,数组和字典的赋值与拷贝行为 Swift 的 String , Array 和 Dictionary类型是作为结构体来实现的,这意味着字符串,数组和字典在它们被赋值到一个新的常量或者变量,亦或者它们本身被传递到一个函数或方法中的时候...类和结构体之间的选择 在 Swift 中类和结构体有很多共同之处,它们都能: 定义属性用来存储值; 定义方法用于提供功能; 定义下标脚本用来允许使用下标语法访问值; 定义初始化器用于初始化状态; 可以被扩展来默认所没有的功能

    1.1K30

    Apple 营收有望再创新高 | Swift 周报 issue 47

    提案通过的提案SE-0417 任务执行器偏好 提案通过审查。该提案已在 四十四期周报 正在审查的提案模块做了详细介绍。正在审查的提案SE-0422 表达式宏作为调用方默认参数 提案正在审查。...该提案旨在取消之前在 SE-0382 表达式宏中设定的限制,以允许非内置表达式宏作为调用方默认参数表达式。SE-0382 表达式宏提案在24期周报中做了详细介绍。...当然,可能已经有一些方法可以通过属性包装器或其他方式在 swift 中实现弱数组。 然而,要在 swift 中轻松完成此操作的语法可能需要在添加之前进行一些修改。...概述的好处包括鼓励将元组转换为数组以供长期使用,提供对 Collection 和 Array 方法的访问,改进使用数组而不是元组的函数参数传递,以及限制异构元组的转换。...作者首先介绍了 final 关键字的作用,包括防止类被继承和优化执行性能。文章指出了一些场景下是不必手动添加 final 的,比如私有类/属性和具有默认访问权限(internal)的类。

    14032

    Swift 面试题

    Swift 中 为什么 String、Array、Dictionary 用 Struct 实现 安全:值类型不可变,传递值类型实际上传递的是一份副本,不用担心函数内对值的修改影响到外部数据,有助于减少程序中的错误...Swift 中变量作用域有哪些,区别是什么 open > public > internal > fileprivate > private open 和 public 都可以访问模块外的属性或方法,...fileprivate 和 private 的区别在于,fileprivate 是当前.swift文件内都可访问。private 是当前类内可访问。...(在一个.swift 中有多个类的情况下,就能体现出 fileprivate 和 private 的区别)。 internal是swift 文件的默认权限,在当前模块内可访问,模块外不能访问。...MVP 的优点是: 模型与视图分离,从而改变视图的时候不会影响模型 可以更高效的使用模型,所有的交互都发生在 Presenter 内部 可以将一个 Presenter用于多个视图,不需要改变 Presenter

    9110

    Swift学习总结

    元组也可以作为函数参数 6、闭包就是objc中的Block 闭包语法: {(参数)->返回类型 in //代码 } 闭包可以利用swift的类型推断系统去除参数和返回值的类型信息来简化闭包。...与普通方法类似,但是没有func关键字标记,也没有返回值,用init关键字做方法名,参数个数可变。 结构体提供了一种默认的初始化方法,会将所有属性都作为参数。...感叹号表示返回隐式展开可空类型实例,其使用起来方便(不需要写可空类型展开的语法),但不如跟随问号安全。 19、在被赋给另一个实例或是作为参数传递给函数时,值类型总是被复制。...因此我们在赋值或将实例作为参数传递时,在它们没被修改或写入存储时,它们还是对同一份存储进行引用。这样值类型就可以避免创建多余的数据副本。...闭包增加分逃逸闭包和非逃逸闭包两个概念,通常闭包作为参数传给函数时,是非逃逸闭包,这种闭包编译器可以确定不会造成循环引用,而作为类型的属性这种闭包是逃逸闭包,这种闭包就容易引起循环引用。

    3K20

    Apple Swift编程语言入门教程

    这个入门会给出足够的信息教你完成一个编程任务。无需担心你还不理解一些东西,所有没解释清楚的,会在本书后续详细讲解。 Note 作为最佳实践,可以将本章在Xcode的playground中打开。...numbers.map({number in 3 * number}) 你可以通过数字而不是名字来引用一个参数,这对于很短的闭包很有用。一个闭包传递其最后一个参数到函数作为返回值。...sort([1, 5, 3, 12, 2]) { $0 > $1 } 6 对象与类 使用 class 可以创建一个类。一个属性的声明则是在类里作为常量或变量声明的,除了是在类的上下文中。...注意 EquilateralTriangle 的构造器有3个不同的步骤: 设置属性的值 调用超类的构造器 改变超类定义的属性的值,添加附加的工作来使用方法、getter、setter也可以在这里 如果你不需要计算属性...一大重要的区别是代码之间的传递总是用拷贝(值传递),而类则是传递引用。

    2.1K30
    领券