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.rhkb.cn/news/130769.html

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

相关文章

sql 时间函数

1&#xff0c;前提 今天看同事写的sql里面出现了时间类的函数&#xff0c;平时自己也经常用到&#xff0c;每次都要百度&#xff0c;还不如自己整理记录在一起&#xff0c;方便后续使用。 2&#xff0c;sql时间函数 2.1 获取当前时间&#xff1a; selectNOW() as 当前日期时…

docker 部署 node.js(express) 服务

1、在 express 项目根目录下新增 Dockerfile 文件&#xff0c;内容如下&#xff1a; 创建服务容器的方法&#xff0c;可以根据自己的情况选择&#xff1a; 1、以下示例为宿主机没有安装 node 环境的写法&#xff1b; 2、先在本地构建包含 node 和 express 的基础镜像&#xff0…

JavaScript中的事件捕获(event capturing)和事件冒泡(event bubbling)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件捕获和事件冒泡⭐ 事件捕获&#xff08;Event Capturing&#xff09;示例&#xff1a; ⭐ 事件冒泡&#xff08;Event Bubbling&#xff09;示例&#xff1a; ⭐ 应用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开…

计算机组成与设计硬件软件接口学习1

计算机的算术运算 子字并行 &#xff08;大致浏览&#xff09;pdf 170页左右 浮点加法不满足结合律&#xff1a; 适用于整型数据类型的并行执行策略并不适用于浮点数据类型 &#xff0c;原因如上↑ 处理器 流水线 流水线是一种能使多条指令重叠执行的实现技术 流水线技术通…

【C++】类和对象核心总结

类和对象核心知识目录&#xff1a; 一、面向过程和面向对象初步认识 二、类的引入定义&#xff08;struct > class&#xff09; 2.1自定义类型 struct 和 class 的区别 2.2类放在内存中的什么存储区&#xff1f; 2.3类中函数定义的方式 2.3.1声明和定义分离&#xff0…

C++项目:在线五子棋对战(网页版)

文章目录 一、项目介绍&#xff08;一&#xff09;用户管理&#xff08;二&#xff09;匹配对战&#xff08;三&#xff09;聊天功能 二、开发环境三、核心技术四、项目大流程 一、项目介绍 本项目主要实现⼀个网页版的五⼦棋对战游戏&#xff0c;其主要支持以下核心功能&…

【Redis】Bitmap 使用及应用场景

前言&#xff1a;bitmap 占用空间小&#xff0c;查询效率高&#xff0c;在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值&#xff0c;可以设为 1 或 0 例如 SETBIT key 10 1&#xff0c;将在 key 对应的 bitmap 中第10位设置为…

Springboot后端跨域处理

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

Docker认识即安装

Docker及相关概念 Docker和虚拟机方式的区别&#xff1a;虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整的操作系统&#xff0c;在该系统上在运行所需应用进程&#xff1b;而容器内的应用进程是直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0…

GO语言网络编程(并发编程)Channel

GO语言网络编程&#xff08;并发编程&#xff09;Channel 1、Channel 1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中容易发生竞态…

java并发编程 CyclicBarrier详解

文章目录 1. CyclicBarrier是什么2 核心属性详解3 核心方法详解3.1 await()3.1 breakBarrier() 4 总结 java 并发编程系列文章目录 1. CyclicBarrier是什么 在java的类注释上描述&#xff1a;一种同步辅助工具&#xff0c;允许一组线程都等待对方到达一个共同的障碍点。Cycli…

python开发之个微机器人的二次开发

简要描述&#xff1a; 添加标签 请求URL&#xff1a; http://域名地址/addContactLabel 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

快解析内网穿透如何帮你轻松实现外网远程连接?

外网相信大家多少了解一点&#xff0c;其实就是连接不同地区局域网&#xff0c;或者是城域网计算机通信的远程网&#xff0c;因此被称为广域网或者公网。在这个互联网信息时代&#xff0c;很多用户还是不知道怎么连接外网&#xff1f;外网远程桌面连接的步骤是怎样的&#xff1…

普罗米修斯(Prometheus)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、普罗米修斯&#xff08;Prometheus&#xff09;是什么&#xff1f;1.下载Prometheus工具&#xff08;切记和操作系统版本对应&#xff09;2.解压命令3.修改prom…

Prometheus+Grafana 搭建应用监控系统

一、背景 完善的监控系统可以提高应用的可用性和可靠性&#xff0c;在提供更优质服务的前提下&#xff0c;降低运维的投入和工作量&#xff0c;为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统&#xff0c;使用Prometheus Grafana搭建完整的应用监控系统。 …

WebGL 同时使用多幅纹理

目录 前言 ​编辑 示例代码 颜色矢量的分量乘法来计算两个纹素最终的片元颜色 注册事件响应函数&#xff1a;loadTexture&#xff08;&#xff09;&#xff0c;最后一个参数是纹理单元编号。 请求浏览器加载图像&#xff1a; 配置纹理&#xff1a;loadTexture&#xff0…

MyBatis中至关重要的关系映射----全方面介绍

目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType&#xff1a; resultMap&#xff1a; 二&#xff0c;一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三&#xff0c;一对多关联查询 3.1 嵌套结果集编写 3.3 案例演示 四&…

SpringBoot + Prometheus + Grafana 打造可视化监控

SpringBoot Prometheus Grafana 打造可视化监控 文章目录 SpringBoot Prometheus Grafana 打造可视化监控常见的监控组件搭配安装Prometheus安装Grafana搭建SpringBoot项目引入依赖示例:监控SpringBoot内置Tomcat线程池的情况grafana创建监控看板 后台SpringBoot服务添加自…

【IBMMQ】搭建测试队列

一、安装IBMMQ 网上有教程&#xff0c;可以学习 我用的IBMMQ7.5&#xff0c;安装教程 二、创建测试队列 进入工作台&#xff1a; 右击队列管理器&#xff0c;新建队列管理器 写队列管理器名称 点击下一步 点击下一步 点击下一步 端口默认为1414&#xff0c;建议换一个 注…

多线程快速入门

线程与进程区别 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合&#xff0c;或者是程序的特殊段&#xff0c;它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程&#xff0c;它负责在单个程序里…