c++运算符、继承、多继承中构造函数和析构函数顺序、内部类和局部类

2023-11-02

一、自增自减运算符

单目运算符:正号(+) 负号(-) ++    --

开始代码:

#include <iostream>

using namespace std;
class point
{
private:
    int x;
    int y ;
public:
    int getX(){ return x;}
    void setX(int x) {  this->x = x;}

    int gety(){ return y;}
    void sety(int y) {  this->y = y;}
public:
    point(int x = 0 ,int y = 0);
    point operator=(const point& other);
    point operator+=(const point& other);
    int operator[](int x);
    void operator()(int a,int b);
// 前加加
   // point operator++();
   //后加加
  // point  operator++(int);
};
point::point(int x,int y)
:x(x),y(y)
{

}

全局函数实现方式(前++): student operator++(const stduent& other);

成员函数实现方式(前++):point point::operator++();

//前加加运算符
point operator++(point& other)
{

    other.setX(other.getX()+1);
    other.sety(other.gety()+1);
    return other;
}
//前++(成员函数)
point point::operator++()
{
    this->x++;
    this->y++;
    return *this;
}*

全局函数实现方式(后++): student operator++(const stduent& other,int);

成员函数实现方式(后++):point point::operator++(int );

   全局函数:

//后加加运算符
 point operator++(point& other,int)
 {
    point temp = other;
    other.setX(other.getX()+1);
    other.sety(other.gety()+1);
    return temp;
 }
//后加加实现(成员函数)
 point  point::operator++(int)
 {
        point temp = *this;
        this->x++;
        this->y++;
        return temp;
 }
 

注意:默认情况下,加加运算符是前加加,也就是++danny;

二、赋值运算符

格式1: void operator=(const person& other);

格式2: void operator+=(const person& ohter);

案例: 赋值运算符可以连续使用

   

//赋值运算符
point point::operator=(const point& other)
{
    this->x = other.x;
    this->y = other.y;
    return *this;
}

主函数的说明:

    point* px = new point(14,14);
    ++(*px);
    cout << "px->x"<< px->getX()<<endl;
    point ptemp = (*px)++; //拷贝构造
    point danny(1,2);
    ptemp = (*px);   //赋值运算符 x=y=z;
    cout << "px->x"<< ptemp.getX()<<endl;
    danny =  ptemp = (*px);
    cout << "danny.x" << danny.getX()<<endl;

注意:赋值运算符只可以是成员函数实现方式,不可以是全局函数和友元函数

      如果没有手动添加赋值运算符,编译器会自动添加缺省赋值运算符。

    

三、下标运算符

   格式: int  operator[](int x)

   案例:

       

//下标运算符  
 int point::operator[](int x)
 {
    if(x >= 2 || x < 0)   {        return y;    }
    else if( x == 1)    {        return y;    }
    else    {        return x;    }
 } 

       主函数调用:

    cout << "px->x"<< ptemp.getX()<<endl;
    danny =  ptemp = (*px);
    cout << "danny.x" << danny.getX()<<endl;
    cout << "danny[1]" << danny[1] <<endl;

   注意:只可以是成员函数实现

四.流运算符  

     定义:在使用cout或者cin的时候,会用到<< 和 >>运算符,这就是流运算符

     对象: cout是输出对象,已经定义好的,是ostream类型对象

            cin是输入对象,已经定义好的,是istream的类型对象

     格式1: ostream& operator<<(ostream& out,student& other);  输出流

     格式2: istream& operator>>(istream& in,point& other)     输入流

     注意: 只可以是全局函数实现流操作符,不可以是成员函数和友元函数

     案例:

       

ostream& operator<<(ostream& out,point& other)
{
    out << "x="<<other.getX()<<" y = "<<other.gety()<<endl;
    return out;
}
istream& operator>>(istream& in,point& other)
{
    int x=0;
    int y=0;
    in>>x>>y;
    other.setX(x);
    other.sety(y);
  
    return in;
}

       

五、小括号运算符

   定义:函数调用运算符重载,有时候希望对象有像函数一样的使用方式,

         也称之为仿函数,没有固定的写法,比较灵活;

格式: 返回值  operator()(参数){}

调用:  对象(参数);

案例:

    

//函数调用运算符   括号运算符
void point::operator()(int a,int b)
{
    cout << "a ="<<a << "b =" << b <<endl;
}   

调用:danny(1,2);  ----以这种方式进行调用    

六、继承

1.为什么要继承

   面向对象啊设计中非常重要的概念是继承,继承允许使用另外一个类来定义新类

   达到了代码重用的作用和提高执行效率

   提高了开发效率,不需要重新写父类有的成员函数和方法。

