前言

简单记录一下C++重载运算符相关内容,记录于此,方便自己查阅和学习。

正文

运算符实际上是一个函数,运算符重载本质上就是函数重载。函数重载可以让一个函数根据传入的参数执行不同的操作,运算符重载也一样。

原因

C++中,基本数据类型可以直接完成算术运算,但是对于类(用户构造的数据类型)对象就无法直接使用,因此需要重载运算符。

因此重载运算符可以让两个对象进行运算或者让对象跟基本数据类型运算。

重载运算符

  1. #include <iostream>
  2. class Book {
  3. protected:
  4. int page;
  5. public:
  6. Book(int page) {
  7. this->page = page;
  8. }
  9. void printInfo() {
  10. std::cout << this->page << std::endl;
  11. }
  12. };
  13. int main() {
  14. Book book_1(100);
  15. Book book_2(100);
  16. //错误,对象不可以+
  17. //Book book_3 = book_1 + book_2;
  18. //book_3.printInfo();
  19. return 0;
  20. }
复制

正常情况下,用户构造的数据类型是不可以直接进行运算符+操作的。

如果需要就需要重载运算符+,下面是重载运算符+对象

  1. #include <iostream>
  2. class Book {
  3. protected:
  4. int page;
  5. public:
  6. Book(int page) {
  7. this->page = page;
  8. }
  9. void printInfo() {
  10. std::cout << this->page << std::endl;
  11. }
  12. //重载运算符+对象
  13. Book operator+ (Book book) {
  14. return Book(book.page + this->page);
  15. }
  16. };
  17. int main() {
  18. Book book_1(100);
  19. Book book_2(100);
  20. Book book_3 = book_1 + book_2;
  21. book_3.printInfo();
  22. return 0;
  23. }
复制

此时是可以对象+对象了。

声明

重载运算符声明形式:

  1. 返回类型 operator 运算符 (参数列表)
  2. {
  3.   函数体;
  4. }
复制

比如上面例子中的重载的+对象

  1. //重载运算符+对象
  2. Book operator + (Book book) {
  3. return Book(book.page + this->page);
  4. }
复制

+中间可以有空格也可以没有,下面写法都是正确的

  1. Book operator+(Book book) {
  2. return Book(book.page + this->page);
  3. }
  4. Book operator +(Book book) {
  5. return Book(book.page + this->page);
  6. }
  7. Book operator+ (Book book) {
  8. return Book(book.page + this->page);
  9. }
复制

规则

下面是支持重载的运算符

  1. 算术运算符

    1. + 、- 、* 、/ 、% 、++ 、--
    复制
  2. 位操作运算符

    1. & 、| 、~ 、^ 、>> 、<<
    复制
  3. 逻辑运算符

    1. ! 、&& 、||
    复制
  4. 比较运算符

    1. < 、> 、>= 、<= 、== 、!=
    复制
  5. 赋值运算符

    1. = 、+= 、-= 、*= 、/= 、%= 、&= 、|= 、^= 、<<= 、>>=
    复制
  6. 其他运算符

    1. [] ( ) -> , new delete new[] delete[] ->
    复制

重载运算符时不能改变运算符操作数的个数、原有的优先级、结合性和语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。

另外,重载运算符的含义必须清晰,不能有二义性。

并非所有C++运算符都可以重载,不允许重载的运算符有:

复制

例子

还是以上面Book类为例,在上面基础上新增。

+ int

这里以+int为例,当然也可以加float ,double等

  1. //重载运算符+int
  2. void operator + (int page) {
  3. this->page += page;
  4. }
复制
  1. Book book_1(100);
  2. //+ 100
  3. book_1 + 100;
  4. book_1.printInfo();
复制

输出

复制
前缀++

自加1并返回

  1. //重载运算符前缀++
  2. int operator ++ () {
  3. return ++page;
  4. }
复制

为了凸显差异,这里返回++page后的值

  1. Book book(100);
  2. int page = ++book;
  3. book.printInfo();
  4. std::cout << page << std::endl;
复制

输出

复制
后缀++

返回再自加1

  1. //重载运算符后缀++
  2. int operator ++ (int) {
  3. return page++;
  4. }
复制

为了凸显差异,这里返回page++后的值

  1. Book book(100);
  2. int page = book++;
  3. book.printInfo();
  4. std::cout << page << std::endl;
复制

输出

复制

参考文章

  1. 《C++从入门到精通(第6版)》

相关文章

暂无评论

none
暂无评论...