操作符的重载

1.基本

输入和输出

  1. cout << "hello" << endl << "world";
  2. 输出:
  3. hello world

可见,输出,endl 是换行的作用

  1. int x;
  2. cout << "input the num what you want:";
  3. cin >> x;
  4. cout << "the num you input is:";
  5. cout << x;

从键盘输入一个数值,赋值给 x,然后将数值再打印到屏幕。

上面的 << >> 左移和右移,居然实现了输入输出的例子,所以说左移和右移的运算符是被重载的,在不同的上下文,操作符有不同的功能;

C++操作符的重载:operator + 运算符

  1. struct Complex
  2. {
  3. int a;
  4. int b;
  5. };
  6. // 操作符的重载
  7. Complex operator+ (Complex &c1, Complex &c2)
  8. {
  9. Complex k;
  10. k.a = c1.a + c2.a;
  11. k.b = c1.b + c2.b;
  12. return k;
  13. }
  14. int main()
  15. {
  16. Complex a1 = { 1, 2 };
  17. Complex a2 = { 3, 4 };
  18. Complex a3 = operator+(a1, a2);
  19. // 也可以直接:Complex a3 = a1 + a2;
  20. cout << "a3.a=" << a3.a << endl;
  21. cout << "a3.b=" << a3.b << endl;
  22. while (1);
  23. }

操作符的重载实现了复数的加法运算,必须记得操作的重载的关键字:operator,

问题: 操作符的重载能不能在类里面实现?答案是可以的:

  1. class Complex
  2. {
  3. int a; // 默认的是私有的
  4. int b;
  5. public:
  6. Complex(int a = 0, int b = 0)
  7. {
  8. this->a = a;
  9. this->b = b;
  10. }
  11. int getA()
  12. {
  13. return a;
  14. }
  15. int getB()
  16. {
  17. return b;
  18. }
  19. ~Complex()
  20. {
  21. }
  22. // 指定朋友,友元函数
  23. friend Complex operator+ (Complex &c1, Complex &c2);
  24. };
  25. // 操作符的重载
  26. Complex operator+ (Complex &c1, Complex &c2)
  27. {
  28. Complex k;
  29. // 这样可以通过对象访问到private成员
  30. //k.a = c1.getA() + c2.getA();
  31. //k.b = c1.getB() + c2.getB();
  32. k.a = c1.a + c2.a; // 通过对象直接访问
  33. k.b = c1.b + c2.b;
  34. return k;
  35. }
  36. int main()
  37. {
  38. Complex a1(1, 2);
  39. Complex a2(3, 4);
  40. Complex a3 = a1 + a2;
  41. cout << "a3.a = " << a3.getA() << endl;
  42. cout << "a3.b = " << a3.getB() << endl;
  43. while (1);
  44. }

private成员,是不可以通过对象访问到private成员变量的,但是加上 friend关键字之后,就上上面的代码,指定了一个友元的函数,那么这个函数就可以通过对象访问private成员了,


  1. ostream& operator<< (ostream& out, Complex &c)
  2. { // 这个地方看不懂
  3. out << c.a << " and " << c.b << endl;
  4. return out;
  5. }
  6. int main()
  7. {
  8. Complex a1(1, 2);
  9. Complex a2(3, 4);
  10. Complex a3 = a1 + a2;
  11. cout << a3 << endl;
  12. while (1);
  13. }

操作符重载在类内实现:

  1. class Complex
  2. {
  3. int a; // 默认的是私有的
  4. int b;
  5. public:
  6. Complex(int a = 0, int b = 0)
  7. {
  8. this->a = a;
  9. this->b = b;
  10. }
  11. int getA()
  12. {
  13. return a;
  14. }
  15. int getB()
  16. {
  17. return b;
  18. }
  19. ~Complex()
  20. {
  21. }
  22. // 这里第一个对象有传入 this 指针,所以只需要一个就可以了,
  23. Complex operator+ (Complex &c2);
  24. };
  25. Complex Complex :: operator + (Complex &c2)
  26. {
  27. Complex k;
  28. k.a = this->a + c2.a;
  29. k.b = this->b + c2.b;
  30. return k;
  31. }
  32. int main()
  33. {
  34. Complex a1(1, 2);
  35. Complex a2(3, 4);
  36. Complex a3 = a1 + a2;
  37. cout << a3.getA() << endl;
  38. cout << a3.getB() << endl;
  39. while (1);
  40. }

