运算符重载

C++基础知识-DAY6

回眸只為那壹抹淺笑 提交于 2019-11-27 08:32:25
1. 友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,,依此提供类与外界间的通信接口。 但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,有时可以将这些函数定义为该类的友元函数,除了友元函数外,还有友元类,两者统称为友元。 友元的作用是提高了程序的运行效率(即减少了类型和安全性检查及调用的时间开销),但他破坏了类的封装性和隐 藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数,友元也可以是一个类,该类被称为友元类。 1. Get/set Get 方法和 set 方法,是常见的获取数据成员的方式,比如在游戏中,任务遭到攻击后血量的减少就要用到 set 方法,而实时的显示就需要 set 方法 由于 _lifeBlood 是私有的,为了访问他,我们必须要做的事情就是通过函数来访问他,这就意味着,在这个过程中需要不断的压栈与出栈,那么就面临一个问题,怎么样才能提高战斗的效率呢 如果 fight() 内部的函数可以写成如下 这样就可以省去很多压栈出栈的开销,节约成本,但是由于 _lifeBlood 是私有的,不可以这样访问,除此之外,由于真正在游戏中,参与 fight 的对象是不定的,可以是多个,所以说 fight 常被写成全局函数,这样就更不能直接访问私有变量了

C++多态性

自古美人都是妖i 提交于 2019-11-27 08:19:17
一、运算符重载 将双目运算符重载为成员函数: #include <iostream> using namespace std; class Complex { public: Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { } //运算符+重载成员函数 Complex operator + (const Complex &c2) const; //运算符-重载成员函数 Complex operator - (const Complex &c2) const; void display() const; //输出复数 private: double real; //复数实部 double imag; //复数虚部 }; Complex Complex::operator+(const Complex &c2) const{ //创建一个临时无名对象作为返回值 return Complex(real + c2.real, imag + c2.imag); } Complex Complex::operator-(const Complex &c2) const{ //创建一个临时无名对象作为返回值 return Complex(real - c2.real, imag - c2.imag); } void

C++运算符重载与类型转换

余生长醉 提交于 2019-11-27 01:35:35
1.基本概念 当运算符被用于类类型对象时,C++语言允许我们为其指定新的含义,同时,我们也可以自定义类类型之间的转换规则。 以下是运算符重载时需要注意的几个原则: 当运算符作用于内置类型对象时,我们无法改变该运算符的含义 我们只能重载已存在的运算符,不能发明新的运算符 重载的运算符的优先级和结合律与对应的内置运算符保持一致 以下运算符不能被重载: :: .* . ? : 应使用与内置类型一致的含义 关于选择重载运算符函数作为成员还是非成员函数: 赋值(=)、下标( [ ] )、调用( ( ) )和成员访问箭头( -> )必须是成员 复合赋值运算符(+=之类)一般来说应该是成员 改变对象状态的运算符或者与给定类型密切相关的运算符,入递增、递减和解引用运算符,通常应该是成员 具有对称性的运算符可能转换任意一端的运算对象,例如算术、相等性、关系和位运算符等,通常应是非成员函数 下面以String为例演示重载各个运算符的用法。 2.输入和输出运算符 //输入输出函数只能是非成员函数,故要在类内声明为友元函数 friend std::ostream &operator<<(std::ostream &os, const String &s); friend std::istream &operator>>(std::istream &is, String &s); /*输出函数较为简单

运算符重载概念及实现原理

ぃ、小莉子 提交于 2019-11-27 00:59:59
1、运算符重载简介 (1)为什么引入运算符重载机制? C++ 中的预定义的运算符: “+、-、*、/、%、^、&、~、!、|、=、<<>>、!=、…” 只能作用在基本数据类型上面,但是有些时候希望类类型之间也可以使用这些运算符进行运算(比如说:两个复数的运算),并且这种需求是合理的。基于这种需求,C++语言引入了 运算符重载 这一概念。 (2)C++运算符重载机制目的? 扩展C++中提供的运算符的适用范围,使之能作用于类类型数据上。 (3)对C++运算符重载机制的评价? 运算符重载机制增强了C++语言的功能,但是同时也增加了语言自身的复杂性。 2、运算符重载的概念 运算符重载 ,就是对已有的运算符(C++中预定义的运算符)赋予多 重的含义,使同一运算符作用于不同类型的数据时导致不同类型的 行为。 3、具体实现 (1)实现的实质 运算符重载的实质是编写以运算符作为名称的函数。这样的函数称之为运算符函数。 (2)运算符函数的类型: 运算符函数可以为全局函数。 运算符函数也可以为类的成员函数。 (3)运算符函数的特点: 把含运算符的表达式转换成对运算符函数的调用。 把运算符的操作数转换成运算符函数的参数。 运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。 (4)两种类型运算符重载的不同之处 对于全局类型的运算符函数, 重载为成员函数时,参数个数为运算符目数减一。

