c++ Primer Plus(第十一章)

第十一章

1.运算符重载

  • c++根据操作数的种类和数目来确定操作
  • 运算符函数重载的特殊格式 (返回值) operator op (arg);首先返回值并不是每个重载都有,op是指运算符(必须是c++中定义的有效的运算符)例如+的重载
1
Time operator+ (const Time& t);//声明

2.重载的一些限制

  • 重载必须有一个参数是用户定义的类型
  • 使用重载运算符不能违反原来的句法规则,即不能双目变单目,反之也是
  • 大多数运算符都可以通过成员函数或者非成员函数重载。但是 =,(),[],->只能通过成员函数来重载

3.为什么要使用友员来定义重载函数

  • 对于成员函数定义的重载函数,即默认第一个参数(即左操作数是自定义的类型)是这个类,比如如果 使用 Time Time::operator (double)const;来定义乘法 对于 Time类型 double是没问题的,但是如果double * Time类型,那么会出错,所以可以使用友元(是友元是因为可能要使用私有成员)

4.类的自动和强制类型转换

  • 对于只有一个参数的构造函数函数是能作为转换函数的,例如如果定义了构造函数 Stonewt(double),如果使用 Stonewt m=1.0,那么c++程序将自动调用 Stonewt(1.0)构造一个临时变量,然后赋值给左边,如果要关闭这种特性,那么使用关键字 explicit即可,即 explicit Stonewt(double);即可关闭这种自动转化,但依旧允许 m=(Stonewt)1.0方式来强制转换
  1. 转换函数
  • 将一个类型比如基本类型转换double转换为另一个类型即 stonewt,这种情况便不是使用构造函数,而是使用转换函数,即重载()类似 operator double()
  • 需要注意 :1.转换函数必须是类方法(必须转换为类)2.转换函数不能指定返回类型 3.转换函数不能有参数 4.如果编译器发现需要将Stonewt转换为double也会自动转换,所以需要 explicit来关掉,虽然没返回值,但是可以有return
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//main.cpp
#include<iostream>
#include"OverRide.h"
using namespace std;
int main()
{
OverRide a1(1, 2);
OverRide a2(1, 3);
std::cout << a1<<std::endl;
std::cout << (a1 - a2) << std::endl;
std::cout << int(a1) << endl;
}

OverRide.cpp
#include "OverRide.h"
std::ostream& operator<<(std::ostream& os, const OverRide& t)
{
os << t.Numerator << "\\" << t.denominator << std::endl;
return os;
}
OverRide OverRide:: operator -(const OverRide& a)const
{
OverRide temp(0);
temp.denominator = denominator - a.denominator;
temp.Numerator = Numerator - a.Numerator;
return temp;
}
OverRide OverRide:: operator +(const OverRide& a)const
{
OverRide temp(0);
temp.denominator = denominator + a.denominator;
temp.Numerator = Numerator + a.Numerator;
return temp;
}
OverRide::operator int()
{
return Numerator / denominator;
}

OverRide.h
#include "OverRide.h"
std::ostream& operator<<(std::ostream& os, const OverRide& t)
{
os << t.Numerator << "\\" << t.denominator << std::endl;
return os;
}
OverRide OverRide:: operator -(const OverRide& a)const
{
OverRide temp(0);
temp.denominator = denominator - a.denominator;
temp.Numerator = Numerator - a.Numerator;
return temp;
}
OverRide OverRide:: operator +(const OverRide& a)const
{
OverRide temp(0);
temp.denominator = denominator + a.denominator;
temp.Numerator = Numerator + a.Numerator;
return temp;
}
OverRide::operator int()
{
return Numerator / denominator;
}