运算符重载

深入解析C++输入输出运算符重载

最后都变了- 提交于 2019-12-12 20:19:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 其实算不上什么深入解析,只不过最近看CArchive类的实现,其中一些写法完全颠覆了我对输入输出运算符重载的一些理解,所以在这里mark一下。 我们以输出运算符为例。首先输出运算符重载的一般形式是 friend ostream & operator<< ( ostream & o , const ClassName & c );[1] ostream是c++流输出的类,至于友元,只记得说输入输出运算符必须用友元重载,因为ostream是受保护的。今天看CArchive类实现的时候,里面有如下的定义 friend CArchive & AFXAPI operator >>( CArchive & ar , CObject *& pOb ); 于是才发觉ostream并不是必需的,换句话说,从语法上讲,ostream的位置放什么类都可以,只不过语义上要行得通。而友元的重载从语法上讲也不是必须的,比如可以依然用成员函数重载,函数定义变成如下的格式 ostream & operator >>( ostream & o ); 使用的时候只能用object>>cout(或者cout>>object这就太别扭了)形式了,并且不可能连续使用了(比如obj1>>obj2>>cout),这违背了C++规范,但是语法上是的过得去的。

C++类或结构作为map的key值

心已入冬 提交于 2019-12-12 20:19:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1.只有重载<的类或者结构才能作为map的key值。 string可以作为key值是因为string重载了< 2.如果不重载<会提示如下错误: error C2676: 二进制“<”: “const C”不定义该运算符或到预定义运算符可接收的类型的转换 3.重载<但是没有实现会提示如下错误: Expression: invalid operator< 比如bool operator < (const C &c) const{return true;} #include < string > #include <map> using namespace std; // 重载<的类或结构才能作为map的key值 class C { public : int i; string str; bool operator < ( const C &c) const { return i < c.i; } }; void main() { map<C, int > mapC; C c0; c0.i = 0 ; c0.str = " str1 " ; mapC.insert(pair<C, int >(c0, 0 )); C c1; c1.i = 1 ; c1.str = " str2 " ; mapC.insert(pair

C++ 运算符重载_加号

蹲街弑〆低调 提交于 2019-12-06 15:16:57
C++运算符重载 C++运算符重载是C++中一个非常重要的概念,很多初学者(包括我)在刚开始学习的时候非常害怕,甚至讨厌(也许是恶心)。但是,不得不说的是,它真的很重要,学会之后很方便(ZhuangBi)。 加号运算符重载 加号是一个典型的双目运算符(需要两个操作数),加号前一个,加号后一个。实现加号运算符重载有两种方式:1.类成员方法实现、2.全局方法实现 谈一下我对加号运算符重载的理解,因为如果不理解原理,就会觉的运算符重载语法有点(变态),如果 只想知道实现方法的请直接跳到代码部分 。 在没有使用运算符重载之前,我们实现两个自定义类型相加通常都是使用 类成员函数 实现的。比如下图这种: 其中 p1.addPerson(p2) 就等价于 p1 + p2 而加号的运算符重载也是一个函数,不过名字比较奇怪而已:operator+() 可以理解为,两个对象相加时等价于 p1.operator+(p2) 然后经过编译器优化后,可以简写为 p1 + p2。所以在成员方法实现运算符重载时仅仅需要传入一个参数(另外一个是隐藏的this指针)。 1. 类成员方法实现 1 #include <iostream> 2 using namespace std; 3 4 class Person { 5 public: 6 Person(); 7 Person(int val); 8 Person

运算符重载

落花浮王杯 提交于 2019-12-06 05:06:11
1. 双目运算符类成员函数重载 观察下列程序,掌握双目运算符的类成员函数重载方式。 #include<iostream> using namespace std; class complex { double real, imag; public: complex(double r = 0, double i = 0) { real = r; imag = i; } complex operator + (complex&); //运算符重载的成员函数原型 //运算符结果类型 operator @(参数表列); 其中,@表示运算符 void print(); }; /*运算符重载实现: 函数返回类型 类名::operator @(参数表列) { //代码 }*/ complex complex::operator+(complex& c) { //operator+ 是类complex的成员函数 complex sum; sum.real = real + c.real; sum.imag = imag + c.imag; return sum; } void complex::print() { cout << "real=" << real << endl; cout << "imag=" << imag << endl; } void main() { complex a(5

算术运算符的重载

