运算符重载

第四讲:运算符重载

大兔子大兔子 提交于 2020-03-22 00:26:17
针对:ostream & operator <<(ostream & os, const ClassType &object) 说明几点: 1.第一个形参为对ostream对象的引用,在该对象上将产生输出, ostream为非const,因为写入到流会改变流的状态 ;该形参是一个引用,因为 不能复制ostream对象 (在c++中定义的标准输入输出流类istream和ostream,其中拷贝构造函数和赋值操作符函数都被放置在了 private 部分,且只有声明,没有定义)。 2.第二个形参一般应是对要输出的类类型的引用,该形参是一个引用 以避免复制实参,减少一次拷贝 ;它设为const,因为输出一般不会改变该对象,设为const就可以用来输出const对象和非const对象。 3.返回类型是一个ostream引用,它的值通常是输出操作符所操作的ostream对象,首先 因为ostream对象不能复制,所以必须是引用 ;其次引用可以少一次拷贝,提高效率;最后,为了体现连续性,实现连续输出,达到用多个输出操作符操作一个ostream对象的效果,如果不是引用,程序返回的时候就会生成新的临时对象,也就是说,连续的两个<<操作符实际上是针对不同对象的,这就好比cout<<a<<b;与cout<<a;cout<<b;的区别。 来源: https://www.cnblogs.com/wwk510

5.友元、运算符重载

限于喜欢 提交于 2020-03-20 12:37:11
1.友元函数  定义:在C++中,一个普通函数是不可以直接访问类中的任意成员的,但是如果把这个函数声明为友元函数,那么这个函数就可以访问类中的所有成员。     优点:能够不受限制地访问类中的任意成员,在一定程度上可以提高程序的执行效率。   缺点:打破类的封装性。   声明格式:friend 返回值数据类型 函数名(参数类别) 可以在类中的任意位置声明   (1)普通函数声明为友元函数 class Student{ friend void student_info(Student& student_info); public: Student(){} ~Student(){} protected: private: } //声明函数为友元函数 void student_info(Student& stu){}      (2)一个类的成员函数可以声明为另一个类的友元函数(一般不建议使用) class Cat;//引用形参,指针,引用 class Person{ public: Person(Cat& c):caty(c){} ~Person(){} void show(); private: Cat &caty; } class Cat { public: Cat(){} ~Cat(){} private: friend void show(); }   (3

C++运算符重载二:模拟实现string类

眉间皱痕 提交于 2020-03-12 10:59:31
模拟实现string类: 我们使用C语言的string时,有一些不方便的地方: 1.定义数组的时候大小必须固定。 2.字符串进行比较大小,连接的时候必须调用相应的字符串操作函数。 3.还必须考虑内存是否够用,操作起来比较麻烦。 而我们C++提供了string类型,操作起来比较简单,这些操作都可以通过string来使用: string str1 ; //默认构造 string str2 = "aaa" ; //string(const char*) string str3 = "bbb" ; string str4 = str2 + str3 ; string str5 = str2 + "ccc" ; string str6 = "ddd" + str2 ; cout << "str6:" << str6 << endl ; if ( str5 > str6 ) { cout << str5 << " > " << str6 << endl ; } else { cout << str5 << " < " << str6 << endl ; } int len = str6 . length ( ) ; for ( int i = 0 ; i < len ; ++ i ) { cout << str6 [ i ] << " " ; } cout << endl ; //string

C++运算符重载一:运算符重载、复数类CComplex、输出运算符重载

