#include<iostream>
using namespace std;
class Test {
friend Test addTest(Test &obj1, Test &obj2);
// friend Test operator+(Test &obj1, Test &obj2);
public:
Test(int a = , int b = )
{
this->a = a;
this->b = b;
}
void display()
{
cout << "a:" << a << " b:" << b << endl;
}
public:
Test operator+(Test &obj)
{
Test temp(this->a+obj.a,this->b+obj.b);
return temp;
}
private:
int a;
int b;
};
Test addTest(Test &obj1, Test &obj2)
{
Test temp(obj1.a + obj2.a, obj1.b + obj2.b);
return temp;
}
//Test operator+(Test &obj1, Test &obj2)
//{
// Test temp(obj1.a + obj2.a, obj1.b + obj2.b);
// return temp;
//}
int main()
{
/* 第一个测试
Test t1(1, 2), t2(3, 4);
Test t3 = addTest(t1, t2);
Test t4 = t1+t2;//err
t3.display();
*/ /* 第二个测试
Test t1(1, 2), t2(3, 4);
Test t3 = operator+(t1, t2);
Test t4 = t1+t2;
t3.display();
t4.display();
*/
/*第三个测试
Test t1(1, 2), t2(3, 4);
// Test t3 = operator+(t1, t2);err
Test t3 = t1.operator+(t2);
Test t4 = t1+t2;
t3.display();
t4.display();
*/
cout << "hello world!\n";
return ;
}

根据不同重载方式有不同的调用方式。全局函数重载运算符,成员函数或者友元函数重载运算符。

重载运算符是具有特殊名字的函数,它由关键字operator和其后要定义的运算符共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。

重载运算符的参数数量应该与运算符作用的对象数量一样多,一元运算符一个参数,二元运算符两个参数。对于二元运算符,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。除了重载的函数调用运算符operatoe()之外,其他重载运算符不能含有默认实参。

如果一个运算符是成员函数,则它的第一个(左侧)运算对象绑定到隐式的this指针上,因此,成员运算符函数的(显式)参数数量比运算符的运算对象少一个。

对于一个运算符函数来说,它或是类的成员,或者至少含有一个类类型的参数:

int operator+(int,int)//错误,不能为int重定义内置的运算符

我们只能重载已经有了的运算符而不能发明新的运算符,我们可以重载大部分运算,但不是全部。

对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致。

通常情况我们不应该重载逗号,取地址,逻辑与和逻辑或运算符。

运算符重载本质是函数调用,所以关于运算对象的求值顺序的规则无法应用到重载的运算符上。而&&和||的短路求值属性也无法保留,因此不建议重载他们。对于逗号和取地址运算符,c++语言已经定义了它们用于类类型对象时的特殊含义,这一点与大多数运算符都不相同。这两种运算符已经有了内置的含义,所以一般来说不应该被重载,否则它们的行为将异于常态,从而导致类的用户不好适应。

当你设计一个类时,首先应该考虑这个类提供哪些操作,再思考到底应该把每个类操作设成普通函数还是重载运算符。

如果执行IO操作,则定义一维运算符使其与内置类型IO保持一致;

如果有了operator==通常应该有operator!=,有了 <  通常应该有  > ;

重载运算符的返回类型通常情况下应该与其内置版本的返回类型兼容:逻辑运算符和关系运算符应该返回bool,算术运算符应该返回一个类类型的值,赋值运算符和复合赋值运算符则应该返回左侧对象的一个引用。

c++之---初探重载操作符的更多相关文章

  1. Groovy重载操作符

    重载一时爽,一直重载一直爽. 最近在读<Groovy in action>一本书重新复习了Groovy的一些语法特性,迷恋上这个重载操作符的功能,坚持爽的不要要的.分享一个Demo. 由于 ...

  2. 《精通C#》索引器与重载操作符(11.1-11.2)

    1.索引器方法结构大致为<modifier><return type> this [argument list],它可以在接口中定义: 在为接口声明索引器的时候,记住声明只是表 ...

  3. C++ 重载操作符与转换

    <C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...

  4. 解释清楚c++的重载操作符【用自己的话,解释清楚】

    C++中对于内置的变量及标准库中常见的类定义类常见的操作符含义,对于自定义的类也可以通过关键字operate 重载操作符的含义. C++中支持重载的目的 诚然操作符的重载可以通过使用函数实现同样的功能 ...

  5. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  6. [019]转--C++ operator关键字(重载操作符)

    原博客:http://www.cnblogs.com/speedmancs/archive/2011/06/09/2076873.html operator是C++的关键字,它和运算符一起使用,表示一 ...

  7. VC6.0中重载操作符函数无法访问类的私有成员

    整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...

  8. C++高精度运算类bign (重载操作符)

    大数据操作,有例如以下问题: 计算:456789135612326542132123+14875231656511323132 456789135612326542132123*14875231656 ...

  9. C++ operator关键字(重载操作符)(转)

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

随机推荐

  1. API密钥

    什么是API密钥? 答:在api调用时,用来按照指定规则对您的请求参数进行签名,服务器收到你的请求时会进行签名验证,即可以界定你的身份也可以防止其他人通过某种手段恶意篡改你的请求数据. 密钥的使用? ...

  2. Linux下umask的缺省默认权限

    Linux有缺省默认文件.文件夹权限umask.默认 777 -xxx(文件夹)  666 - xxx(文件) 11.查看当前用户umask R(4)--W(2)--X(1) [root@mvpban ...

  3. jquery api 常见 事件操作

    change.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  4. 【LeetCode】37. Sudoku Solver

    Sudoku Solver Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are i ...

  5. 【js】js中的||和&&

    逻辑与&&和逻辑或||操作符可以应用于任何类型的操作数,而不仅仅是布尔值. 几乎所有语言中||和&&都遵循“短路”原理, 如&&中第一个表达式为假就不会 ...

  6. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  7. 【转】对 Go 语言的综合评价

    以前写过一些对 Go 语言的负面评价.现在看来,虽然那些评价大部分属实,然而却由于言辞激烈,没有点明具体问题,难以让某些人信服.在经过几个月实际使用 Go 来构造网站之后,我觉得现在是时候对它作一些更 ...

  8. Python endswith() 方法

    描述 endswith() 方法用于判断字符串是否以指定后缀结尾,如果是则返回 True,否则返回 False. 语法 endswith() 方法语法: S.endswith(suffix[,star ...

  9. C#--类成员

    数据成员: 字段: 常量: 函数成员(执行代码): 方法: 属性 构造函数 析构函数 运算符 索引 事件 可以被声明为Static的类成员是:

  10. 机器学习(4): KNN 算法

    1. 综述      1.1 Cover和Hart在1968年提出了最初的邻近算法      1.2 分类(classification)算法      1.3 输入基于实例的学习(instance- ...