赋值运算符重载

拈花ヽ惹草 提交于 2019-11-27 00:35:22
赋值运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键字operator后面接需要重载的运算符符号。 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义 注:.* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。 函数原型:返回值类型 +operator+操作符+(参数列表) 例: // 全局的operator== class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } //private: int _year; int _month; int _day; }; // 这里会发现运算符重载成全局的就需要成员变量是共有的,那么问题来了,封装性如何保证? // 这里其实可以用我们后面学习的友元解决,或者干脆重载成成员函数。 bool operator==(const Date& d1, const Date& d2) { return d1._year == d2._year; && d1._month

运算符重载

本小妞迷上赌 提交于 2019-11-27 00:11:53
#include <iostream> #include <string> using namespace std; class String { public:   String(){p=NULL;}   String(char *str);   friend bool operator>(String &string1,String &string2);   friend bool operator<(String &string1,String &string2);   friend bool operator==(String &string1,String &string2);   void display(); private:   char *p; }; String::String(char *str) {   p=str; } void String::display() {   cout<<p; } bool operator>(String &string1,String &string2) {   if(strcmp(string1.p,string2.p)>0)     return true;   else   return false; } bool operator<(String &string1,String &string2) {   if

下标运算符重载

旧时模样 提交于 2019-11-26 20:22:48
重载该运算符用于增强操作C++数组的功能。 /*** subscript.cpp ***/ #include<iostream> using namespace std; const int SIZE = 10; class safearay { private: int arr[SIZE]; public: safearay() { register int i; for(i = 0; i < SIZE ;i++) { arr[i] = i; } } int& operator[](int i) { if(i > SIZE) { cout << "the index is too big" << endl; return arr[0]; } return arr[i]; } }; int main() { safearay A; cout << "A[2] = " << A[2] << endl; cout << "A[5] = " << A[5] << endl; cout << "A[12] = " << A[12] << endl; return 0; } 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190809$ g++ subscript.cpp -o subscript exbot@ubuntu:~/wangqinghe/C++

赋值运算符重载

99封情书 提交于 2019-11-26 20:22:43
重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。 /*** evaluate.cpp ***/ #include<iostream> using namespace std; class Distance { private: int feet; int inches; public: Distance() { feet = 0; inches = 0; } Distance(int f,int i) { feet = f; inches = i; } void displayDistance() { cout << "F: " << feet << " I: " << inches << endl; } Distance operator=(const Distance &D) { feet = D.feet; inches = D.inches; } }; int main() { Distance D1(11,10), D2(5,11); cout << "First Distance : "; D1.displayDistance(); cout << "Second Distance : "; D2.displayDistance(); D1 = D2; cout << "First Distance : "; D1.displayDistance();

自增自减运算符重载

孤人 提交于 2019-11-26 20:22:40
递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。 /*** addMyself.cpp ***/ #include<iostream> using namespace std; class Time { private: int hours; int minutes; public: Time() { hours = 0; minutes = 0; } Time(int h,int m) { hours = h; minutes = m; } void displayTime() { cout << "H: " << hours << " M" << minutes << endl; } //重载前缀递增运算符 Time operator++() { ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } return Time(hours,minutes); } //重载后缀递增运算符 Time operator++(int) { Time T(hours,minutes); ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } return T; } }; int main() { Time T1(11,59),T2(10,40); +

输入输出运算符重载

混江龙づ霸主 提交于 2019-11-26 20:22:35
C++能够使用流提取运算符>>和流插入运算符<< 来输入输出内置数据类型,也可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。 我们有时需要把运算符重载函数声明为类的友元函数,这样我们就能不用构造对象而直接调用函数。 /*** inputOver.cpp ***/ #include<iostream> using namespace std; class Distance { private: int feet; int inches; public: Distance() { feet = 0; inches = 0; } Distance(int f,int i) { feet = f; inches = i; } friend ostream &operator<<(ostream &output,const Distance &D) { output << "F: " << D.feet << " I: " << D.inches; return output; } friend istream &operator>>(istream &input,Distance &D) { input >> D.feet >> D.inches ; return input; } }; int main() { Distance D1(11,10),D2(5,11)