小白一个,关于运算符重载,请老师给注释一下。
我知道很基础但是感觉进步好慢啊!还请请不吝赐教
#include <iostream>
#include<stdlib.h>
using namespace std;
class Integer {
int i;
public:
Integer(int ii) : i(ii) {}
const Integer
operator+(const Integer& rv) const {
cout << "operator+" << endl;
return Integer(i + rv.i);
}
Integer&
operator+=(const Integer& rv) {
cout << "operator+=" << endl;
i += rv.i;
return *this;
}
};
int main() {
cout << "built-in types:" << endl;
int i = 1, j = 2, k = 3;
k += i + j;
cout << "user-defined types:" << endl;
Integer ii(1), jj(2), kk(3);
kk += ii + jj;
system("pause");
return 0;
} ///:~
class Integer {
int i;
public:
Integer(int ii) : i(ii) {}
/*重载operator+,传入和返回的都是一个Interger class*/
const Integer
operator+(const Integer& rv) const {
cout << "operator+" << endl;
return Integer(i + rv.i);//将两个class的private成员,也即是整数i相加
}
/*重载operator+=,同样是传入class类型,*/
Integer&
operator+=(const Integer& rv) {
cout << "operator+=" << endl;
i += rv.i;//同上,两个整形变量相加
return *this;
}
};
int main() {
//调用内置类型(这里是int型)的+和+=
cout << "built-in types:" << endl;
int i = 1, j = 2, k = 3;
k += i + j;
//重载
cout << "user-defined types:" << endl;
Integer ii(1), jj(2), kk(3);
kk += ii + jj;//重载了+和+=
system("pause");
return 0;
} ///:~
#include <iostream>
#include<stdlib.h>
using namespace std;
class Integer {
int i;
public:
Integer(int ii) : i(ii) {}
// 重载加号,传入的是const &类型,所以+右边的值是不能被改变的,返回const类型,
// 所以这种加号产生的表达式的结果也是常量,不可改变
const Integer// 另外,内置加号返回的是引用类型, 而这里是普通类型,其实这样并不好,因为还要复制一份数据
operator+(const Integer& rv) const {
cout << "operator+" << endl;
return Integer(i + rv.i);// 此处是相加操作的核心代码
}
// 重载+=,传入参数说明同上;
// 不同的是它的返回类型没有不是const的,所以返回值是可以被改变的
Integer&// 另外i,这里返回的是引用,也就是变量 i 的一个别名,因此不用复制 i 的值了
operator+=(const Integer& rv) {
cout << "operator+=" << endl;
i += rv.i;// 调用内置类型+=,求得结果
return *this;
}
};
int main() {
cout << "built-in types:" << endl;
// 由于这些重载的运算符是定义在Integer中的,所以只对Integer对象有作用
// 对于内置类型,还是使用内置类型的运算符
int i = 1, j = 2, k = 3;
k += i + j;
cout << "user-defined types:" << endl;
// 对于Integer对象,我们重载的运算符会覆盖内置类型运算符,所以调用的是重在版本的运算符
Integer ii(1), jj(2), kk(3);
kk += ii + jj;
system("pause");
return 0;
} ///:~
#include <iostream>
#include<stdlib.h>
using namespace std;
class Integer {
int i;
public:
Integer(int ii) : i(ii) {}
// 虽然是操作符重载,但既然作为类的成员函数,事实上有两个参数,只不过第一个参数被隐藏了
/*
const Integer operator+(const Integer& lv, rv const Integer& rv) const
这是一般的加法运算符的写法,但作为成员函数,第一个参数lv被省略,这个参数强制为*this,也就是类本身,这就是下面这个重载只有一个参数的原因,其他的操作符重载都是这样,只要操作符本身的第一个参数接受类本身,就能作为成员函数来重载。
但有些操作符就比较麻烦,比如流的操作符<<,它一般重载形式为
ostream & operator << (ostream & os, const T &);
重载后的使用方式为
T a;
cout << a;
但它第一个参数不是T,所以不能作为T的成员函数重载,但可以作为T的友元重载,比如这样
struct T
{
friend ostream & operator << (ostream & os, const T &);
}
*/
const Integer
operator+(const Integer& rv) const {
cout << "operator+" << endl;
return Integer(i + rv.i);
}
Integer&
operator+=(const Integer& rv) {
cout << "operator+=" << endl;
i += rv.i;
return *this;
}
};
int main() {
cout << "built-in types:" << endl;
int i = 1, j = 2, k = 3;
k += i + j;
cout << "user-defined types:" << endl;
Integer ii(1), jj(2), kk(3);
kk += ii + jj;
system("pause");
return 0;
}