运算符重载

c++中运算符重载

↘锁芯ラ 提交于 2019-11-29 16:29:18
参考:轻松搞定c++语言 定义: 赋予已有运算符多重含义,实现一名多用(比较函数重载)     运算符重载的本质是函数重载 重载函数的格式: 函数类型 operator 运算符名称 ( 形参表列 ) { 重载实体 ; } 比如: const Complex operator +( const Complex &c1, const Complex &c2); 友元函数的重载: 1 #include <iostream> 2 using namespace std; 3 4 class Complex 5 { 6 public: 7 Complex(float x=0, float y=0) :_x(x),_y(y){} 8 void dis() 9 { 10 cout<<"("<<_x<<","<<_y<<")"<<endl; 11 } 12 friend const Complex operator+(const Complex &c1,const Complex &c2); 13 private: 14 float _x; 15 float _y; 16 }; 17 const Complex operator+(const Complex &c1,const Complex &c2) 18 { 19 return Complex(c1._x + c2._x,c1._y + c2

运算符重载

こ雲淡風輕ζ 提交于 2019-11-29 14:21:47
运算符重载 1.重载 重载是指赋予新的含义 c++允许在同一作用域内的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载 函数重载: 可以让一个函数名有多重功能,在不同情况下进行不同的操作 运算符重载: 赋予同一个运算符多重不同功能 在同一作用域内可以声明多个功能类似的同名函数,但是这些函数的形参(个数、类型、顺序)必须至少有一样不同,不能是返回值不同。 2.运算符重载 并不是所有运算符都可以被重载 可重载 运算符 + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> <<= >>= == != <= >= && || ++ -- , -> () [] new new[] delete delete[] 不可重载 的运算符 sizeof :? . .* ->* :: # 重载不能改变运算符的 优先级 和 结合性 重载运算符不会改变 用法 运算符重载函数不能有 默认参数 运算符重载函数既可以作为类的 成员函数 ,也可以作为 全局函数 一般情况下,单目运算符最好重载为类的 成员函数 ,双目运算符最好重载为友员函数** 类型转换函数 只能定义为一个类的成员函数而不能定义为类的友员函数 若一个运算符的操作需要 修改对象的状态 ,选择重载为成员函数比较好 若运算符所需操作数(尤其是第一个操作数)希望有 隐式类型转换

c++成员运算符重载和友元运算符重载的比较(以++,--运算符为例)

て烟熏妆下的殇ゞ 提交于 2019-11-28 20:41:14
1、对双目运算符而言,成员运算符重载函数参数列表中含有一个参数,而友元运算符重载函数参数列表含有两个参数;对单目运算符而言,成员运算符重载函数参数列表中没有参数,而友元运算符重载函数参数列表含有一个参数。 2、双目运算符一班可以被重载为友元运算符和成员函数运算符,但是当一个整数与一个复数相加时,必须使用友元函数。 例:友元运算符重载函数实现一个复数与一个整数相加 #include<iostream> using namespace std; class complex { public: complex(int r=0,int i=0); friend complex operator+(complex com,int a)//定义友元运算符重载函数,+左侧是类对象,右侧是函数 { return complex(com.real+a,com.imag); } friend complex operator+(int a,complex com)//定义友元运算符重载函数,+左侧是函数,右侧是类对象 { return complex(a+com.real,com.imag); } void show(); private: int real,imag; }; void complex::show() { cout<<"real="<<real<<" imag="<<imag<

挑战10个最难的Java面试题(附答案)【上】

怎甘沉沦 提交于 2019-11-28 14:32:55
这是收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。 1 为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。Java编程的常识和深入了解有助于回答这种棘手的 Java 核心方面的面试问题。 为什么 wait,notify 和 notifyAll 是在 Object 类中定义的而不是在 Thread 类中定义 这是有名的 Java 面试问题,招2~4年经验的到高级 Java 开发人员面试都可能碰到。这个问题的好在它能反映了面试者对等待通知机制的了解, 以及他对此主题的理解是否明确。就像为什么 Java 中不支持多继承或者为什么 String 在 Java 中是 final 的问题一样,这个问题也可能有多个答案。 为什么在 Object 类中定义 wait 和 notify 方法,每个人都能说出一些理由。从我的面试经验来看, wait 和 nofity 仍然是大多数Java 程序员最困惑的,特别是2到3年的开发人员

C#运算符重载

╄→尐↘猪︶ㄣ 提交于 2019-11-28 13:45:58
闲来无事,突发奇想,C#提供的基本类型可以进行运算符操作,那么自己创建的类型应该也可以进行运算符操作吧? 既然有了想法就要尝试着去实现,打开 《CSharp Language Specification》 ,寻找方案。 扩展一下 在这里说明一下《CSharp Language Specification》这个手册,真心不错。 C#语言规范(CSharp Language Specification doc) 一个微软官方的说明文档。 当你安装完Visual Studio的以后,默认安装目录下就会有这个东西,一般在 C:\Program Files\Microsoft Visual Studio 10.0\VC#\Specifications\2052 下 知识点总结 所有一元和二元运算符都具有可自动用于任何表达式的预定义实现。除了预定义实现外,还可通过在类或结构中包括 operator 声明来引入用户定义的实现。 可重载的一元运算符 (overloadable unary operator) 有: + - ! ~ ++ -- true false 可重载的二元运算符 (overloadable binary operator) 有: + - * / % & | ^ << >> == != > < >= <= 小案例 有了相应的知识就练练手做一个案例吧,这里我做了一个 学生+学生