1)概念

  父类:也叫基类,例如动物类派生出基类,动物类是基类,

  子类:也叫派生类,例如动物类派生出鸡类,鸡类是子类;

  关系: 基类是已经有的类,派生类是继承了父类产生的新类

2)格式: class 子类: 继承控制 父类{  };

3)继承控制: public  private  protected三种,使用最多的是public     

 public继承:父类中的共有成员,子类继承后还是公有

             父类中的私有成员,子类继承后不可以使用;等价于没继承

             父类中的保护成员,子类继承后还是保护成员;

 private继承:将父类的属性在子类中修改成私有,父类私有子类无法访问;

 protected继承:将父类的属性在子类中修改成保护,父类私有子类无法访问;

4)子类无法继承

   A: 父类的构造函数,析构函数,拷贝构造没法继承

   B: 父类的友元函数和友元类没法继承

   C: 父类中的重载的运算符没法继承

5)继承的构造顺序

  A: 先构造父类,再构造子类,父类的构造在子类的构造函数初始化列表中调用;

  B: 先析构子类对象,再析构父类对象;

  C:所有的子类在初始化列表中都会调用父类的构造函数;

      如果子类构造没有主动添加父类构造,编译器自动调用父类的缺省构造函数;

   D: 子类复制了所有父类的成员变量和方法,父子类之间是不同的内存空间;

   E: 如果子类定义了父类的相同方法或变量,则隐藏了父类的方法和变量,优先使用子类

七、多继承

1.定义: 一个子类继承了多个父类,具有多个父类的方法和属性

2.格式:class 子类:public 父类1 , public 父类2{};      

3)多继承中构造函数和析构函数顺序

  构造顺序:父类是先继承先构造,后继承后构造,构造完父类后构造子类

  例如: class  pandan:public  cat,public bear

         上例子中:先构造cat,再构造bear ,然后构造pandan

  析构顺序:先析构子类,再调用后继承的类,再析构先继承的类

  例如: class  pandan:public  cat,public bear

          上例子:先析构pandan,再析构 bear 再析构cat (入栈和出栈的过程)

3.菱形继承(需要避免)

一个父类产生两个子类,然后两个子类继续产生孙子类,在孙子类中有多个爷爷变量

        (虚继承解决菱形继承的问题)

八、内部类和局部类

1.内部类:定义在类中的类;

         如果将类A定义在类B中,那么A是B的内部类(类嵌套)

2.特点

       内部类支持public private protected属性限制;

       内部类中的成员函数可以直接访问外部类的所有成员函数(反过来不行)

       内部类可以访问static的成员变量

       内部类不会影响外部类的内存;

       内部类可以在外部类中申明,在外部实现(申明和实现可以分开)

3.局部类:定义在函数内部的类;

  4.局部类的特点:

     作用域在函数内部,只可以在函数内部使用,在外部没法定义对象

     所有的成员必须定义在类的内部,不允许定义static变量

     局部类不可以访问函数中的局部变量;

5.匿名对象

      定义:没有变量名,没有被指针指向的对象,用完后立马调用析构释放;

            匿名对象使用不会和引用关联;

      Class Box{ public: Box(int x = 0){} }  ;   Box fun() {   return Box(1);  }

6.构造函数相互调用

      为什么用: 构造函数可以有参数,使得代码量大,可在构造中调用自己的其他构造;

                考虑长期问题,代码修改的内容比较小,一个构造修改,其他全部修改;

     实现方式:在子类的构造函数初始化列表中调用父类的构造函数;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++运算符、继承、多继承中构造函数和析构函数顺序、内部类和局部类 的相关文章

