对于c++的总结与思考

笔者觉得好用的学习方法:模板法

1.采用原因:由于刚从c语言面向过程的学习中解脱出来,立即把思路从面向过程转到面向对象肯定不现实,加之全新的复杂语法与操作,着实给新手学习这门语言带来了不小的困难。所以,笔者探索出了一种好用的学习方法:模板法。

2.采用方法:在接触新知识时,没有必要从一开始便理清新知识的来龙去脉,可以先去csdn上学习新知识的模板和语法,再写一些简单程序以强化理解。在听完学校的课程后,写作业时,可以先使用ai写一道简单题并学习其格式和逻辑,再自己写难题

笔者觉得好用的纠错方法:程序示踪法

1.采用范围:程序报错且错误在认知范围内,如果遇到认知范围外的错误或者不报错却运行不了,请直接找老师解决或者用AI检验

2.为什么笔者觉得它比调试更加高效?因为在调试的时候,为了理清监视变量的变化,需要在循环的每一步认真分析,这样会浪费大量时间。所以,笔者在程序报错时,首先会检查指针越界和数组循环问题,然后分块将代码注释并运行,通过成功运行的部分不断扩大最终找到问题所在,或者当itc报错而不显示输入数据时,在每次输入后都打印一遍以获得数据,在检查类的析构,构造,组合,多态等复杂的问题时,让每个函数都打印特定的值,以确定函数失效的部分

类与对象

1.数据的封装:在一个类中,有public,private,protected三种成员,它们对应了不同的保密程度,这点与数据封装有关,它们的区别是public可以由任意操作进行访问,而protected只能由本类和子类的成员函数访问(子类笔者下文会讲),private的封装性更好,只能由本类的成员函数访问(注意:在自己写题的时候尽量写成public类,一是写题没有封装性要求,二是防止因自己写的子类函数无法访问基类成员而纠错),三种成员必须显示声明如public:再写public类型的数据成员与成员函数,否则默认为private类型。

2.成员:在一个类中,有几个固定的组成部分:数据成员与成员函数。其中成员是类所具有的数据,如整型,浮点型,字符型,数组指针甚至其他的类。具体参考c语言的结构体,而成员函数有以下三种:构造函数(必须显示声明,分为三种:默认构造函数,赋值构造函数与复制构造函数,默认构造函数的格式为类型名(){}; ,赋值构造函数就和普通的函数一样,将实参复制为形参,复制后释放,复制构造函数既可以显示声明也可以不声明,系统自己会生成一个,但如果要用记得声明,它的格式如下):

class good
{
public:
int b;
good(){};
good(const good &a)
{
b=a.b;
}
};

普通成员函数:和写在类外的函数只有一个区别,就是它可以调用本类中的一切数据成员

析构函数,与构造函数的格式类似,前面需要加一个~(小提示:键盘左上角),它可以自己定义,或者由系统自动生成,往往与打印某些语句有关。

3.new与delete,这两个函数的使用参考malloc与free,笔者在动态内存存储中有讲,动态内存管理-CSDN博客,只要使用了new,就必须显示声明析构函数并将空间delete掉(delete[]表示释放一个数组的空间),至于原因,就由下面的话题来解释◕‿◕

深拷贝与浅拷贝

1.不出意外,我们的所有数据都进行了深拷贝,即成功拷贝,可以理解为不报错的拷贝。

2.但是不出意外的情况下还是出意外了,当我们准备拷贝指针以及指针类型的数据(字符串,数组,函数,类)时出现了一个问题,这些拷贝的都是目标内存空间的地址,地址只有一个,所以,当复制构造完成时,我们的对象a(书接上文代码)就被释放了,而这些空间被释放后,原对象也会对这些空间进行释放,但它们已经不存在了,所以就出现了错误。

3.解决方法:给这些数据一个新的空间,把指针指向的数据放进去,这时候指针只是一个媒介,只是指指路,真正操作的是它指向空间的数据

4.代码演示

