概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型
1、加号运算符重载
class person
{
public:
//成员函数重载+号
/*person operator+(person &p)
{
person temp;
temp.m_A = this->m_A + p.m_A;
temp.m_B = this->m_B + p.m_B;
return temp;
}*/
int m_A;
int m_B;
};
//全局函数重载+号
person operator+(person &p1, person &p2)
{
person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
return temp;
}
//运算符重载,可以发生函数重载
person operator+(person &p, int num)
{
person temp;
temp.m_A = p.m_A + num;
temp.m_B = p.m_B + num;
return temp;
}
void test01()
{
person p1;
p1.m_A = 10;
p1.m_B = 20;
person p2;
p2.m_A = 30;
p2.m_B = 40;
//成员函数重载本质调用
//person p3 = p1.operator+(p2);
//全局函数重载本质调用
person p3 = operator+(p1, p2);
//person p3 = p1 + p2;
cout << "p3.m_A = " << p3.m_A << endl;
cout << "p3.m_B = " << p3.m_B << endl;
int a = 10;
person p4 = p3 + a;
cout << "p4.m_A = " << p4.m_A << endl;
cout << "p4.m_B = " << p4.m_B << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
p3.m_A = 40
p3.m_B = 60
p4.m_A = 50
p4.m_B = 70
请按任意键继续. . .
总结1:对于内置的数据类型的表达式的运算符是不能改变的
总结2:不要滥用运算符重载
2、左移运算符重载‘<<’
class person
{
public:
int m_A;
int m_B;
};
//一般不用成员函数重载<<,用全局函数重载<<号
ostream & operator<<(ostream &cout, person &p)
{
cout << "m_A= " << p.m_A << " m_B=" << p.m_B << endl;
return cout;
}
void test01()
{
person p1;
p1.m_A = 10;
p1.m_B = 20;
cout << p1 << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
3、重载递增运算符‘++’
class MyInteger
{
public:
MyInteger()
{
m_A = 0;
}
//重载前置++运算符
/*MyInteger & operator++()
{
m_A++;
return *this;
}*/
//重载后置++运算符
MyInteger operator++(int)
{
MyInteger temp = *this;
m_A++;
return temp;
}
int m_A;
};
//一般不用成员函数重载<<,用全局函数重载<<号
ostream & operator<<(ostream &cout, MyInteger &p)
{
cout << p.m_A << endl;
return cout;
}
//void test01()
//{
// MyInteger p1;
//
// cout << p1 << endl;
// cout << ++p1 << endl;
//
//}
void test02()
{
MyInteger p2;
cout << p2 << endl;
p2++;
cout << p2 << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
4、赋值运算符重载
c++编译器至少给一个类添加四个函数
1、默认构造函数
2、默认析构函数
3、默认拷贝构造函数,对属性进行值拷贝
4、赋值运算符operator=,对属性进行值拷贝
class person
{
public:
person(int age)
{
m_age = new int(age);//在堆区开辟
}
~person()
{
if (m_age != NULL)//清空堆区
{
delete m_age;
m_age = NULL;
}
}
person & operator=(person &p)//重载=运算符
{
if (m_age != NULL)
{
delete m_age;
m_age = NULL;
}
m_age = new int(*p.m_age);
return *this;
}
int *m_age;
};
void test01()
{
person p1(18);
person p2(20);
person p3(30);
p3 = p2 = p1;//赋值操作
cout << "age = " << *p1.m_age << endl;
cout << "age = " << *p2.m_age << endl;
cout << "age = " << *p3.m_age << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
5、关系运算符重载
class person
{
public:
person(string name, int age)
{
m_name = name;
m_age = age;
}
bool operator==(person &p)
{
if (this->m_name == p.m_name && this->m_age == p.m_age)
{
return true;
}
return false;
}
string m_name;
int m_age;
};
void test01()
{
person p1("刘治", 18);
person p2("mike", 18);
if (p1 == p2)
{
cout << "p1和p2相等 " << endl;
}
else {
cout << "p1和p2不想等" << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
6、函数调用运算符重载
- 函数调用运算符‘()’也可以重载
- 由于重载后使用的方式非常像函数的调用,因此成为仿函数
- 仿函数没有固定写法,非常灵活
class myPrint
{
public:
void operator()(string test)
{
cout << test << endl;
}
};
void test01()
{
myPrint mp1;
mp1("hello world");
}
int main()
{
test01();
system("pause");
return 0;
}