day55:C++ day5,运算符重载剩余部分、静态成员、继承

news2024/11/23 12:46:57

#include <iostream>
#include <cstring>
#define pi 3.14
using namespace std;

class Shape
{
protected:
    double round;
    double area;
public:
    //无参构造
    Shape():round(40),area(100){cout<<"Shape::无参构造函数,默认周长为40,面积为100"<<endl;}
    //有参构造
    Shape(double a,double b):round(a),area(b){cout<<"Shape::有参构造函数"<<endl;}
    //析构函数
    ~Shape(){cout<<"Shape::析构函数"<<endl;}
    //拷贝构造
    Shape(const Shape &other)
    {
        this->round=other.round;
        this->area=other.area;
        cout<<"Shape::拷贝构造函数"<<endl;
    }
    //拷贝赋值
    Shape &operator=(const Shape &other)
    {
        if(this!=&other)
        {
            this->round=other.round;
            this->area=other.area;
        }
        cout<<"Shape::拷贝赋值函数"<<endl;
        return *this;
    }
    //移动构造
    Shape(Shape &&other)
    {
        this->round=other.round;
        this->area=other.area;
        cout<<"Shape::移动构造函数"<<endl;
    }
    //移动赋值
    Shape &operator=(Shape &&other)
    {
        memcpy(this,&other,sizeof(Shape));
        cout<<"Shape::拷贝赋值函数"<<endl;
        return *this;
    }
};

class Circle:public Shape
{
private:
    double radius;
public:
    //无参构造
    Circle():Shape(2*pi*5,pi*5*5),radius(5){cout<<"Circle::无参构造函数,默认直径为5"<<endl;}
    //有参构造
    Circle(double c):Shape(2*pi*c,pi*c*c),radius(c){cout<<"Circle::有参构造函数"<<endl;}
    //析构函数
    ~Circle(){cout<<"Circle::析构函数"<<endl;}
    //拷贝构造函数
    Circle(const Circle &other)
    {
        this->round=other.round;
        this->area=other.area;
        cout<<"Circle::拷贝构造函数"<<endl;
    }
    //拷贝赋值函数
    Circle &operator=(const Circle &other)
    {
        if(this!=&other)
        {
            this->round=other.round;
            this->area=other.area;
        }
        cout<<"Circle::拷贝赋值函数"<<endl;
        return *this;
    }
    //移动构造
    Circle(Circle &&other)
    {
        memcpy(this,&other,sizeof(Circle));
        cout<<"Circle::移动构造函数"<<endl;
    }
    //移动赋值
    Circle &operator=(Circle &&other)
    {
        memcpy(this,&other,sizeof(Circle));
        cout<<"Circle::移动赋值函数"<<endl;
        return *this;
    }
    //获得周长函数
    double get_round()
    {
        return round;
    }
    //获得面积函数
    double get_area()
    {
        return area;
    }
};

class Rect:public Shape
{
private:
    double len;
    double width;
public:
    //无参构造
    Rect():Shape(2*5+2*10,5*10),len(5),width(10){cout<<"Rect::无参构造函数,默认长为5,宽为10"<<endl;}
    //有参构造
    Rect(double a,double b):Shape(2*a+2*b,a*b),len(a),width(b)
    {
        cout<<"Rect::有参构造函数"<<endl;
    }
    //析构函数
    ~Rect(){cout<<"Rect::析构函数"<<endl;}
    //拷贝构造函数
    Rect(const Rect &other)
    {
        this->round=other.round;
        this->area=other.area;
        cout<<"Rect::拷贝构造函数"<<endl;
    }
    //拷贝赋值函数
    Rect &operator=(const Rect &other)
    {
        if(this!=&other)
        {
            this->round=other.round;
            this->area=other.area;
        }
        cout<<"Rect::拷贝赋值函数"<<endl;
        return *this;
    }
    Rect(Rect &&other)
    {
        memcpy(this,&other,sizeof(Rect));
        cout<<"Circle::移动构造函数"<<endl;
    }
    //移动赋值
    Rect &operator=(Rect &&other)
    {
        memcpy(this,&other,sizeof(Rect));
        cout<<"Circle::移动赋值函数"<<endl;
        return *this;
    }
    //获得周长函数
    double get_round()
    {
        return round;
    }
    //获得面积函数
    double get_area()
    {
        return area;
    }
};

