• 【C++】class的设计与使用(六)运算符重载、嵌套类型(typedef)


    运算符重载

    class Triangular_iterator
    {
    public:
    	//为了不要在每次访问元素的时候都执行-1操作
    	//此处将_index的值设为index-1(就是贴合数组的逻辑次序)
    	Triangular_iterator(int index):_index(index-1){}
    	
    	bool operator==(const Triagnular_iterator&)const;
    	bool operator!=(const Triangular_iterator&)const;
    	int operator*()const;
    	Triangular_iterator& operator++();  //前置版
    	Triangular_iterator operator++(int);//后置版
    										//运算符重载
    private:
    	void check_integrity()const;
    	int _index;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    //如果两个Triangular_iterator对象的索引值(_index)相等
    //这两个对象相等
    inline bool Triangular_iterator::
    operator==(const Triangular_iterator &rhs)const
    {
    	return _index==rhs._index
    }
    
    //重载运算符后,可以直接用于类对象
    if(trian1==trian2)//...
    
    //如果想将重载后的运算符作用于指针所指的类对象
    //要先提领该指针,取出其所指对象
    if(*ptri1==*ptri2)//...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    //重载!=运算符
    inline bool Triangular_iterator::
    operator!=(const Triangular_iteragor &rhs) const
    {
    	return !(*this==rhs);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运算符重载的规则

    1. 不可以引入新的运算符:除了. .* :: ?:四个运算符,其他的运算符皆可被重载;
    2. 运算符的操作数个数不能变:二元运算符需要两个操作数,一元运算符需要一个操作数;
    3. 运算符优先级不可改变;
    4. 运算符函数的参数列表中,必须至少有一个参数为class类型:我们没法给比如指针这种非类类型重载运算符,也不能给它引进新运算符。
    //重载运算符的运算符函数定义方式
    inline int  operator*(const Triangular_iterator)
    {
    	rhs.check_integrity();
    	//如是一个非成员函数,就没有访问私有成员的权利
    	return Triangular::_elems[_index];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    非成员运算符的参表中,会比成员函数形式定义的运算符多出一个参数,即this指针(该this指针隐式代表左操作数)。

    //递增运算符(++)的前置版本的重载
    inline Triangular_iterator& Triangular_iterator::
    operator++()
    {
    	//前置版本
    	++_index;
    	check_integrity();
    	return *this;
    }
    
    //递增运算符(++)的后置版本的重载
    inline Triangular_iterator Triangular_iterator::
    operator++( int )
    {
    	//后置版本
    	Triangular_iterator tmp = *this;
    	++_Index;
    	check_integrity();
    	return tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    嵌套类型

    typedef可以为某个类型设定另一个不同的名称。
    通用形式:typedef 内置类型/复合类型/class类型 new_name;

    typedef Triangular_iterator iterator;
    
    iterator it=trian.begin();//错误
    Triangular::iterator it=trian.begin();//正确
    
    Fibonacci::iterator ift=fib.begin();
    Pell::iterator pit=pel.begin();
    vector<int>::iterator vit=_elems.begin();
    string::iterator sit=file_name.begin();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    家政服务行业怎么做微信小程序开发
    .NET 6应用程序适配国产银河麒麟V10系统随记
    PG::Photography
    Arduino程序设计(二) 按键控制LED灯
    基于php湘西旅游网站管理系统获取(php毕业设计)
    基于粒子群算法优化支持向量机研究(Python代码实现)
    使用 axios 进行 HTTP 请求
    深入剖析Java类加载过程:探寻类加载器的奥秘
    Pthread 并发编程(二)——自底向上深入理解线程
    8.Ribbon负载均衡服务调用
  • 原文地址:https://blog.csdn.net/weixin_49347928/article/details/133396526