下标操作符的重载
const int& Foo::operator[] (const size_t index) const
{ return data[index] ;}
int& Foo::operator[] (const size_t index)
{ return data[index] ;}
下标操作符必须定义为类成员函数,且一般有非const成员并返回引用和const成员并返回const引用两个版本。
C++主要操作符重载的定义和总结
一、输出操作符<<的重载
ostream& operator << (ostream& os,const ClassType &object)
{os</.....
return os;}
为了与IO标准库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参,并返回对ostream形参的引用。
二、输入操作符>>的重载
istream& operator>>(istream& in,Sale_item& s)
{in>>//....
return in;}
输入操作符的第一个形参是一个引用,它的第二个形参是对要读入的对象的非const引用,返回同一个流的引用。
三、加法操作符+的重载
Sales_item operator+(const Sales_item& 1hs,const Sales_item& rhs)
{ Sales_item ret(1hs);
ret+=rhs;
return ret; }
为了与内置操作符保持一致,加法返回一个右值,而不是一个引用。
四、相等操作符==的重载
bool operater == (const Sales_item &1hs,const Sales_item &rhs)
{return 1hs.a==rhs.a&&1hs.b==rhs.b&&1hs.same_isbn(rhs);}
类使用相等操作符应表示每个对应数据成员都相等,使更容易与标准库一起使用,如算法find。同时应定义!=操作符。
五、关系操作符<的重载
关联容器和某些算法使用小于操作符,所以定义operator<可能相当有用。
但很多类不应该定义关系操作符,因为关系操作符与==的逻辑定义不一致,所以不定义会更好。
六、赋值操作符=的重载
string& operator=(const string&);// s1=s2;
string& operator=(const char *);// s1="str";
string& operator=(char);//s1='c';
无论形参为何种类型,赋值操作符必须定义为成员函数,且必须返回对*this的引用。
七、下标操作符的重载
const int& Foo::operator[] (const size_t index) const
{ return data[index] ;}
int& Foo::operator[] (const size_t index)
{ return data[index] ;}
下标操作符必须定义为类成员函数,且一般有非const成员并返回引用和const成员并返回const引用两个版本。
八、自增/自减操作符的重载
(1)前缀式:
CheckedPtr& CheckedPtr::operator++()
{ if(cur==end) throw out_of_range("increment past the end of CheckedPtr); //cur为私有数据成员
++curr;
return *this; }
(2)后缀式:
CheckedPtr CheckedPtr::operator++(int)
{CheckPtr ret(*this); //保存当前状态
++*this;
return ret; }
前缀式需要检查是否越界,后缀式函数需要接受一个额外的(即无用的)int型形参来区分前缀式函数。如果想要使用函数调用后缀式操作符,
必须给出一个整形实参值: CheckedPtr parr(ia,ia_size)
parr.operator++(0);
最后补充几点:
1、 除了函数调用操作符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数数目相同。
2、 重载操作符必须具有至少一个类类型的操作数。
3、 作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数
4、 类一般都需重载输入/输出操作数,IO操作符必须为非成员符,所以类常将其设为友元。
5、 &&、&、||和,等操作符最好不要重载。
#include
#include
using namespace std;
class Foo;
class Foo{
private:
std::vector
friend std::istream& operator>>(std::istream& in ,Foo& foo)
{
int a;
foo.date.clear();
for(int i = 0; i < foo.date.capacity(); i++)
{
in >>a;
foo.date.push_back(a);
}
return in;
}
friend std::ostream& operator<<(std::ostream &out ,Foo& foo)
{
for(int i = 0; i < foo.date.size(); i++)
{
out << i <<": "<
return out;
}
public:
int &operator[] (const size_t index)
{
return date[index];
}
Foo()
{
date.reserve(10);
}
};
void main()
{
Foo a[10];
cin>>a[0];
cout<}