C++——运算符重载(1)

*爱你&永不变心* 提交于 2019-11-28 07:53:45
运算符重载编程基础 例如: //全局函数 完成 +操作符 重载 Complex operator+(Complex &c1, Complex &c2) //类成员函数 完成 -操作符 重载 Complex operator-(Complex &c2) #include <iostream> using namespace std; class Complex { public: int a; int b; public: Complex(int a=0, int b=0) { this->a = a; this->b = b; } void printCom() { cout<<a<<" + " << b << "i" <<endl; } }; //2 函数名 升级 Complex operator+(Complex &c1, Complex &c2) { cout<<"12345上山 打老虎"<<endl; Complex tmp(c1.a + c2.a, c1.b+ c2.b); return tmp; // } void main() { int a = 0, b = 0; int c; c = a + b; //1 基础数据类型 编译器已经知道了. 如何运算 // a + bi 复数运算规则 Complex c1(1, 2), c2(3, 4); Complex c3; /

C++基础学习5

有些话、适合烂在心里 提交于 2019-11-28 07:12:18
9类和对象进一步 9.1构造函数 如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。 但是,如果数据成员是私有的,或者类中有private或protected的成员, 就不能用这种方法初始化。 class Time {public : //声明为公用成员 hour; minute; sec; }; Time t1={14,56,30}; //将t1初始化为14:56:30 构造函数的作用 构造函数的名字必须与类名同名,构造函数没有返回值,因此也不需要在定义构造函数时声明类型, 以便编译系统能识别它并把它作为构造函数处理。 在类内定义构造函数,也可以只在类内对构造函数进行声明而在类外定义构造函数。 构造函数不需用户调用,也不能被用户调用。 带参数的构造函数 构造函数首部的一般格式为构造函数名(类型 1 形参1,类型2 形参2, …) 定义对象的一般格式为 类名 对象名(实参1,实参2, …); #include <iostream> using namespace std; class Box {public : Box(int,int,int);//形参由定义对象时给出 int volume( ); private : int height; int width; int length; }; //声明带参数的构造函数//声明计算体积的函数 Box::Box

C++运算符重载

吃可爱长大的小学妹 提交于 2019-11-28 05:11:02
转载自:https://www.cnblogs.com/liangxiaofeng/p/4311796.html 1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的, 运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }  2.运算符重载时要遵循以下规则: (1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。 (2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。 (3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。 (4)

运算符重载

◇◆丶佛笑我妖孽 提交于 2019-11-27 20:28:00
在c++中运算符重载通过两种方式:1.友元函数的方式 2.成员函数的方式 五种运算符不可以重载 点运算符. 域名解析符:: 点星运算符.* 三目运算符:? 求大小运算符sizeof 不能使用成员重载的运算符>> << 不能通过友元的方式重载的运算符 赋值运算符= 括号运算符()下标运算符 [] 箭头运算符-> 双目运算符推荐使用友元 单目运算符 推荐使用成员 友元函数是单项传递的 A是B的友元类 在B中不申明 ,B不是A的友元类 A是B的友元类 B是C的友元类 A不一定是C的友元类 需要在C中申明 友元方法和成员方法的区别是 友元方法不能使用this调用成员变量而成员方法可以调用this 1 #pragma once 2 #include<iostream> 3 using namespace std; 4 class A 5 { 6 int data; 7 static int x; 8 int arr[10]; 9 public: 10 A(int data = 0);//构造函数,可缺省 11 A(const A&other);//调用拷贝构造 12 ~A(); 13 int getData(); 14 void setData(int data); 15 friend int addA(const A&a, const A&b);//在申明的时候使用友元在类外定义 16

C++运算符重载

十年热恋 提交于 2019-11-27 15:48:22
一、操作符函数重载 什么是操作符函数:在C++中针对类类型的对象的运算符,由于它们肯定不支持真正的运算操作,因此编译器会将它们翻译成函数,这种就叫作操作符函数(运算符函数)。 编译器把运算符翻译成运算符函数,可以针对自定义的类类型设计它独有的运算功能。 其实各种运算符已经具备某些功能,再次实现它的就是叫做运算符重载 双目运算符: a+b 成员函数 a.operator+(b); 全局函数 operator+(a,b); 单目运算符: !a 成员函数 a.operator!(void); 全局函数 operator!(a); 二、双目运算符函数重载 成员函数: const 类 operator#(const 类& that) const { return 类(参数#参数); } 注意:双目运算符的运算结果是个右值,返回值应该加 const,然后为了 const 对象能够调用,参数应该写 const ,函数也应该具备 const 属性。 全局函数: const 类 operator#(const 类& a,const 类& b) { } 注意:全局函数不是成员函数,可能会访问到类的私有成员,解决这种问题可以把函数声明为类的友元函数(友元不是成员) 友元:在类的外部想访问类的私有成员时,需要把所在的函数声明为友元,但友元只是朋友,没有实际的拥有权,因此它只有访问权,没有实际的拥有权