class good
{
public:
int *p;//此处一般为数组good (const good& d)//拷贝构造函数,深拷贝版
{p = new char[strlen(d.p) + 1];//为这个指针申请一个新空间if (p != 0){strcpy(p, d.p);//只操作数据,不操作指针,析构记得delete};

函数重载(引入重要思想多态性)

1.为什么要有多态性:俗话说:“一千个读者就有一千个哈姆雷特”,在生活中,我们使用同一个工具,在不同场景中的使用方法和结果是不一样的,而c++中的函数重载正是还原了这点。一个函数,因为参数,函数体,返回结果的不同,实现了多种实现方式,这就是传说中的多态性。

2.函数重载的方法:一个函数名,因不同参数而产生不同情况。所以可以在这些情况下随意使用,不需要写多个函数,增加了代码的可读性,代码如下:

int add(int a,int b)
{
return a+b;
}
float add(float a,float b)
{
return a+b;
}

类的组合与类的继承(引入重要思想继承)

1.为什么要引入类的组合与类的继承?因为c++在尽力复刻生活中的关系,比如机器与零件的组合关系以及父与子之间的继承关系。

2.格式:类的组合在大类中的声明和数据成员一样,如good a;,但注意组合类的声明必须在大类之前,类的继承必须保证基类函数在子类函数之前声明,继承有三种方式,public,protected和private,不同的方式下继承导致成员类型发生变化的情况如下表:

3.继承格式:class 子类名:继承方式 基类名

4.继承方式分为单继承与多继承,即父类与子类对象一对一和多对一,已知子类可以调用父类的成员和成员函数,那么出现重叠怎么办?所以,就有了如下定义:

虚基类,虚函数与抽象类,顺序问题

1.虚基类引入目的:解决代码在多继承中出现的冲突问题,由最远的基类成员来提供基类数据,注意引入时要在第一级继承时将共同基类设置为虚基类(在继承类型前加virtual )

2.顺序问题请看下表

注意析构函数的执行过程与构造函数相反,先构造后析构。

3.虚成员函数(必须为非静态函数):它的功能是在基类中定义的虚函数,子类可根据自身情况进行覆写以达到不同的需求。格式就是在函数前面加上virtual

4.虚析构函数(用的少):作用就是通过基类指针删除对象或者调用对象的析构函数,格式就是在~前加个virtual

5.纯虚函数与抽象类:当一个函数虚到只有一个函数名是重要的时候,会以virtual 函数名 形参表=0的形式输出,而含有纯虚函数的类叫做抽象类,它具有以下特点:

6.每个子类都要把基类的全部纯虚函数都重写一遍,哪怕是空函数,注意是全部!

运算符重载

1.通过运算符重载,我们就可以实现有关类的一切运算

2.运算符重载有两种方式,一种是类的成员函数,一种是类的友元函数(在函数或者类前面加个friend代表此函数或者此类可以访问该类的成员及成员函数),前者的格式为:返回类型 operator& 需要重载的运算符(除了本类外的其他参数或类){实现过程}(注意*this代表本函数的指针),后者的格式就是在前者格式的最前面加一个friend在参数多加一个类)

3.本快知识就是模板,笔者做过一道题,读者可以参考一下,模板和方法比较全:

【问题描述】实现Mystring类,类结构如下

class MyString{

private:

    char str[1024];

    unsigned len;/*字符串长度*/

public:

    MyString()

    MyString& operator=(const char *mstr)/*常量字符串赋值*/

    MyString& operator=(const MyString mstr)/*同类型赋值*/

    MyString operator+(const MyString mstr)/*字符串拼接*/

    char &operator [](int i)/*查询串内字符*/

    bool operator==(const MyString mstr)/*判断是否相等*/

    bool operator!=(const MyString mstr)/*判断是否不等*/

    void operator+=(const MyString mstr)/*字符串拼接赋值*/

    bool operator>(const MyString mstr)/*按典序比较*/

    bool operator<(const MyString mstr)}/*同上*/

    friend ostream &operator<<(ostream &out,const MyString mstr);/*友元输出流符号重载*/

};

主函数结构如下:

int main()

{

    char ts[1024];

    cin>>ts;

    MyString s;

    s = ts;

    cin>>ts;

    MyString ss;

    ss = ts;

    if(ss == s)

        cout<<"equal"<<endl;

    if(ss != s)

    {

        cout<<"Not equal"<<endl;

        if(s > ss)

            cout<<"s da yu ss"<<endl;

        if(s < ss)

            cout<<"s xiao yu ss"<<endl;

    }

    ss += s;

    MyString sss;

    sss = s + ss;

    sss[0] = '$';

    cout<<sss<<endl;

    return 0;

}

#请勿修改主函数,请勿使用C++的string类#

【输入形式】两个字符串,以换行隔开;

【输出形式】调用所给main函数

【样例输入】

abcd

abcde

【样例输出】

Not equal

s xiao yu ss

$bcdabcdeabcd

运算符重载 · 王赫辰/c语言 - Gitee.com

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

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

相关文章

【动画视频生成】

转自&#xff1a;机器之心 动画视频生成这几天火了&#xff0c;这次 NUS、字节的新框架不仅效果自然流畅&#xff0c;还在视频保真度方面比其他方法强了一大截。 最近&#xff0c;阿里研究团队构建了一种名为 Animate Anyone 的方法&#xff0c;只需要一张人物照片&#xff0…

数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)二

第一部分、数据结构快速入门&#xff0c;数据结构基础详解 数据结构基础&#xff0c;主要研究数据存储的方式。 本章作为数据结构的入门课程&#xff0c;主要让读者明白&#xff0c;数据结构到底是什么&#xff0c;常用的数据存储结构有哪些&#xff0c;数据结构和算法之间到底…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

