13 如何为类和结构体自定义运算符实现

简介: 如何为类和结构体自定义运算符实现

运算符重载


  • 类和结构体可以为现有的运算符提供自定义的实现,成为运算符重载


image.png


image.png


一元运算符重载


  • 类与结构体也能提供标准一元运算符的实现
  • 要实现前缀或者后缀运算符,需要在声明运算符函数的时候在func关键字之前指定perfix或者postfix限定符


image.png


组合赋值运算符重载


  • 组合赋值运算符将赋值运算符(=)与其他运算符进行结合
  • 在实现的时候,需要把运算符的左参数设置成inout类型,因为这个参数的值会在运算符函数内直接被修改


image.png


等价运算符重载


  • 自定义类和结构体不接收等价运算符的默认实现,也就是所谓的“等于”运算符(==)和“不等于”运算符(!=)
  • 要使用等价运算符来检查你自己类型的等价,需要和其他中缀运算符一样提供一个“等于”运算符重载,并且遵循标准库Equatable协议


image.png


Swift为以下自定义类型提供等价运算符合成实现:

  • 只拥有遵循Equatable协议存储属性的结构体
  • 只拥有遵循Equatable协议关联类型的枚举
  • 没有关联类型的枚举


image.png


如何在Swift里定义自己的运算符


自定义运算符


  • 除了实现标准运算符,在Swift当中还可以声明和实现自定义运算符(custom operators)
  • 新的运算符要在全局作用域内,使用operator关键字进行声明,同时还要指定prefix、infix或者postfix限定符


image.png


自定义中缀运算符的优先级和结合性


  • 自定义的中缀(infix)运算符也可以指定优先级和结合性
  • 每一个自定义的中缀运算符都属于一个优先级组
  • 优先级组指定了自定义中缀运算符和其他中缀运算符的关系


image.png


//AdditionPrecedence -> 加法优先级

//MultiplicationPrecedence -> 乘法优先级


image.png


//更改了*^优先级,再看代码

//下方的MyPrecedence是定义了一个新的优先级, 它的优先级低于加法优先级


image.png





目录
相关文章
|
6月前
|
存储 C语言
引用共用体变量的方式
引用共用体变量的方式
70 2
|
存储 Swift 索引
28 如何为类、结构体以及枚举添加属性
如何为类、结构体以及枚举添加属性
69 0
|
6月前
|
存储 程序员 C++
定义和使用结构体变量
定义和使用结构体变量
52 1
|
5月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
|
6月前
|
存储 C语言
定义结构体类型变量
定义结构体类型变量
38 0
|
6月前
|
程序员 C语言
结构体类型变量的定义
结构体类型变量的定义
37 0
|
6月前
结构体变量的定义以及与结构体变量调用的两种方式
结构体变量的定义以及与结构体变量调用的两种方式
88 0
|
存储 编译器 C++
类的默认成员函数、赋值运算符重载(二)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
60 0
|
编译器 C++
类的默认成员函数、赋值运算符重载(一)
如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
88 0
|
C语言
c语言 结构体变量的定义初始化,成员的访问赋值,无名结构体
----结构体概述: 结构体就是将很多不同类型的数据包含在一起。 比如里面包含学生姓名、年龄、成绩:char name[20] ; int age ; double score,这些包含的都叫做结构体的成员; 当信息非常多修改就会发生错误,用结构体就会比较方便。
189 0