int main()
{
    Circle a;
    cout<<"获得a面积为"<<a.get_area()<<endl;
    cout<<"获得a周长为"<<a.get_round()<<endl;
    Rect b;
    cout<<"获得b面积为"<<b.get_area()<<endl;
    cout<<"获得b周长为"<<b.get_round()<<endl;
    Circle c(3);
    cout<<"获得c面积为"<<c.get_area()<<endl;
    cout<<"获得c周长为"<<c.get_round()<<endl;
    c=a;
    cout<<"获得c面积为"<<c.get_area()<<endl;
    cout<<"获得c周长为"<<c.get_round()<<endl;
    Rect d=b;
    cout<<"获得d面积为"<<d.get_area()<<endl;
    cout<<"获得d周长为"<<d.get_round()<<endl;
    Rect e=move(d);
    cout<<"获得e面积为"<<e.get_area()<<endl;
    cout<<"获得e周长为"<<e.get_round()<<endl;
    return 0;
}

运行结果:

9.12面试题

1、面向对象的三大特征

三大特征分别为封装、继承、多态(为讲,后面补充)

封装就是把一个事物对象的一些行为和属性都封装起来,而封装具有public、protected、private三种权限,可以起到对属性和一些函数的保护;

继承,就是在一个类的基础上去定义另一个新类的过程叫做继承,继承的方式有三种,分别是public、protected、private,而这三种方式会改变父类的权限,也可以用using改变权限,继承的本质其实相当于在子类的最前面构造了一个父类,从而达到全盘吸收,在此基础上子类也可以拓展新成员。

2、谈谈C++中的友元

友元就是给对面开权限,允许对面来访问自己类的所有权限成员,包括私有成员。

友元分为友元函数和友元类,普通的类的非成员函数是无法访问受保护成员和私有成员的,但是设置成友元后都可以访问,友元可以将友元函数和其他类成员设置为友元。

友元是单向的,A将B设置为友元表示A向B给权限,而A不一定有权限访问B;

友元不具有传递性,A是B的友元,B是C的友元,但A不一定是C的友元;

友元不具有继承性,父类是友元,子类不一定是友元;

友元破坏了封装性,因为其破坏了权限对访问的限制,因此尽可能少使用友元;

在提取和插入运算符重载时,需要使用全局函数作为友元函数;

3、什么是命名空间,为什么要使用命名空间?

命名空间是为一个内部区域标识符的集合,命名空间不仅可以解决多人协同开发时名字污染问题,还可以给不同的名字加上一个姓氏,这样可以明确的找到某个功能或者函数;嵌套定义的命名空间需要一级一级挨个往下使用,而重名且作用域相同的命名空间可以合并,因此他们之间不能有重名。

4、C++中的类提供的特殊成员函数有哪些?

特殊成员函数有无参构造、析构函数、拷贝构造、拷贝赋值、移动构造、移动赋值。

无参构造是系统自动分配的,构造类都可以在括号后面跟上初始化列表,当显性定义了有参构造后,系统提供的无参构造就不见了;拷贝构造和拷贝赋值也是系统有提供的,但是这种拷贝是浅拷贝,只是对成员变量进行简单的赋值,如果类中没有指针类型是没问题的,但当类中有指针类型且指向堆区空间,浅拷贝只会将指针的指向简单赋值,因此两个指针指向同一块堆区空间,使用时会造成竞态问题,释放时会出现多次释放的段错误;移动构造和移动赋值是对拷贝构造和拷贝赋值的补充,所引用的是右值,不需要定义出类对象就可以对类对象进行赋值和构造;析构函数系统也会提供,在系统提供的析构函数只会对类空间进行释放,因此如果类成员中有指向堆区空间的时候,需要显性定义析构函数,来完成对堆区空间的释放,防止内存泄漏。

5、C++的静态成员函数和静态成员变量?

首先,静态成员创造出来是为了让其脱离类对象本身,在静态区分配空间;多个类对象对应一个静态成员,对应一块空间,相当于是类对象中的全局变量,但更能体现类的封装性;改变静态成员,其他类对象中的静态成员也会改变;在定义成员变量前加上static就可以编程静态成员变量;静态成员变量需要在类内声明,类外定义,不初始化默认为0;