北城以北 提交于 2019-12-05 15:03:05
运算符重载的示例:Vector结构 using System; namespace 运算符重载 { class Program { static void Main(string[] args) { // Console.WriteLine("Hello World!"); // Vector vec1,vec2,vec3; // vec1 = new Vector(3.0,3.0,1.0); // vec2 = new Vector(2.0,-4.0,-4.0); // vec3 = vec1 + vec2; // System.Console.WriteLine($"vec1 = {vec1}"); // System.Console.WriteLine($"vec2 = {vec2}"); // System.Console.WriteLine($"vec3 = {vec3}"); // double dou = 7; // Vector vec = new Vector(1.0,2.0,3.0); // Vector vec2 = dou * vec; // Vector vec3 = vec * dou; // System.Console.WriteLine($"{vec2}"); // System.Console.WriteLine($"{vec3}");

类和对象(中)C++

本小妞迷上赌 提交于 2019-12-05 01:14:02
类中哪些默认的事儿…… 1. 类的6个默认成员函数: 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。 class Date{}; 2. 构造函数: 构造函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。 构造函数的给出方式如下,参数可以给出缺省值,也可以重载构造函数。 class Date { public: Date(int year = 2000,int month=1,int day=1) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1; return 0; } 构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主 要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 1、 函数名与类名相同。 2、无返回值。 3、对象实例化时编译器自动调用对应的构造函数。 4、构造函数可以重载。 5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定

C++面向对象 运算符重载函数

谁说我不能喝 提交于 2019-12-04 03:58:26
第十二章 运算符重载 1. C++中可以称运算符为运算符函数。 2. 运算符函数可以作为某个类的成员函数,也可以作为普通的C++函数。(常作为类的友元函数) 3. 重载运算符时,至少要有一个操作数是用户自定义的类类型(如果都是基本数据类型还有基本数据类型的指针的话,定义已经存在) 4. 重载的运算符函数不能是类的静态成员函数。 5. 重载运算符时需要遵循的规则: (1) 尽可能用引用型的参数,尽可能加const限制(避免拷贝构造函数,保护实参操作数,同时使运算符具有与常量运算的功能) (2) 尽可能采用引用返回(避免构造临时对象,使运算表达式成为左值) (3) 如果第一个操作数可能不是本类的对象的时候,必须重载为友元函数。 例子:希望日期类对象Date d(2008,8,8);与整数int n=6;进行相加运算。运算表达式d+n与n+d执行的使不同的运算符函数。前者可以作为类的成员函数,d作为第一个操作数。而后者只能作为友元函数来定义,将整数n作为第一个操作数。 6. 重载算术运算符(加减乘除) 不修改操作数,一般将运算结果存放在其他对象或者变量里然后值返回。 例如: Date operator+(const Date &d, int n) //友元函数 { Date temp(d); int m=temp.DaysOfYear()+n; temp.setDate(d.year,m

C++对bool operator < (const p &a)const的运算符重载详解

让人想犯罪 __ 提交于 2019-12-03 06:22:53
struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <(const node &a)const {//重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }  运算符重载时要遵循以下规则: (1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符

实验7 运算符重载(P289-P292)

匿名 (未验证) 提交于 2019-12-03 00:32:02
实验目的和要求 实验内容 1.调试下列程序 [cpp] view plain copy print ? "font-family:SimSun;font-size:16px;" > //sy7_1.cpp #include<iostream> using namespace class public double double double const const const const friend void const private double inline const return inline const return inline const return inline const return void const if "i" else "+" <<c.imag<< "i" int return //sy7_1.cpp #include<iostream> using namespace std; class complex { public: complex(){real=imag=0.0;} complex(double r){real=r;imag=0.0;} complex(double r,double i){real=r;imag=i;} complex operator + (const complex &c); complex operator -

C#运算符重载

匿名 (未验证) 提交于 2019-12-02 22:09:29
闲来无事,突发奇想,C#提供的基本类型可以进行运算符操作,那么自己创建的类型应该也可以进行运算符操作吧? 既然有了想法就要尝试着去实现,打开 《CSharp Language Specification》 ,寻找方案。 扩展一下 在这里说明一下《CSharp Language Specification》这个手册,真心不错。 当你安装完Visual Studio的以后,默认安装目录下就会有这个东西,一般在 C:\Program Files\Microsoft Visual Studio 10.0\VC#\Specifications\2052 下 知识点总结 所有一元和二元运算符都具有可自动用于任何表达式的预定义实现。除了预定义实现外,还可通过在类或结构中包括 operator 声明来引入用户定义的实现。 可重载的一元运算符 (overloadable unary operator) 有: 可重载的二元运算符 (overloadable binary operator) 有: 有了相应的知识就练练手做一个案例吧,这里我做了一个 学生+学生 return 新的学生 的案例,xixi。 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //实例化一个男孩 6 Student boy = new Student() {