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

#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.mzph.cn/news/76997.shtml

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

相关文章

Python的命令行参数

Python的命令行参数&#xff0c;提供了很多有用的功能&#xff0c;可以方便调试和运行&#xff0c;通过man python就能查看&#xff0c;以下是一些常用参数使用实例和场景: 1. -B参数 在import时候&#xff0c;不产生pyc或者pyo文件: 比如有程序main.py如下: from Hello im…

软件测试/测试开发丨使用ChatGPT自动进行需求分析

简介 在实际工作过程中&#xff0c;常常需要拿到产品的PRD文档或者原型图进行需求分析&#xff0c;为产品的功能设计和优化提供建议。 而使用ChatGPT可以很好地帮助分析和整理用户需求。 实践演练 接下来&#xff0c;需要使用ChatGPT 辅助我们完成需求分析的任务 注意&…

数据链路层相关知识

数据链路层的作用 两个设备(同一种数据链路节点)之间进行传递数据 认识以太网 "以太网"是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容.例如:规定了网络拓扑结构,访问控制方式,传输速率等;以太网中的网线必须使用双绞线;传输速率有10M,100M,1…

Linux设备驱动——自动创建设备节点udev机制的实现过程

创建设备文件的机制有以下下列几种&#xff1a; mknod命令&#xff1a;手动创建设备节点的命令devfs:可以用于创建设备节点&#xff0c;创建设备节点的逻辑在内核空间&#xff08;内核2.4版本之前使用&#xff09;udev:自动创建设备节点的机制&#xff0c;创建设备节点的逻辑在…

python机器人编程——用python实现一个写字机器人

目录 一、前言二、整体框架2.1 系统构成2.2 硬件介绍2.2.1主要组成部分2.2.2机械结构2.2.3驱动及控制主板PS电机驱动原理简介: 2.2.4其余部分 2.3 机器人python程序框架2.3.1通信服务模块2.3.2消息处理模块2.3.3轨迹解析模块2.3.4机械臂逆解模块2.3.5写字板模块 三、机械臂的建…

0门槛限制!快来领取你的专属元宇宙虚拟展厅!

数字化时代中&#xff0c;元宇宙虚拟展厅仿佛成为了一种新的潮流&#xff0c;虚拟展厅的出现为我们呈现出了一个超越现实的全新世界。元宇宙虚拟展厅以其多样性、互动性、沉浸式展示为特点&#xff0c;同产品进行交互&#xff0c;创造出逼真的虚拟环境&#xff0c;为广大用户打…

八股——const 关键字

1.const作用 作用&#xff1a;const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值&#xff0c;这时候没有加const关键字&#xff0c;编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…

Springboot后端跨域处理

跨域 当一台服务器资源从另一台服务器&#xff08;不同的域名或者端口&#xff09;请求一个资源或者接口&#xff0c;就会发起一个跨域HTTP请求。 同源&#xff1a;协议、域名、端口都相同 只要一个不同&#xff0c;就是跨域。 例子 请求方响应方是否跨域原因http://www.ba…

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果&#xff1a; element-ui中的switch开关无loading属性&#xff08;在element-plus时加入了&#xff09;&#xff0c;而且点击时开关状态就会切换&#xff0c;这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路&#xff1a;switch开关外包一层div&#xff0c;给…

LeetCode518. 零钱兑换 II 以及 动态规划相关的排列组合问题

文章目录 一、题目二、题解方法一&#xff1a;完全背包问题的变体&#xff08;版本1&#xff09;方法二&#xff1a;完全背包问题变体&#xff08;版本2&#xff09; 三、拓展&#xff1a;先遍历物品后遍历背包vs先遍历背包后遍历物品先遍历物品后遍历背包&#xff08;组合问题…

NAT实验:构建复杂网络拓扑,实现互联网访问与FTP发布

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1.配置链路上各个接口的IP地址。2.在私网中配置单臂路由3.在R1和R3上配置默认路由指向公网。4.私网A通过NAPT使vlan 20和vlan 10能够使用R1的公网访问互联网。5.私网B通过在R3上配置EASY IP访问互联网。6.私网…

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…

labelme2voc 标签重叠/覆盖问题

使用labelme自带的 labelme2voc.py转换voc数据集时可能标签重叠

Maven Helper mvn项目冲突如何解决

一般用这款插件来查看maven的依赖树。 一、安装&#xff1a; File-->setting--->Plugins--->在搜索框中填写Maven Helper然后搜索&#xff0c;单击Install按钮进行安装&#xff0c;装完重启IDE。 二、使用 当Maven Helper 插件安装成功后&#xff0c;打开项目中的p…

AMD R7 7840HS 核显 780M 性能怎么样

目录 1. 基本数据 2.性能对比 2.1对比一 2.2 对比二 3.综合 1. 基本数据 2.性能对比 2.1对比一 锐龙77840h相当于i几 答&#xff1a;类似于I7-12700H R7 7840H介于13500-13700之间。 R7 7840H是AMD锐龙旗下高性能的一款处理器&#xff0c;主要应用在主流的游戏本中。各…

GO语言篇之发布开源软件包

GO语言篇之发布开源软件包 文章目录 GO语言篇之发布开源软件包新建仓库拉取到本地初始化项目编写代码提交代码发布引用软件包 我们写GO语言程序的时候难免会引用第三方的软件包&#xff0c;那么你知道别人是怎么发布自己的软件包吗&#xff0c;别急&#xff0c;这篇博客教你怎么…

数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

全文链接&#xff1a;http://tecdat.cn/?p30131 最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据&#xff08;查看文末了解数据免费获取方式&#xff09;间的相关分析和预测分析&#xff0c;主要内容包括其使用实例&…

Vue通过ref修改 <el-input-number> 增减按钮的样式

Vue 为一个 <el-input-number> 设置了ref为‘inputNumberRef’, 通过这个ref获取<el-input-number>组件中的增、减按钮所在的<i>标签&#xff0c;并将它们的class分别改为el-icon-plus 和 el-icon-minus。 可以通过以下代码实现&#xff1a; <template&g…

如何实现CSDN评论区粉丝幸运抽选功能:一场代码与运气的碰撞

文章目录 前言抽选规则实现思路代码实现1.获取评论数据2.过滤符合抽选规则的评论者3.获取粉丝数据4.过滤符合抽选规则的粉丝5.增加公众号留言权重6.抽选粉丝 完整的代码效果展示结语 前言 为了回馈粉丝们一直以来的的关注和支持&#xff0c;我近期开启了赠书活动&#xff0c;活…

【网络编程·数据链路层】MAC帧/以太网协议/ARP协议/RARP协议

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、MAC帧 1、IP地址和MAC地址的区别 2、MAC帧协议 3、MTU对IP协议的…