静态成员函数是在函数前加static,相当于定义了一个全局函数,只有对该类和类对象进行调用;可以通过类对象调用成员运算符或者类名直接调用;在静态成员函数中没有this指针;不依赖于类对象,也可以不实例化对象,直接使用类名进行调用;在静态成员函数中只能使用静态成员变量。

6、C++中的深浅拷贝问题?

首先,深浅拷贝问题是在拷贝构造和拷贝赋值这两个特殊成员函数中出现的,当使用系统给的拷贝构造和拷贝赋值时,只是对类成员的简单赋值,即浅拷贝;如果类中没有指针类型时,浅拷贝是没有问题的,但如果有,则会导致两个指针指向同一块空间;所以需要深拷贝,拷贝的指针需要重新在堆区申请一块空间,然后再把空间中的内容进行赋值。

思维导图:day4补充:有道云笔记 day5:有道云笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

渐变线条拖尾特效-原理及pygame实现

文章目录 效果预览视频教程代码内容介绍总结更多宝藏 效果预览 &#x1f60e;&#x1f973;&#x1f60e;&#x1f920;&#x1f916;&#x1f648;&#x1f4ad;&#x1f373;&#x1f371; 视频教程 https://www.bilibili.com/video/BV1vu411A7zy/ 代码 import pygame# 初…

基于HOG特征提取和GRNN神经网络的人脸表情识别算法matlab仿真,测试使用JAFFE表情数据库

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1.HOG特征提取 2.GRNN神经网络 3.JAFFE表情数据库 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .....................................…

解决MySQL数据库拒绝远程计算机连接问题

错误信息&#xff1a;Host is not allowed to connect to this mysql server 以前MySQL数据库部署在云服务器上&#xff0c;程序服务端也部署在云服务器上&#xff0c;连接服务器从没出现过问题。最近有一次需要做一个完全局域网的环境部署&#xff0c;我把数据库和程序服务端…

python爬虫教程:用scrapy实现模拟登录

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 背景&#xff1a; 初来乍到的pythoner&#xff0c;刚开始的时候觉得所有的网站无非就是分析HTML、json数据&#xff0c;但是忽略了很多的一个问题&#xf…

Python第一次作业练习

题目分析&#xff1a; """ 参考学校的相关规定。 对于四分制&#xff0c;百分制中的90分及以上可视为绩点中的4分&#xff0c;80 分及以上为3分&#xff0c;70 分以上为2分&#xff0c;60 分以上为1分; 五分制中的5分为四分制中的4分&#xff0c;4分为3分&#…

Win10声音无法找到输出设备怎么办

近期有小伙伴反映在使Win10的过程中无法找到声音输出设备&#xff0c;从而导致电脑的声音无法正常的播放&#xff0c;这是怎么回事呢&#xff0c;遇到这种情况应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10声音无法找到输出设备的解决方法&#xff0c;大家可以…

yolov5+Repulsion损失函数,解决密集遮挡问题(附带代码可用)

文章目录 1.RepLoss 设计思想2.RepLoss 主要工作2.1 吸引项2.2 排斥项&#xff08;RepGT&#xff09;2.3 排斥项&#xff08;RepBox&#xff09;2.4 总结 3. yolov5Repulsion3.1 rep_loss.py3.2 loss.py3.3 hyp.scratch.yaml 4. 总结 1.RepLoss 设计思想 物体遮挡问题可以分为…

为何付费?免费数据可视化软件的崭露头角

当今&#xff0c;数据可视化在各个领域都扮演着重要的角色。不过&#xff0c;对于一些个人用户、小型企业或教育机构来说&#xff0c;购买昂贵的数据可视化软件可能并不切实际。好消息是&#xff0c;有一些完全免费的数据可视化工具可以帮助你创建令人印象深刻的可视化图表和图…

一百七十四、Hive——Hive动态分区表加载数据时需不需要指定分区名?

一、目的 在Hive的DWD层和DWS层建立动态分区表后&#xff0c;发现动态插入数据时可以指定分区名&#xff0c;也可以不指定分区名。因此&#xff0c;研究一下它们的区别以及使用场景&#xff0c;从而决定在项目的海豚调度HiveSQL的脚本里需不需要指定动态分区的分区名&#xff…