【Python】ubuntu python>3.9编译安装,及多个Python版本并存的使用方法

【Python】ubuntu python3.9编译安装&#xff0c;及多个Python版本并存的使用方法 1. 安装依赖2. 编译与安装2.1 依赖与源获取2.2 配置2.3 编译2.4 安装2.5 链接动态库 3. 多版本兼容 1. 安装依赖 更新系统软件 在正式开始之前&#xff0c;建议首先检查系统软件是否均为最新&a…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 YARN资源管理平台队列调度策略 Capacity Scheduler 默认配置下,Capacity Scheduler 将尝试保证每个队列在其分配的容量内公平地使用资源。 然而,Hadoop 也支持通过调整队列的权重和使用抢占策略来优化资…

《Spring Cloud学习笔记:微服务保护Sentinel》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

微信小程序开发系列-04获取用户图像和昵称

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代&#xff0c;我的运气不是很好&#xff0c;从第一个“版本”开始尝试&#xff0c;这篇文章也是记录下这个过程&#xff0c;以便其他新手能快速找到解决方案。 Gen1-getUserInfo 第一个…

音视频学习(二十二)——rtmp发流(tcp方式)

前言 本文主要介绍自研的RtmpStreamSender.dll&#xff0c;rtmp库提供接口接收裸流数据&#xff0c;支持将裸流数据封装为flv格式并通过rtmp协议发流。 关于rtmp协议基础介绍可查看&#xff1a;https://blog.csdn.net/www_dong/article/details/131026072 关于rtmp收流介绍可…

可视化云监控/安防监控系统EasyCVR视频管理平台播流失败的原因(端口篇)

安防视频监控EasyCVR平台兼容性强&#xff0c;可支持的接入协议众多&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…

XIAO ESP32S3之物体检测加入视频流

一、前言 由于XIAO ESP32S3开发套件没有显示屏配件&#xff0c;因此加入http视频流功能&#xff0c;可通过浏览器请求ESP32S3上的视频流。 二、思路 1、XIAO ESP32S3启动后通过wifi连接到AP&#xff1b; 2、启动http服务器&#xff0c;注册get_mjpeg处理函数&#xff1b; 3…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

目录 ​专题一 开启大模型 专题二 基于ChatGPT大模型提问框架 专题三 基于ChatGPT大模型的数据清洗 专题四 基于ChatGPT大模型的统计分析 专题五 基于ChatGPT大模型的机器学习 专题六 基于ChatGPT大模型的科研绘图 专题七 基于ChatGPT大模型的GIS应用 专题八 基于基于C…

FTP原理与配置

FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 FTP的应用 FTP 提供了一种在服务器和客户机之间上传和下载文件的有效方式。在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…

蓝桥杯嵌入式KEY

1.按键原理图 2.按键GPIO引脚设置成输入&#xff0c;上拉模式 3.设置TIM4时钟源为外部时钟源 PSC为80-1 Period为10000-1 打开NVIC 中断时间为10ms 4.在bsp文件中添加interrupt.c文件 5.按键单击代码 6.长按键 7.按键过程和显示过程

c语言结构体(初阶)

1. 结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&#xff0c;这些值被称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member - list; }variable-list; 例&#xff1a;描述一个人的信息&#xff1a;名字电话性别身高 //声明的…

深入浅出:分布式、CAP 和 BASE 理论(荣耀典藏版)

大家好&#xff0c;我是月夜枫&#xff0c;一个漂泊江湖多年的 985 非科班程序员&#xff0c;曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 在计算机科学领域&#xff0c;分布式系统是一门极具挑战性的研究方向&#xff0c;也是互联网应用中必不可少的优化实践&…

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…

ROS学习记录:如何在Github上寻找并安装软件包

一、打开网页输入www.github.com 二、进入github界面 三、打开一个终端&#xff0c;输入mkdir catkin_ws1建立一个工作空间 四、使用cd catkin_ws1进入工作空间 五、使用mkdir src创建一个子目录src就是source&#xff0c;原始资料的意思,指的就是程序源代码这类资源材料&#…

小机器人,电子锁,牙刷,表类开关,磁阀开关等一些安防直流驱动的选型介绍分析

安防监控是一门被人们日益重视的新兴行业&#xff0c;就目前发展来看&#xff0c;应用普及程度越来越广&#xff0c;科技含量也越来越高&#xff0c;几乎所有高新科技都可促进其发展&#xff0c;尤其是信息时代的来临&#xff0c;更为该行业的发展提供契机。其中安防领域最为典…

electron 菜单栏打开指定url页面菜单实现方法

electron 菜单栏打开指定url页面菜单 可以是本地URL也可以是远程的URL 自动判断跳转 以下代码可以在主进程main.js里面也可以是在独立的模块文件里面 const { BrowserWindow } require(electron);//定义窗口加载URL export const winURL process.env.NODE_ENV development …