随机推荐

  • 运算放大器的选择---相关参数

    1 供电电压Vs 有单电源电压 双电源电压 双电源电压尽量两个电源都接 2 输入电压范围和输出电压范围 输入电压接近供电电压时 就称为输入电压轨到轨 如图8 LM358输入电压能达到负电源轨 不能达到正电源轨 输出电压非轨到轨 3 输入偏置
  • 的技术难点_推铅球技术教学的重点与难点

    一 推铅球的技术特点 推铅球技术的变革 无论从侧向到背向 还是从背向到旋转 不外乎有以下几个趋势 一是尽量加长铅球在手中运行的距离 使铅球预先获得较大的初速度 二是尽量加长最后用力的工作距离 三是能使更多的肌肉群参与推铅球的最后用力 并为这
  • Gradle 奇技淫巧

    http blog chengyunfeng com p 833 Gradle 奇技淫巧 作者 rain 分类 奇技淫巧 移动 发布时间 2015 12 31 19 42 6 0条评论 Gradle 现在已经是 Android 开发必备的建
  • Java内存泄漏的排查总结

    一 内存溢出和内存泄露 一种通俗的说法 1 内存溢出 你申请了10个字节的空间 但是你在这个空间写入11或以上字节的数据 出现溢出 2 内存泄漏 你用new申请了一块内存 后来很长时间都不再使用了 按理应该释放 但是因为一直被某个或某些实例
  • Syntax Error while loading YAML.   did not find expected '-' indicator

    运行剧本出错 ERROR Syntax Error while loading YAML did not find expected indicator The error appears to have been in etc ansib
  • C语言-哈希查找(HASH)-详解(完整代码)

    目录 原理 实例解释 存储逻辑图 需要的知识 附加 完整代码 代码详解 执行结果 1 查找个不存在的 2 查找个存在的 原理 用一个指针数组 来存储 每个链表的头节点 的首地址 如果要从 NUM 个数中查找数据 先对 NUM 0 75 求得
  • 【c++primer第五版】第十一章习题答案

    第十一章 关联容器 练习11 1 描述map和vector的不同 解 顺序容器中的元素是 顺序 存储的 对于vector 元素在其中按顺序存储 每个元素都有唯一对应 的位置编号 所有操作都是按编号进行的 例如 获取元素 头 尾 下标 插入删
  • 继承QDialog的类弹框不阻塞

    继承QDialog的类 如myDialog 在myDialog构造函数设置模态如下 this gt setWindowModality Qt ApplicationModal 使用如下 myDialog pMyDlg new myDialo
  • MariaDB(mysql的替代品)

    原文地址 http www csdn net article 2013 04 25 2815043 lookout oracle they tem up Oracle于09年收购了Sun 其中必不可少的原因就是获得MySQL这个最热门开源D
  • 【计算机网络系列】网络层⑩:路由选择协议——外部网关协议BGP

    外部网关协议BGP 协议BGP的主要特点 在外部网关协议 或边界网关协议 BGP中 现在使用的是第4个版本BGP 4 常简写为BGP 协议BGP对互联网非常重要 前面介绍的路由选择协议RIP和OSPF 都只能在一个自治系统AS内部工作 因此
  • leetcode刷题:三数之和

    题目 分析 这是最容易想到的做法 但是有明显的问题 时间复杂度达到0 n3 并且没有去重 class Solution public vector
  • 华为OD机试 - 模拟消息队列(Python)

    题目描述 让我们来模拟一个消息队列的运作 有一个发布者和若干消费者 发布者会在给定的时刻向消息队列发送消息 若此时消息队列有消费者订阅 这个消息会被发送到订阅的消费者中优先级最高 输入中消费者按优先级升序排列 的一个 若此时没有订阅的消费者
  • asp服务器 首选精图数码稳定,架设游戏服务端选什么云服务器

    架设游戏服务端选什么 DDOS是游戏 1 网络层攻击 YNFlood ACKFlood ICMPFlood UDPFlood NTPFlood SSDPFlood DNSFlood等 2 应用层攻击 CC攻击 3 HTTP的攻击等网络攻击
  • 如何要求用户的密码必须符合一定的复杂度

    如何要求用户的密码必须符合一定的复杂度 我们在使用 linux 系统 设置密码的时候 经常遇到这样的问题 系统提示 您的密码太简单 或者您的密码是字典的一部分 那么系统是如何实现对用户的密码的复杂度的检查的呢 系统对密码的控制是有两部分 我
  • 一种用QT实现即时通信软件表情发送与接收的思路

    一种用QT实现即时通信软件表情发送与接收的思路 最近需要使用QT为项目添加一个表情包发送与接受的功能 虽然之前知道表情发送与接收显示的一个基本原理 但是其中涉及到例如表情包插入到QTextEdit如何显示 如何保证从文本框发送出去的是表情编
  • Android Studio中创建java项目

    转自 https www cnblogs com jpfss p 9875402 html 1 创建普通的android工程 2 创建一个module 3 module类型选择java library 4 填写libary和class的名字
  • Sality病毒分析

    Sality病毒分析 基本信息 MD5 E100C2C3F93CABF695256362E7DE4443 样本来源 https www 52pojie cn thread 537381 1 1 html 样本报告 微步在线云沙箱 threa
  • 位运算符(一):C/C++位运算符

    位运算是指按二进制进行的运算 在程序中 常常需要处理二进制位的问题 C C 语言提供了6个位操作运算符 这些运算符只能用于整型操作数 即只能用于带符号或无符号的char short int与long类型 在实际应用中 建议用unsigned
  • C语言实现顺时针螺旋的顺序输出矩阵中元素

    给定一个 m 行 n 列的矩阵 请按照顺时针螺旋的顺序输出矩阵中所有的元素 从 0 0 位置开始 具体请参见下图 include
  • c++运算符、继承、多继承中构造函数和析构函数顺序、内部类和局部类

    一 自增自减运算符 单目运算符 正号 负号 开始代码 include