帅比萌擦擦* 提交于 2020-03-11 13:15:03
文章目录 一、运算符重载 二、复数类CComplex 三、输出运算符重载 一、运算符重载 运算符重载 : 使对象的运算运算表现得和编译器内置类型一样,使同一个运算符可以有不同的功能。即定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。 运算符重载实质上是函数的重载,重载运算符的函数一般格式如下 : 函数类型 operator 运算符名称(形参表) {对运算符的重载处理} operator是关键字,是专门用于定义重载运算符的函数的,运算符名就是C++已有的运算符。 运算符重载的规则: (1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 (2)C++允许重载的运算符 不能重载重载的运算符只有5个: ① .   成员访问运算符 ② *   成员指针访问运算符 ③ ::   域运算符 ④sizeof 长度运算符 ⑤ ?:   条件运算符 (3)重载不能改变运算符运算对象(即操作数)的个数 (4)重载不能改变运算符的优先级别 (5)重载不能改变运算符的结核性 (6)重载不能改变默认的参数 (7)重载的运算符必须和用户自定义类型的对象一起使用,其参数至少有一个是类对象(或类对象的引用) (8)用于类对象的运算符一般必须重载,但有两个例外,“=”和“&”不必用户重载 运算符重载的函数有两种处理方式: 1

C++运算符重载

删除回忆录丶 提交于 2020-03-09 00:16:30
关键字 operator 定义: 对已有的运算符进行重定义,赋予另一种功能 分为: 成员函数重载 和 全局函数重载 1.加法运算符重载 class person { friend void run ( ) ; //设置友元 private : int num ; ; public : person ( int num ) { this - > num = num ; } person & operator + ( person per ) { //加法运算符重载 this - > num + = per . num ; return * this ; } } ; void run ( ) { person p1 ( 10 ) ; person p2 ( 10 ) ; person p3 = p1 + p2 ; cout << p3 . num ; //20 } int main ( ) { run ( ) ; } 递增运算符重载 class Person { friend ostream & operator << ( ostream & cout , Person p ) ; //设置友元 private : int num ; public : Person ( ) { num = 0 ; } //前置递增运算符 Person & operator ++ ( ) { this

C++加载运算符代码学习

五迷三道 提交于 2020-03-07 19:16:52
4.5 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 4.5.1 加号运算符重载 作用:实现两个自定义数据类型相加的运算 class Person { public: Person() {}; Person(int a, int b) { this->m_A = a; this->m_B = b; } //成员函数实现 + 号运算符重载 Person operator+(const Person& p) { Person temp; temp.m_A = this->m_A + p.m_A; temp.m_B = this->m_B + p.m_B; return temp; } public: int m_A; int m_B; }; //全局函数实现 + 号运算符重载 //Person operator+(const Person& p1, const Person& p2) { // Person temp(0, 0); // temp.m_A = p1.m_A + p2.m_A; // temp.m_B = p1.m_B + p2.m_B; // return temp; //} //运算符重载 可以发生函数重载 Person operator+(const Person& p2, int val) { Person

python算术运算符重载、迭代器、call魔术方法和单例设计模式

风流意气都作罢 提交于 2020-03-07 03:41:42
1.算术运算符重载 我们知道在python中有字符串的相加、数字常量的相加,那么对于我们自定义的类实例化后的对象是否可以进行相加呢?答案是可以的。这里就要我们对于算术运算符进行重载。下面我们以__add__和__iadd__重载为例,讲解算术运算符的重载。 1.1.__add__ __add__是用来定义加法的魔术方法。 我们来看下面的例子, class Dog : def __init__ ( self , amount , name ) : self . amount = amount self . name = name def __add__ ( self , other ) : # 定义两个类相加的结果,other为其他类 return Dog ( self . amount + other . amount , self . name ) # 返回一个新类 d1 = Dog ( 23 , "Tom" ) d2 = Dog ( 21 , "Jerry" ) res = d1 + d2 # 等价于 d1.__add__(d2) 等价于 __add__(d1, d2) print ( res ) print ( res . amount ) print ( res . name ) print ( type ( res ) ) 执行结果如下, < __main__ . Dog

运算符重载

那年仲夏 提交于 2020-03-06 05:07:32
在计算机 程序设计 中, 运算符重载 (英语:operator overloading)是 多态 的一种。这里,运算符(比如+,=或==)被当作多态函数,他们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。 运算符重载通常只是一种 语法糖 。它可以简单地通过函数调用来模拟: a + b * c 在一个支持运算符重载的语言里,上面的写法要比下面的写法有效而简练: add(a, multiply(b, c)) (假设运算符* 的 优先级 高于运算符 +) 当一种语言允许运算符在某种情况下被隐式调用的时候,运算符重载将不只提供写法上的方便。例如, Ruby 中的 to_s 运算符就是如此,它返回一个对象的字符串表示。 用途[ 编辑 ] 运算符重载由于使程序员能够根据运算符类型的不同来决定运算符功能的不同而有多样用途。 C++ 中 << 的使用就是一个例子。表达式 a << 1 当a是整型变量时将返回a的两倍,但是当a是一个输出流时将向这个流中写入“1”。因为运算符重载允许程序员改变运算符通常的语义,慎重使用运算符重载通常被认为是一个好习惯。 简易实例[ 编辑 ] 以下是C++语言示例: #include <iostream> using namespace std; class point { public: int x, y; point() { x = y = 0; }

C++输入输出运算符重载

删除回忆录丶 提交于 2020-03-05 20:51:20
#include <iostream> using namespace std; class Point { public: Point() { m_x = 0; m_y = 0; }; Point(int x, int y) : m_x(x), m_y(y) {}; ~Point() {}; friend ostream& operator<<(ostream& output, Point &p); friend istream& operator>>(istream& input, Point &p); private: int m_x; int m_y; }; ostream& operator<<(ostream& output, Point &p) { output << "x = " << p.m_x << ", " << "y = " << p.m_y; return output; } istream& operator>>(istream& input, Point &p) { input >> p.m_x >> p.m_y; return input; } int main() { Point p1(1, 2); Point p2; cin >> p2; cout << "point1: " << p1 << endl; cout << "point2: " <

学习C/C++需要掌握哪些知识

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-28 08:16:04
初级阶段 1、C语言 数据类型、变量、内存布局、指针基础; 字符串、一维数组、二维数组; 一级指针,二级指针,三级指针,N级指针概念,指针数组和数组指针; 结构体、文件的使用; 动态库的封装和设计; 函数指针回调函数。 2、C++语言 面向对象编程思想; 类的封装,构造和析构、静态成员、对象管理; 类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;对象动态管理、友元函数、友元类、操作符重载; 3、C++编译器对象管理模型分析; 类对象的动态管理(new/delete); 友元函数和友元类; 运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载); 类的继承、多继承及其二义性、虚继承; 多态(概念、意义、原理剖析、多态案例); 虚函数、纯虚函数、抽象类(面向抽象类编程思想案例); 函数模板、类模板,模板的继承; C++类型转换; C++输入输出流(标准I/O 文件I/O 字符流I/O); C++异常处理(异常机制、异常类型、异常变量、异常层次结构、标准异常库); 4、STL模板库、泛型编程、容器啥的; 5、常见的IDE及开发工具使用:Visual Studio、CodeBlock、NotePad等; 进阶阶段还没想好.... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++