您的位置:首页 > 编程语言 > C语言/C++

c++ operator重载 使用

2016-05-24 21:35 399 查看
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

一、为什么使用操作符重载?

对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数版本的实现。

一些例子

#include <QCoreApplication>
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_modules.hpp>

using namespace std;

class Child
{
public:
int age;
int length;
int sex;
};

class Person
{
public:
int age;
int length;

public:
Person()
{
this->age = 0;
this->length = 0;
}

operator Child();

inline bool operator == (const Person &ps) const;
inline Person operator + (const Person &ps) const;
inline Person operator () (const int _age, const int _length) const;
inline Person operator [] (const int _age) const;
};

Person::operator Child()
{
Child child;

child.age = this->age;
child.length = this->length;

return child;
}

bool Person::operator == (const Person &ps) const
{
if ((this->age == ps.age) && (this->length == ps.length))
{
return true;
}

return false;
}

Person Person::operator + (const Person &ps) const
{
Person person;

person.age = this->age + ps.age;
person.length = this->length + ps.length;
return person;
}

Person Person::operator () (const int _age, const int _length) const
{
Person person;

person.age = this->age + _age;
person.length = this->length + _length;
return person;
}

Person Person::operator [] (const int _age) const
{
Person person;

person.age = _age;
person.length = 0;
return person;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Person personJim;
Person personGreen;

// operator type change
personJim.age = 10;
personJim.length = 150;

Child childJim = personJim;
cout << "operator type" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "childJim age "<<childJim.age <<" lenght "<< childJim.length<<endl;

// operator =
personJim.age = 10;
personJim.length = 150;
personGreen.age = 20;
personGreen.length = 180;
cout << "operator ==" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "personGreen age "<<personGreen.age <<" lenght "<< personGreen.length<<endl;
personJim = personGreen;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "personGreen age "<<personGreen.age <<" lenght "<< personGreen.length<<endl;

// operator +
personJim.age = 10;
personJim.length = 150;
personGreen.age = 20;
personGreen.length = 180;
cout << "operator +" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "personGreen age "<<personGreen.age <<" lenght "<< personGreen.length<<endl;
personJim = personJim + personGreen;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "personGreen age "<<personGreen.age <<" lenght "<< personGreen.length<<endl;

// operator ==
personJim.age = 10;
personJim.length = 150;
personGreen.age = 10;
personGreen.length = 180;
cout << "operator +" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
cout << "personGreen age "<<personGreen.age <<" lenght "<< personGreen.length<<endl;
if (personJim == personGreen)
{
cout << "personJim == personGreen" <<endl;
}
else
{
cout << "personJim != personGreen" <<endl;
}

// operator ()
personJim.age = 10;
personJim.length = 150;
cout << "operator ()" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
Person personTom = personJim(100, 200);
cout << "personTom age "<<personTom.age <<" lenght "<< personTom.length<<endl;

// operator []
personJim.age = 10;
personJim.length = 150;
cout << "operator []" <<endl;
cout << "personJim age "<<personJim.age <<" lenght "<< personJim.length<<endl;
personTom = personJim[20];
cout << "personTom age "<<personTom.age <<" lenght "<< personTom.length<<endl;

return a.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: