• 运算符重载


    关键字:operator

    相见:《高质量程序设计指南》 P255

    如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。

    如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数。

    运算符重载的特殊性

    1. 如果重载为成员函数,则this对象发起对它的调用
    2. 如果重载为全局函数,则第一个参数发起对它的调用
    3. 禁止用户发明该语言运算符集合中不存在的运算符
    4. 除了函数调用运算符“()”外,其他运算符重载函数不能有默认参数值
    5. 不要试图改变重载运算符的语义,要与其内置语义保持一致。如果你把“++”运算符重载后让它执行递减操作,重载“<<=”和“>>=”执行I/O操作,都会损害程序的可理解性。
    6. 某些运算符之间可以互相推导..............................................


    不能重载的运算符

    1. 不能重载".",因为它在ADT/UDT中对任何成员都有意义,已成为标准用法
    2. 不能重载反引用类成员指针“.*”
    3. 不能重载作用域解析运算符"::"
    4. 不能重载那个唯一的三元运算符---条件运算符“?:”
    5. 不能重载sizeof()和typeid()
    6. 不能重载C++的新式类型转换运算符:static_cast<>,dynamic_cast<>、const_cast<>、reinterpret_cast<>。
    7. 不能重载“#”和“##”等预处理操作符

    重载 ++ 和 --

    C++标准规定:当为一个类型重载“++”和“--”的前置版本时,不需要参数;当为一个类型重载“++”和“--”的后置版本时,需要一个int类型的参数作为标志(即哑元,非具名参数)

    class Integer
    {
    public:
    	Integer(long data) :m_data(data) {}
    	Integer& operator++()//前置版本:返回引用
    	{
    		cout << "Integer& operator++() called!" << endl;
    		m_data++;
    		return *this;
    	}
    
    	Integer operator++(int)//后置版本:返回对象的值
    	{
    		cout << "Integer& operator++(int) called!" << endl;
    		Integer temp = *this;
    		m_data++;	//或++(*this);
    		return temp;  //返回this对象的旧值
    	}
    protected:
    private:
    	long m_data;	//对long 的封装
    };
    
    int main()
    {
    	Integer x = 1;//call Integer(long)
    	++x;	//call operator++()
    	x++;	//call operator++(int)
    	return 0;
    }
    

    当"++" 和 "--"应用于基本类型数据时,前置版本和后置版本在效率上没有多大差别。然而,当应用于用户定义类型,尤其是大对象的时候,前置版本就会比后置版本的效率高许多。后置版本总是要创建一个临时对象,在退出函数还要销毁它,而且返回临时对象的值时还会调用其拷贝对象。所以,如果你可以选择的话,尽量使用前置版本。  

  • 相关阅读:
    CentOS6.7 mysql5.6.33修改数据文件位置
    win8 win10 安装msi 提示2502、2503的错误代码
    2016年国内开源镜像站点汇总
    eclipse创建本地maven
    maven添加sqlserver的jdbc驱动包
    CentOS6.5下RPM方式安装mysql5.6.33
    linux中~和/的区别
    Linux命令学习(22):ss命令
    Linux命令学习(21):netstat命令
    Linux命令学习(20):traceroute命令
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5232721.html
Copyright © 2020-2023  润新知