C++重载运算符继承多态(超详细)
(⼀)重载运算符:
(1)声明与定义格式 ⼀般是类内声明,类外定义,虽然可以在类内定义,但 写前⾯堆⼀堆不好看 类内声明:
类外定义:
(2)双⽬运算符重载为成员函数 当重载运算符为双⽬运算符时,形参表中只有⼀个参数作为右操作数。当前对象作为左操作数,通过this指针隐式传递给函数,⼀个例⼦来介绍。 实例: 写到最后突然想起来,⽤int不能实现浮点数的全部特性0.03就不能实现,所以仅作为⼀个例⼦。
现在只是重载了加减号,实现了⾃定义浮点数的运算,但是还不成熟,咱们⼀点⼀点来丰满这个代码,这个类。(3)单⽬运算符重载为成员函数 此时参数表中没有参数,只有当前对象作为运算符的⼀个操作数。 实例:class Demo
{
返回值类型 operator  运算符(形参表);
}
返回类型 Demo (类名)::operator 运算符(形参表)
{
函数体
}
class Myfloat {
int inter;
int deci;
public:
Myfloat(int a,int b):inter(a),deci(b){}
Myfloat operator+(Myfloat const &temp) const;
Myfloat operator-(Myfloat const &temp) const;
};
Myfloat Myfloat::operator+(Myfloat const &temp) const
{
return Myfloat(inter+temp.inter,deci+temp.deci);
}
Myfloat Myfloat::operator-(Myfloat const &temp) const
{
return Myfloat(inter-temp.inter,deci-temp.deci);
}
要区分前置与后置运算要加⼀个(需操作数)告诉机器是前置还是后置。
(3) 友元函数重载+重载输⼊输出流(⽤的稀烂⽤的多⽐较重要) 在左右操作数类型不同时上述重载⽅式都不能正常使⽤,这时候就需要两个操作数,在类外重载,因类外不能直接调⽤,所以要把该函数声明为类的友元。
#include <cmath>
using namespace std ;
class Myfloat
{
int  inter ;
int  deci ;
public :
Myfloat (int  a ,int  b ):inter (a ),deci (b ){}
Myfloat operator +(Myfloat const  &temp ) const ;
Myfloat operator -(Myfloat const  &temp ) const ;
Myfloat operator --();
Myfloat operator ++();
Myfloat operator --(int ); //补充⼀个虚操作数,表⽰前置操作
Myfloat operator ++(int );
};
Myfloat Myfloat ::operator +(Myfloat const  &temp ) const
{
return  Myfloat (inter +temp .inter ,deci +temp .deci );
}
Myfloat Myfloat ::operator -(Myfloat const  &temp ) const
{
return  Myfloat (inter -temp .inter ,deci -temp .deci );
}
Myfloat Myfloat ::operator --()  {return  Myfloat (inter --,deci );}
Myfloat Myfloat ::operator ++()  {return  Myfloat (inter ++,deci );}
Myfloat Myfloat ::operator --(int )  {return  Myfloat (--inter ,deci );}
(4)赋值运算符重载⽤于对象数据的复制 ⽤⾮类A类型的值为类A的对象赋值时(当然,这种情况下我们可以不提供相应的赋值运算符重载函数,⽽只提供相应的构造函数,如更有重载函数会优先调⽤重载后的赋值运算符)。 当⽤类A类型的值为类A的对象赋值,且类A的数据成员中含有指针的情况下,必须显式提供赋值运算符重载函数。
#include <cmath>
using namespace std ;
class Myfloat
{
int  inter ;
int  deci ;
public :
Myfloat (int  a ,int  b ):inter (a ),deci (b ){}
Myfloat operator +(Myfloat const  &temp ) const ;
Myfloat operator -(Myfloat const  &temp ) const ;
Myfloat operator --();
Myfloat operator ++();
Myfloat operator --(int ); //补充⼀个虚操作数,表⽰前置操作
Myfloat operator ++(int );
friend ostream & operator <<(ostream out ,Myfloat &w ) ;
friend istream &operator >>(istream in ,Myfloat &w );
};
Myfloat Myfloat ::operator +(Myfloat const  &temp ) const {return  Myfloat (inter +temp .inter ,deci +temp .deci );}
Myfloat Myfloat ::operator -(Myfloat const  &temp ) const {return  Myfloat (inter -temp .inter ,deci -temp .deci );}
Myfloat Myfloat ::operator --()  {return  Myfloat (inter --,deci );}
Myfloat Myfloat ::operator ++()  {return  Myfloat (inter ++,deci );}
Myfloat Myfloat ::operator --(int )  {return  Myfloat (--inter ,deci );}
Myfloat Myfloat ::operator ++(int )  {return  Myfloat (++inter ,deci );}
ostream & operator <<(ostream out ,Myfloat &w )
{
out <<w .inter <<'.'<<w .deci ;
}
istream &operator >>(istream in ,Myfloat &w )
{
in >>w .inter >>w .deci ;
构造函数可以被重载}
(⼆)基类与派⽣类(1)继承语法形式:
#include <cmath>
using namespace std ;
class Myfloat
{
int  inter ;
int  deci ;
public :
Myfloat (int  a ,int  b ):inter (a ),deci (b ){}
Myfloat operator +(Myfloat const  &temp ) const ;
Myfloat operator -(Myfloat const  &temp ) const ;
Myfloat operator --();
Myfloat operator ++();
Myfloat operator --(int ); //补充⼀个虚操作数,表⽰前置操作
Myfloat operator ++(int );
friend ostream & operator <<(ostream out ,Myfloat &w ) ;
friend istream &operator >>(istream in ,Myfloat &w );
Myfloat & operator =(const  Myfloat &temp ) ;//写或不写都可以,这种如果按照默认的⽅式⼀⼀对应复制,可以不写。
Myfloat & operator =(const  int  &w ) ;
};
Myfloat Myfloat ::operator +(Myfloat const  &temp ) const {return  Myfloat (inter +temp .inter ,deci +temp .deci );}
Myfloat Myfloat ::operator -(Myfloat const  &temp ) const {return  Myfloat (inter -temp .inter ,deci -temp .
deci );}
Myfloat Myfloat ::operator --()  {return  Myfloat (inter --,deci );}
Myfloat Myfloat ::operator ++()  {return  Myfloat (inter ++,deci );}
Myfloat Myfloat ::operator --(int )  {return  Myfloat (--inter ,deci );}
Myfloat Myfloat ::operator ++(int )  {return  Myfloat (++inter ,deci );}
ostream & operator <<(ostream out ,Myfloat &w )
{
out <<w .inter <<'.'<<w .deci ;
}
istream &operator >>(istream in ,Myfloat &w )
{
in >>w .inter >>w .deci ;
}
Myfloat & Myfloat ::operator =(const  Myfloat &temp )
{
inter =temp .inter ;
deci =temp .deci ;
return  *this ;
}
Myfloat & Myfloat ::operator =(const  int  &w )
{
inter =w ;
return  *this ;
}
基类类名表构成: 访问控制 基类名1 访问控制 基类名2…
继承多各类时叫做多继承,容易产⽣⼆义性,⼀般不⽤。
访问控制有三种
public:公有继承
private:私有继承
protected:保护继承实例
(2)派⽣类的⽣成过程
1. 吸收基类成员:除构造和析构函数外
2. 改造基类成员:通过在派⽣类中定义同名成员屏蔽基类成员在派⽣类中直接调⽤,仍可以基类指针调⽤同名成员
3. .添加新成员
(3)派⽣类特点
1. ⼦类拥有⽗类除了⽗类构造和析构函数,所有的成员函数和成员变量;
2. 2.⼦类就是⼀种特殊的⽗类;
3. ⼦类对象可以当做⽗类的对象使⽤;
4. ⼦类可以拥有⽗类没有的⽅法和属性。
(4)派⽣类中的静态数据成员 基类中定义的静态成员,将被所有派⽣类共享 2、基类初始化: (5)派⽣类的初始化派⽣类构造函数声明格式为:
派⽣类构造函数(变元表):基类(变元表)、对象成员1(变元表)
构造函数执⾏顺序:基类——对象成员(类对象成员的初始化)——派⽣类//⼀开始不理解,现在理解了举个栗⼦:
class  派⽣类名:基类名表{
数据成员和成员函数声明
};
class  People { }
class  Student :public  People

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。