一边写博客一边复习期末考...TT
目录
运算符重载(operator overloading)
运算符重载的方法是定义一个重载运算符的函数。
运算符函数是一种特殊的成员函数或友元函数。
重载运算符的规则
C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。
C++允许重载的运算符:
双目算术运算符丨+(加)、-(减)、*(乘)、/(除)、%(取模)
自增自减运算符丨++(自增)、--(自减)
位操作运算符 丨&(按位与)、|(按位或)、~(按位取反)、^(按位异或)、<<(左移)、>>(右移)
逻辑运算符 丨&&(逻辑与)、||(逻辑或)、!(逻辑非)
单目运算符 丨+(正)、-(负)、*(指针)、&(取地址)
关系运算符 丨<、>、>=、<=、==、!=
赋值运算符 丨=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
空间申请与释放丨new、delete、new[]、delete[]
其他运算符 丨,(逗号)、[](下标)、()(函数调用)、->(成员访问)、->*(成员指针访问)
不能重载的运算符只有5个:
. 丨成员访问运算符
* 丨成员指针访问运算符
?: 丨三目运算符
sizeof丨长度运算符
:: 丨作用域运算符
重载不能改变操作数的个数、优先级、结合性、不能有默认参数、必须和用户自定义类型的对象一起使用。 (啊哈!对吧!所以不会有普通的普通函数。
重载运算符的函数一般格式
返回类型 operator 运算符名称 ( 形参表 )
{ 对运算符的重载处理 }
// + //
Complex Complex::operator+(Complex& b) // 是类外定义
{
Complex a;
a.real = real + b.real;
a.imag = imag + b.imag;
return a;
}
其中函数名是由【operator】和【运算符名称】组成。比如:【operator+】。
重载为类的友元函数
friend 返回类型 operator 运算符 ( 参数列表 )
{
函数体
}
PS:在类外定义友元函数的时候,不要在函数头部加friend!然后函数名前也不需要写 xx:: ! (原因可以参见《Ruru的报错日常》。里面有记录。)
题外话:今天(5.4)遇到了Daniil,
他问我学什么专业,我说cs。
他问我学什么语言,我说我们正在学c++,他说他一开始也学这个hhh
参数
重载作为普通函数时:
// 嗯?普通函数...是指友元函数吗?
// 哦哦哦哦我懂了!这种就是普通的在类外定义的函数,下面那种是指别的类里面的函数,在我这里是friend
单目:右操作数是形参;
双目:左边形参作为运算符左操作数,右边形参是右操作数。
重载作为类的成员函数时:
如果运算符参数只有一个,那么不需要写参数;
如果运算符参数有两个,那么只需要写一个参数。
即参数比标准数据类型少一个!(因为类的成员函数默认有一个this指针。它会直接指向类本身。换句话说,当我们写出运算符重载时,有一个参数就已经被this指针包含了。)
单目运算符,this指向运算符右参数,因为单目运算符的参数一般都在右边。
双目运算符,this指向运算符左参数。
自增自减运算符【++】【--】
(还没写...请暂时参考:
十个 C++ 运算符重载示例,看完不懂打我..._c++运算符重载_阿基米东的博客-CSDN博客
重载流提取运算符【>>】流插入运算符【<<】
对于流而言,因为是双目运算符,this指针本应该指向左边的类,但左操作数是一个流,又与this的类型冲突。
因为this指针会默认指向类,而我们需要让左参数指向流,右参数指向类。所以重载就不能作为类的成员函数出现了。(所以意思是只能作为友元函数啦?w
这时,就需要用到友元函数friend。友元函数本身是一个普通函数,但是作为类的友元,能够调用类内的成员,包括private。而且参数不用被类限制为第一个必须是this所指的对象本身。
使用时,我们只需要在类内声明有个友元函数即可。(!!感觉又应证了为什么不用写 xx:: 哈哈哈哈
// >> //
friend istream& operator>>(istream& input, Complex& c) { // 提示:记得写&
input >> c.real >> c.imag;
return input;
}
// << //
friend ostream& operator<<(ostream& output, Complex& c) {
output << "(" << c.real << "," << c.imag << "i)";
return output;
}
// 这是类内定义的写法。类外定义时把friend删了即可
使用时正常使用就可以了!
int main(){
Complex a, b, c;
cout << "Complex: a+bi" << endl;
cout << "Plz input ComplexA's [a] and [b] : ";
cin >> a;
cout << "Plz input ComplexB's [a] and [b] : ";
cin >> b;
c = a + b;
cout << "A+B = " << c << endl;
}
不同类型数据间的转换
强制类型转换
1. typename(value); // C++的风格
2. (typename)value; // C语言的风格
用转换构造函数进行不同类型数据的转换
转换构造函数(conversion sonstructor function)的作用是将一个其他类型的数据转换成一个类的对象。
回顾一些以前学习过的几种构造函数:(哈哈哈哈笑死我了。课本好贴心!但是自己确实很不熟悉这些内容...所以就搬过来了!)
默认构造函数:
Compex (); // 没有参数
用于初始化的构造函数:
Complex (double r, double i); // 形参列表中一般有两个以上参数
用于复制对象的复制构造函数:
Complex (Complex &c); // 形参是本类对象的引用
现在要介绍的一种新的构造函数———转换构造函数!
Complex (double r) // 任何转换构造函数只有一个形参
{
real = r; imag = 0;
}
作用是将double型的参数r转换成Complex类的对象。
一些使用场景:
Complex c(1.5); // 建立对象c,由于只有一个参数,调用转换构造函数
Complex(2.5); // 建立一个无名的对象,合法,但无法使用它
c = Complex(3.5); // 假设c已被定义为Complex对象
类型转换函数
类型转换函数(type conversion function)的作用是将一个类的对象转换成另一类型的数据。(相当于转换构造函数的逆?!
X::operator T ()
// T可以是预定义类型,也可以是用户定义类型
// 无参数。无返回值类型。
// but必须有返回语句返回T类型的对象
// 只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数
{
return T类型的对象;
}
class Complex {
operator double () {
return real;
}
}
重载类型转换运算符
operator data_type ()
{
…
return xxxx // 返回值的类型即为data_type,不需要再加返回值类型声明
}
// double //
operator double() {
double nm = double(kilometer / 1.852);
return nm;
}
注意: 上述即为类型转换运算符函数的定义模型。重载类型转换运算符必须为类的成员函数,不能有返回类型,形参列表也必须为空,通常是const的。
参考:
C++语法——详解运算符重载_就要 宅在家的博客-CSDN博客
c++报错:lvalue required as left operand of assignment_百口可乐__的博客-CSDN博客
【C】报错[Error] lvalue required as left operand of assignment_kerouacs的博客-CSDN博客
十个 C++ 运算符重载示例,看完不懂打我..._c++运算符重载_阿基米东的博客-CSDN博客
C++ 重载类型转换运算符_c++类型转换运算符重载_hui2702的博客-CSDN博客
C++中的运算符重载_c++可以重载的运算符_半岛青舟的博客-CSDN博客
(你为什么啥也不会啊!!!