关于C++的重载运算符和重载函数
什么是重载运算符和重载函数
在C++中,重载指的是在一个类中定义多个同名但是参数列表不同的成员函数或全局函数。当编译器遇到这些同名的函数时,会根据传入的参数类型和数量来确定具体要调用哪个函数,从而实现了多态性。
重载运算符指的是对C++中一个或多个运算符进行重新定义,让该运算符能够在自定义类型上进行操作。例如,我们可以通过重载+运算符实现自定义类型的相加操作。
如何实现重载运算符和重载函数
重载函数的实现
重载函数的实现与普通函数的实现方式相同,只是需要在方法名后加上括号加上参数列表,以区分不同的重载方法。例如:
class Demo {
public:
int add(int a, int b) { // 第一个重载方法
return a + b;
}
float add(float a, float b) { // 第二个重载方法
return a + b;
}
};
在上面的例子中,Demo
类定义了两个 add
方法,一个接收两个 int
类型参数,另一个接收两个 float
类型参数。在使用该方法时,编译器会根据传入参数类型的不同调用不同的方法。
重载运算符的实现
重载运算符的实现形式为:
返回类型 operator 运算符 (形参列表) {
// 函数体
}
例如,我们可以重载 +
运算符,进行两个自定义类型的相加操作。我们定义一个名为 MyInt
的类,如下所示:
class MyInt {
private:
int num;
public:
MyInt(int n) : num(n) {}
MyInt operator +(const MyInt &obj) { // 重载+运算符
return MyInt(num + obj.num);
}
int getNum() {
return num;
}
};
在这个例子中,MyInt
类定义了一个加法运算符的重载方法,使用 operator +
来定义。接收参数 const MyInt &obj
表示传入一个 MyInt
类型的对象引用,返回一个新的 MyInt
对象。
实现以后,我们就可以在使用时进行自定义类型相加操作了。例如:
MyInt a(10);
MyInt b(20);
MyInt c = a + b;
std::cout << c.getNum() << std::endl; // 输出 30
注意事项
- 重载函数和重载运算符不能改变原来的含义。例如,不能重载
++
运算符使其变成相减操作。 - 可以重载的运算符包括:
+
、-
、*
、/
、%
、^
、&
、|
、~
、!
、=``<
、>
、<=
、>=
、<<
、>>
、==
、!=
、&&
、||
、++
、--
、->
、->*
、()``new
、delete
。 - 不能重载的运算符包括:
.
、.*
、sizeof
、typeid
。 - 重载函数的参数个数必须不同,或者至少有一个参数的类型不同。
- 重载运算符的重载方法必须至少拥有一个参数,并且只能被定义为成员函数,不能定义为全局函数。
示例说明
下面以两个示例情况来说明重载运算符和重载函数的使用:
示例1
我们定义一个名为 Circle
的圆类,包含圆的半径属性和计算圆面积的方法。我们可以通过重载 *
运算符实现圆面积的计算操作。代码如下所示:
class Circle {
private:
float r; // 圆的半径
public:
Circle(float r) : r(r) {}
float getR() { return r; }
float getS() { // 计算圆面积
return 3.14 * r * r;
}
Circle operator *(float n) { // 重载*运算符
return Circle(r * n);
}
};
实现这个运算符重载以后,我们就可以对 Circle
类型的对象进行 *
运算了。例如:
Circle c(2.0);
Circle d = c * 3;
std::cout << d.getS() << std::endl; // 输出 3.14*2*2*3 = 37.68
示例2
我们定义一个名为 Book
的图书类,包含图书的书名、价格和出版社属性。我们可以实现一个 compare
方法,用于比较两本书的价格大小。代码如下所示:
class Book {
private:
std::string name; // 书名
float price; // 价格
std::string publisher; // 出版社
public:
Book(std::string name, float price, std::string publisher)
: name(name), price(price), publisher(publisher) {}
float getPrice() { return price; }
// 重载compare方法
bool compare(const Book &b) {
return price < b.price;
}
};
在这个例子中,Book
类定义了一个 compare
方法,接收一个 Book
类型对象引用作为参数,返回 bool
类型值,表示当前对象是否价格小于传入的对象。我们可以在使用时传入两个 Book
类型的对象来进行价钱比较:
Book book1("C++ Primer", 98.0, "电子科技出版社");
Book book2("Effective C++", 85.0, "机械工业出版社");
if (book1.compare(book2)) {
std::cout << book1.getPrice() << " < " << book2.getPrice() << std::endl;
} else {
std::cout << book2.getPrice() << " < " << book1.getPrice() << std::endl;
}
这段代码会输出 85 < 98
,表示 book2
的价格更低。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于C++的重载运算符和重载函数 - Python技术站