这里需要注意,操作符的重载是可以在类的内部实现的,这里需要注意的是,传入的参数的个数,我们这里只需要传入第二个参数,原因是因为编译器会把第一个对象的地址传入 this 指针,所以传入一个就对了,传入两个,反而会出错,

在类的内部实现操作符的重载的好处:

(1)比全局的操作符重载函数少了一个参数嘛,因为传到 this 指针了

(2)不需要使用 friend 关键字

来自为知笔记(Wiz)

时间: 2024-10-29 19:10:35

操作符的重载的相关文章

关于解引用*和箭头操作符-&gt;的重载

这里以一个智能指针类为例,智能指针所指为一个对象. 而事实上,STL迭代器的开发均需要重载这两个操作符,上一篇文章分析STL 迭代器中除了要用到template技巧外,还需要重载技巧 1 #include<iostream> 2 using namespace std; 3 class Screen 4 { 5 6 public: 7 friend ostream& operator<<(ostream&os, Screen &s); 8 int actio

c++ new和delete操作符的重载

先分析一条语句: Base *pb= new Base; 这条语句是怎么执行的?首先,这个函数调用标准C++的operator new()函数,然后调用Base的构造函数. 如果我们自定义new时,可以自定义一个new,如 class Base { static void* operator new(size_t size) { } static void operator delete(void *p) { } } 这个Base类里面的new 和delete覆盖掉标准new和标准delete,

【转】c++ new操作符的重载

基本概念: 1. 操作符重载:C++支持对某个操作符赋予不同的语义 2. new操作符:申请内存,调用构造函数 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new 的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时, string *pa = new string("memory managerment"); 你使用的是new 操作符,这个操作符和sizeof 一样,是c++ 语言级别支持的.你不能改变它的语义,它做的事情总是不变的:分

数组操作符的重载(二十八)

我们在学习了 string 类对象后,就不禁头脑中冒出了一个问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?那么 string 类最大限度的考虑了 C 字符串的兼容性,可以按照使用 C 字符串的方式使用 string 对象. 下来我们用 C 方式使用 string 类,看看示例代码 #include <iostream> #include <string> using namespace std; int main() {     string 

C++中前置操作符和后置操作符的重载

1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: 2,++i  // i 自增 1,i 的值作为返回值: 3,没有使用返回值,由于编译器(不同的编译器都是一样的)的优化,在工程上面,这两行代码没有区别: 2,真的有区别吗?编程实验: 1,main.cpp 文件: 1 #include <iostream> 2 #include <stri

C++学习之路: 特殊操作符-&gt;的重载

转自:http://blog.csdn.net/custa/article/details/5674434 primer 书上对重载该操作符的解释过于简单,但是总结性十分强: 重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己的箭头操作符的类类型对象. 如果返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并从结果对象获取指定成员.如果被指向的类型没有定义那个成员,则编译器产生一个错误. 如果返回类型是类类型的其他对象(或是这种对象的引用),则将递归应用该操作符.编译器检

对操作符的重载和转换操作符--------------c#

这种写法能 自由自在的使用 加减乘除等操作符: 先定义一个类 public sealed class chongzai { public Int32 canshu1; //重载操作符 + ,参数必须包含一个以上当前的类型chongzai. public static Int32 operator +(chongzai s, Int32 c) { return (s.canshu1 + c); } //转换操作符,,,可以用=号,将string转换成 chongzai类型,这个implicit是隐

增量操作符的重载

++增量互有前增量和后增量区别,重载操作符时,虽然函数名相同,但是应有相应的区别.对于一个整型变量前增量操作符的结果与返回值变量是一致的,而后增量操作符返回的是一个临时变量.于是在增量操作符重载时也需要有前增量与后增量的区分. 前增量操作对象与返回对象是同一个变量,在反应对象的前增量操作时,要求参数为对象的引用,返回值也是对象的引用: className& operator++() ://前增量操作符设置为类成员函数 friend className& operator++(classNa

C#操作符的重载

我们知道,在C#中,所有数据要么属于某个类,要么属于某个类的实例,充分体现了面向对象的思想.因此,为了表达上的方便,人们希望可以重新给已定义的操作符赋予新的含义,在特定的类的实例上进行新的解释.这就需要通过操作符重载来解决. 使用成员方法重载操作符 C#操作符重载总是在类中进行声明,并且通过调用类的成员方法来实现. 操作符重载声明的格式为: type operator operator-name(formal-param-list)  C#操作符重载可以实现的有: + - ! ~ ++ -- t