基本概念:
- 对已有的运算符赋予多重的含义
- 使同一运算符作用于不同类型的数据时,有不同类型的行为
- 目的是扩展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进行了复制,所以两个指针并未指向同一个地址
运算符重载与友元函数:
- 运算符重载为成员函数并不需要声明为友元函数,而重载为普通函数,又需要访问类中的私有成员的时候需要声明为友元函数!!!
- 运算符重载声明为友元函数和其他函数声明为友元函数一样。