标签:引入 names 构造 第一个 null 运算符重载 数据 logs 结合
C++ 允许在同一个作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
然后我们今天来主要学习一下运算符重载。。。
对于用户,可以重定义或重载大部分c++内置的运算符,这样用户就能使用自定义类型的运算符。
重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个返回参数列表。
1 Box operator+(const Box&);
声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:
Box operator+(const Box&, const Box&);
什么是运算符的重载?
运算符与类结合,产生新的含义。
为什么要引入运算符重载?
作用:为了实现类的多态性(多态是指一个函数名有多种含义)
怎么实现运算符的重载?
方式:类的成员函数 或 友元函数(类外的普通函数)
规则:不能重载的运算符有 . 和 .* 和 ?: 和 :: 和 sizeof
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 class Person 5 { 6 //设置成友元函数 在函数内 访问Person类中的所有数据 7 friend ostream& operator<<(ostream &out, Person &ob); 8 private: 9 char *name; 10 int num; 11 public: 12 Person(char *name, int num) 13 { 14 this->name = new char[strlen(name)+1]; 15 strcpy(this->name,name); 16 this->num = num; 17 cout<<"有参构造"<<endl; 18 } 19 //普通的成员函数 20 void printPerson(void) 21 { 22 cout<<"name = "<<name<<", num = "<<num<<endl; 23 } 24 ~Person() 25 { 26 if(this->name != NULL) 27 { 28 delete [] this->name; 29 this->name = NULL; 30 } 31 cout<<"析构函数"<<endl; 32 } 33 }; 34 35 ostream& operator<<(ostream &out, Person &ob)//out=cout, ob =ob1 36 { 37 //重新实现 输出格式 38 out<<ob.name<<", "<<ob.num; 39 40 //每次执行为 返回值得到cout 41 return out; 42 } 43 int main(int argc, char *argv[]) 44 { 45 Person ob1("lucy",18); 46 //普通的成员函数 遍历信息 47 //ob1.printPerson(); 48 49 //cout默认输出方式 无法识别 自定义对象 输出格式 50 //cout<<ob1<<endl;//err 51 52 //运算符重载的调用方式1: 53 operator<<(cout, ob1)<<endl; 54 //运算符重载的调用方式2: 55 //对方法1 进行优化 去掉operator,第一个参数 放在运算符<<的左边 第二个参数 放在运算符<<的右边 56 cout<<ob1<<endl;//等价operator<<(cout, ob1); 57 58 Person ob2("bob",19); 59 cout<<ob1<<" "<<ob2<<endl; 60 61 return 0; 62 }
有一位大佬对C++运算符总结的特别彻底,读者可以去看看...链接:https://www.cnblogs.com/sexybear/p/4551742.html--我自己认为是一篇特别特别好的文章...
标签:引入 names 构造 第一个 null 运算符重载 数据 logs 结合
原文地址:https://www.cnblogs.com/loliconinvincible/p/12540259.html