基本概念:

  • 对已有的运算符赋予多重的含义
  • 使同一运算符作用于不同类型的数据时,有不同类型的行为
  • 目的是扩展C++中提供的运算符的适用范围,以用于类所表示的抽象数据类型

运算符重载的实质函数重载

返回值类型 operator 运算符(形参表) { }

可重载为普通函数成员函数,成员函数的形参中因为this指针的关系,少了一个参数,其他都相同。

赋值运算符'='重载:

赋值运算符'='是可以直接作用于两个类之间的赋值,也就是将两个类里的同一变量各自赋值,不需要重载就可使用。

但有时我们需要'='两边不匹配的类型进行赋值,比如char*类型和字符串类型。

  • 赋值运算符'='只能重载为成员函数

 实例:

 1 #include <iostream>
 2 using namespace std;
 3 class String {
 4 public:
 5     char * p;
 6     String() :p(NULL) {}
 7     const char*c_str() { return p; } //返回为const char*类型防止被修改
 8     char * operator = (const char *s ) {
 9         //'='运算符重载
10         if (p)
11                 //若p不为空,则删除指针p
12             delete[]p;
13         if (s) {
14                 //s不为空
15             p = new char[strlen(s) + 1];
16             strcpy(p, s);
17         }
18         else
19             p = NULL;
20         return p;
21     }
22     ~String() {
23         if (p)
24                 //类析构时检测p指针是否为空
25             delete[]p;
26     }
27 };
28 int main() {
29     String s;
30     s = "Good Luck";//调用运算符重载函数
31     cout << s.c_str() << endl;//输出
32     return 0;
33 }

 

浅复制与深复制:

  • 浅复制:直接将一个类中变量的指针指向另一个变量的指针所指空间。
  • 深复制:与浅复制相对,不是将指针直接赋值,而是将指针中的内容进行复制。
  • 当我们写代码的时候,不要用浅复制!!!不然两个指针指向同一个地方,删除的时候会出现错误。

浅复制实例:

1 //并不是沿用上面的类!!!'='运算未重载
2 MyString S1, S2;
3 S1 = "This";
4 S2 = "That";
5 S1 = S2;//S1和S2指向同一个地址

深复制实例:

1 //沿用第一个实例中的类,'='运算符重载
2 String S1, S2;
3 S1 = "This";
4 S2 = "That";
5 S1 = S2;//因为用strcpy进行了复制,所以两个指针并未指向同一个地址

 运算符重载与友元函数:

  • 运算符重载为成员函数不需要声明为友元函数,而重载为普通函数,又需要访问类中的私有成员的时候需要声明为友元函数!!!
  • 运算符重载声明为友元函数和其他函数声明为友元函数一样

 

posted on 2018-03-20 17:54  宵夜在哪  阅读(145)  评论(0编辑  收藏  举报