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

news2025/1/15 12:55:53

#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/1016589.html

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

相关文章

C语言入门Day_21 函数的使用

目录 前言&#xff1a; 1.变量作用域 2.代码执行顺序 3.易错点 4.思维导图 前言&#xff1a; 我们是先定义函数&#xff0c;再调用函数。完成了函数的定义以后&#xff0c;我们就可以开始调用函数了&#xff0c;让我们来回顾一下&#xff1a; 调用函数分为两部分&#…

1131. 绝对值表达式的最大值

1131. 绝对值表达式的最大值 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;求方向一次遍历两度统计 参考代码&#xff1a;求方向一次遍历两度统计 原题链接&#xff1a; 1131. 绝对值表达式的最大值 https://leetcode.cn/problems/maximum-of-absolute-val…

网络安全深入学习第二课——热门框架漏洞(RCE—Thinkphp5.0.23 代码执行)

文章目录 一、什么是框架&#xff1f;二、导致框架漏洞原因二、使用步骤三、ThinkPHP介绍四、Thinkphp框架特征五、Thinkphp5.0.23 远程代码执行1、漏洞影响范围2、漏洞成因 六、POC数据包Windows下的Linux下的 七、漏洞手工复现1、先Burp抓包&#xff0c;把抓到的请求包发送到…

【AI语言大模型】文心一言功能使用介绍

一、前言 文心一言是一个知识增强的大语言模型,基于飞桨深度学习平台和文心知识增强大模型,持续从海量数据和大规模知识中融合学习具备知识增强、检索增强和对话增强的技术特色。 最近收到百度旗下产品【文心一言】的产品,抱着试一试的心态体验了一下,整体感觉:还行! 二…

自动化测试API【软件测试】

自动化测试 selenium 1. 为什么使用selenium&#xff1f; 开源免费支持多浏览器支持多系统支持多语言编程提供了丰富的web自动化测试API 2. API 查找页面元素 find Element() find Elements() 元素定位的方式 xpath selector 通常情况下&#xff0c;不需要手动来编写xpath…

Learn Prompt-经验法则

还记得我们在“基础用法”当中提到的三个经验法则吗&#xff1f; 尝试提示的多种表述以获得最佳结果使用清晰简短的提示&#xff0c;避免不必要的词语减少不精确的描述 现在经过了几页的学习&#xff0c;我认为是时候引入一些新的原则了。 3. 一个话题对应一个chat​ ChatG…

Kafka开篇

前言 从本篇开始对个人Kafka学习做一个总结, 目标有这么几个。 从概念架构角度, 对消息中间件形成概要认知;从使用角度, 掌握其常见用法;从性能角度, 探究其高性能实现机制; 消息中间件的用途 从消息生产和消费的角度, 平衡消费者和消费者的速率差。基于该点可以做到削峰填…

白炽灯对新生儿视力有影响吗?推荐专业的儿童台灯

大家都知道婴儿还在成长发育的重要阶段&#xff0c;身体各方面都是比较脆弱的&#xff0c;对外界事务的感知也很敏感&#xff0c;一点点的刺激都会影响的婴儿。而白炽灯是否适合婴儿使用这个问题&#xff0c;我的建议是尽量不要用白炽灯。 因为白炽灯光线不是很柔和&#xff0c…

周易算卦流程c++实现

代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…

许可分析 license分析 第十二章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的分配和使用权限&#xff1a;制定…

01Spring的Ioc思想和依赖注入手段(DI)

传统方式创建对象的缺陷 连接MySQL实现登录功能 控制层UserController public class UserController {//多态,半面向接口编程private UserService userService new UserServiceImpl();public void login(){String username "admin";String password "1234…

基于 Zookeeper 实现分布式锁

文章目录 前言声明前置知识分布式锁设计原则Zookeeper 分布式锁实现Curator框架实现分布式锁总结 前言 在分布式系统中&#xff0c;确保数据的一致性和避免冲突是一个核心问题&#xff0c;通常我们通过分布式锁来解决&#xff0c;分布式锁本质是一种同步机制&#xff0c;用于控…

【AI】机器学习——支持向量机(线性模型)

支持向量机是一种二分类算法&#xff0c;通过在高维空间中构建超平面实现对样本的分类 文章目录 5.1 SVM概述5.1.1 分类 5.2 线性可分SVM5.2.1 线性可分SVM基本思想5.2.2 策略函数间隔几何间隔硬间隔最大化 5.2.3 原始算法支持向量 5.2.4 对偶形式算法1. 构造并求解对偶问题2. …

【小沐学CAD】嵌入式UI开发工具:GL Studio

文章目录 1、简介2、软件功能3、应用行业3.1 航空3.2 汽车3.3 防御3.4 工业3.5 电力与能源3.6 医疗3.7 空间3.8 科技 结语 1、简介 https://disti.com/gl-studio/ DiSTI 是 HMI 软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式 UI 解决方案的领先提供商。 而它的GL Stu…

kubernetes部署(kubeadmin)

文章目录 1.环境准备2. 安装dokcer3.部署cri-docker4.各个节点安装kubeadm等5.整合kubelet和cri-dockerd配置cri-dockerd配置kubelet 6.初始化集群 1.环境准备 环境和软件版本 OS : ubuntu 20.04 container runtime: docker CE 20.10.22 kubernetes 1.24.17 CRI&#xff1a;cr…

atoi函数

介绍&#xff1a; 头文件: <stdlib.h> 此函数的功能是将数字字符的字符串转化为字面上的整型返回。 例如&#xff1a; char arr1[] "-12"; char arr2[] "12"; char arr3[] " -12"; char arr4[] "-12a";使用atoi 我们…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

RK3399平台开发系列讲解(入门篇)VIM的基础命令

🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…

MFC使用MScomm32.ocx控件实现串口通信

文章目录 建立项目添加MSCOMM控件变量串口的打开和关闭串口发送和接收数据数据接收数据发送16进制数据的收发转换函数数据发送数据接收项目下载地址首先电脑应该有MSCOMM32.OCX并注册 建立项目 使用VS2005新建一个基于对话框的MFC项,在资源视图,右键窗体,插入ActiveX控件,…

基于Questasim的SystemVerilog DPI使用流程

1. 前言 DPI是Direct Programming Interface的缩写&#xff0c;它提供了SystemVerilog与其它编程语言(特别是C语言)交互的接口。它允许编程人员轻松地从SystemVerilog调用C函数&#xff0c;且在C函数也可以调用Systemverilog的函数。 DPI极大地方便了使用现有的C代码&#xf…