数字孪生相关政策梳理,重点对各行业版块的指导和引领

前言 数字孪生技术作为新型智慧城市建设的创新引领性技术&#xff0c;有利于打造孪生城市运行空间&#xff0c;强化城市大脑基础能力&#xff0c;实现全域时空数据融合。数字孪生技术在推动智慧城市建设方面的作用已越来越受到重视。2021年3月&#xff0c;《国家“十四五”规划…

Java binLog日志监听

监听指定的表去做一些处理逻辑&#xff0c;首先是要开启M有SQL的配置&#xff0c;然后再撸代码。 一、Windows下开启MySQL binLog日志 首先要开启MySQL的BinLog 管理 show variables like %log_bin%; 如果发现是OFF&#xff0c;打开mysql文件夹下面的my.ini&#xff0c;修改一…

Linux创建进程 及父子进程虚拟空间 多进程GDB调试

父子进程的资源是读时共享&#xff0c;写时拷贝&#xff0c;用到某一个资源&#xff0c;比如说改变变量的值的时候才去拷贝这个变量到一个独立的空间 父子进程的关系&#xff1a; 区别&#xff1a; 1.fork&#xff08;&#xff09;函数的返回值不同 父进程中&#xff1a;>…

c高级day5(9.12)宏和Makefile

1.宏定义 #include<stdio.h> #include<head.h> #define unit32_t unsigned int #define TYPE(a,b) a##b int main(int argc, const char *argv[]) {unit32_t i;TYPE(unit,32_t) j;return 0; } 2.宏函数与有参宏 #include<stdio.h> #include<head.h>…

软件设计师_备考笔记

考试介绍及考点分布情况 考试要求&#xff1a; &#xff08;1&#xff09;掌握数据表示、算术和逻辑运算&#xff1b; &#xff08;2&#xff09;掌握相关的应用数学、离散数学的基础知识&#xff1b; &#xff08;3&#xff09;掌握计算机体系结构以及各主要部件的性能和基…

【c++5道练习题】②

目录 一、验证回文串 二、字符串相加 三、杨辉三角 四、最小栈 五、栈的压入、弹出序列 一、验证回文串 思路&#xff1a; 1、注&#xff1a;for(auto ch : s) -》指将s中每一个字符赋值给ch&#xff0c;ch的改变并不会影响s 但写为for(auto& ch : s) -》指将ch是s中…

【部署】Nginx部署前后端JeecgBoot-Vue3

部署运维 前言前台部署配置服务器地址配置路由访问规则配置后端接口路由访问规则Linux 宝塔傻瓜式部署前台项目 Nginx 命令 前言 前面有提到使用 Window 的 IIS 管理器来部署打包后的前端项目&#xff0c;点击【原文】 跳转到前篇文章。感觉甲方爸爸的描述&#xff0c;似乎有些…

Smartbi吴华夫:后疫情时代,BI发展趋势的观察与应对

沿着旧地图找不到新大陆&#xff0c;“基于指标体系的可视化分析和增强分析”成为BI发展新阶段。Smartbi V11系列新品与时俱进&#xff0c;以指标为核心&#xff0c;同时融合BI应用&#xff0c;赋能管理者和业务&#xff0c;成为引领数字化运营的新航标&#xff01; ——思迈特…

Zabbix监控平台环境部署

Zabbix监控平台环境部署 1.Linux环境部署 hostnamectl set-hostname zabbix_server #修改主机名方便查看 hostnamectl set-hostname zabbix_agent ​ systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭SElinu…

微信怎么给自己发消息

前段时间看到一份数据调查&#xff0c;说是到目前为止&#xff0c;全球使用微信的用户已达到10亿多人次&#xff0c;天啊&#xff0c;多么强大的用户群体&#xff01; 这么多人喜欢使用微信&#xff0c;相信大家都知道&#xff0c;微信里面有一个特俗功能&#xff0c;可以自己…

逆向-attack之改写函数的返回地址

#include <stdio.h> #include <stdlib.h> #include <unistd.h> /* * 改写input()函数的返回地址&#xff0c;从而使得breakout()函数在没有直接调用的情况下获得执行 */ void breakout() { puts("Welcome. Have a shell..."); system(…