zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《C++ Primer 第5版》-14.3~14.7算术和关系、赋值、下标、递增和递减、成员访问运算符-康奈尔笔记

C++笔记 访问 关系 运算符 赋值 成员 递增
2023-09-27 14:27:14 时间

14.3.1相等运算符

  1. 算术和关系运算符
  2. 相等运算符

Operator +(const Sales_data&s1,const Sales_data &s2);

Bool operator==(const Sales_dat&s1,const Sales_da&s2);

Bool operator!=(const Sales_dat&s1,const Sales_da&s2);

1. 算术和关系运算符

1)通常是非成员函数,以允许对左侧或右侧的运算对象进行转换。都是常量的引用

2)新得到的值通常是局部变量,返回这个副本

3)如果有算术运算符,一般有一个对应的复合赋值运算符,,使用复合赋值来实现算术运算符

2. 相等运算符

1)应该比较对象的每一个数据成员

设计准则:

2)判断两个对象是否相等,显然应该定义operator==而非一个普通的命名函数

3)operator==应该判断所有成员

4)相等运算符具有传递性

5)用到了operator==自然需要用到operator=反之亦然

6)两个的工作其中一个应该只要委托给另一个

14.3.2关系运算符

1. 关系运算符

Bool operator<(const Sales_data&s1,const Sales_data&s2);

1. 关系运算符

定义了相等运算符的类通常也包含关系运算符,关联容器更需要小于运算符

关系运算符应该:

1.定义顺序关系,与关联容器中对关键字的要求一致

2.如果类同时也含有==运算符,定义一种关系令其余==保持一致。如果两个对象是!=的,那么一个对象应该<另外一个

Sales_data不应该定义<,不存在逻辑可靠的<定义,不定义<也许更好

因为比较isbn而后面两个成员不符合要求2

若只定义isbn比较

1. 编写了:isbn相同,但后面两个成员不同是不相等的,判定相等

2. 实际情况中: 其中任何一个都不比另一个小则两个对象不相等

若排序比较也不行,因为实际需求会改变顺序

note:需要存在唯一一种可靠的<定义

14.4赋值运算符

  1. 赋值运算符
  2. 复合赋值运算符

StrVec &operator==(std::string);

StrVec &Sales_data::operator+=(const Sales_data &rhs)

{

Units_sold+=units_sold;

Return *this;

}

1. 赋值运算符

1)赋值需要是成员

2)类除了拷贝赋值和移动赋值还可以 使用别的类型作为右侧运算对象,如:花括号内定义string什么的类型。

3)若别的类型作为右侧运算对象,不同的是 无需检查自身赋值,因为参数和this指的不是同一个对象

4)note:我们可以重载赋值运算符,不论形参的类型是什么,必须是成员函数

2. 复合赋值运算符

1)不非得是类的成员,更倾向为定义类的内部

2)为了与内置类型的复合赋值保持一致,也要返回以左侧对象的引用

14.5下标运算符

1.下标运算符

String& operator[](size_t m);

Const string& operator[](size_t n)const

1. 下标运算符

1)必须是成员函数

2)与原始定义兼容,通常返回所访问元素的引用,好处:能让下标可以出现在变量的左右两侧

可以定义常量与非常量版本

14.6递增和递减运算符 

  1. 递增和递减运算符
  2. 定义前置递增、递减运算符
  3. 区分前置与后置
  4. 显示地调用后置运算符

StrBlob& operator++();

StrBlob& operator—();// 前置

StrBlob& operator++(int);

StrBlob& operator—(int);// 后置

StrBlob stp;

Stp.operator++(0);

Stp.operator++();

1. 递增和递减运算符

1)并不要求必须是类的成员,但改变的正好是所操作对象的状态,建议为成员函数

既有前后版本,应该同时定义

2. 定义前置递增、递减运算符

1)前置:

与内置版本一致,应该返回递增或递减后对象的引用

3. 区分前置与后置

1)就是使用一个参数,不被使用的 一个额外的

2)后置:

返回的是对象的原值,递增或递减之前的值,非引用

4. 显示地调用后置运算符

StrBlob stp;

Stp.operator++(0);// 后置

Stp.operator++();// 前置

14.7成员访问运算符

  1. 成员访问运算符
  2. 对箭头运算符返回值的限定

String& operator*()const

{

Return (*p)[curr];

}

String* operator->()const

{

// 实际工作委托给解引用运算符

Return &this->operator*();

}

StrBlobPtr p (a1);

*p = “okay”;

Cout<<p->size()<<endl;

Cout<<(*p).size()<<endl;//等价p->size();

Cout<<p.operator->size()<<endl;

1. 成员访问运算符

1)*与->

2)箭头运算符必须是类的成员,解引用通常也是,不过并非必须如此

3)->返回string的指针,而*返回的是string的引用

Note:重载的箭头运算符必须返回类的指针或者自定义了箭头运算符的某个类的对象