[C++]operator overlord

来源:互联网 发布:优酷网络大电影申报 编辑:程序博客网 时间:2024/06/06 04:31
本文,记录C++所有运算符重载的实现。

学习参考:
  1. 在线文档:http://en.cppreference.com/w/cpp/language/operators
  2. 《C++ primer plus》第11章 使用类
    1. 操作符重载
    2. 友元对操作符重载的影响
注意:普通类与模板类是有区别的。

<<流输出


error: need ‘typename’ before ‘std::vector<elemType>::const_iterator’ because ‘std::vector<elemType>’ is a dependent scope
链接
原定义:
std::vector<elemType>::const_iterator it;
所以,将定义改为:
typename  std::vector<elemType>::const_iterator it;
因为在模板类里面,因为同样定义为模板,而迭代器在模板当中,也适当添加typename(模板的类型说明关键字)

warning: friend declaration 'std::ostream& operator<<(std::ostream&, const Bag<valType>&)' declares a non-template function [-Wnon-template-friend]
     friend ostream& operator <<(ostream &os, const Bag<valType> &bag);
                                                                 ^
链接
所以,将声明改为:
template <typename T> friend inline ostream& operator <<(ostream &os, const Bag<T> &bag);
友元函数并不是成员函数,所以,应该重新声明为模板,即添加:template <typename T>

error: conversion from 'std::__cxx11::list<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >::const_iterator {aka std::_List_const_iterator<std::__cxx11::basic_string<char> >}' to non-scalar type 'std::__cxx11::list<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >::iterator {aka std::_List_iterator<std::__cxx11::basic_string<char> >}' requested
     typename std::list<valType>::iterator it = _elem.begin();
                                                            ^
链接
所以,将类型改为:
typename list<T>::const_iterator cit = bag._elem.begin();
因为原来的参数被定义为const,所以,迭代器也应该使用const_iterator

=赋值

[C++]copy constructor and copy assignment operator


归纳

操作符表示法中,操作符左侧的对象是调用对象,操作符右边的对象是作为参数被传递的对象。
c = a + b;
将被装换为
c = a.operator+(b);
这里,a是调用对象,b是被传递的对象。

成员函数还是非成员函数?
Time operator+(const Time &t) const;//member function
firend Time operator+(const Time & t1, const Time &t2);//non-member function
加法操作需要两个操作数
  1. 成员函数:一个操作数通过this指针隐式传递,另一个作为函数参数显式传递
  2. 友元函数:两个操作数都操作参数传递
t1 = t2 + t3;
可被解析为下面任意一个
t1 = t2.operator+(t3);
t1 = operator+(t2, t3);
但不能同时定义两个,因为两个格式都与同一个表达式匹配,会被市委二义性错误,导致编译错误。