C++、与C语言的一些变化、新增的一些函数类型、面向对象程序设计的基本特点

C++

面向对象的编程思想        万物皆对象

类库:

MFC

Qt

opencv

opengl

cout:标准输出流对象

endl:换行符

新的数据类型

bool型:逻辑真假—— true、false

变量的存储类型

auto:变量在定义时由编译器自动推到数据类型(c++11)

        注:用auto时必须初始化;不能定义函数形参;但是返回值可以为auto,前面返回值可以写到后面;

这两者是等价的

register:存放在通用寄存器里;

extern:外部声明;

static:静态变量/函数;

const:将变量变为常量(必须要初始化);

        注:不能拿一个未被const修饰的指针来指向一个被const修饰的变量!!

I/O流

>>标准输入流运算符

<<标准输出流运算符

判断是否为左移右移:看左操作数是否为int型

枚举

c:

c++:,w可以赋初值,整型不能向枚举赋值,枚举可以向整形赋值;

类型转换

static_cast<要转的类型>(变量):静态转换,常用于数字类型之间的转换,不用于指针

cnost_cast ---- dynamic_cast ---- reintepret_cast

引用传参

引用:某个变量的别名(int &ret;)

void fn(&n);

可以函数体外部修改函数体内部的值

之后尽量使用引用传参(节省内存空间,提高效率)

练习:用引用传参写swap(交换两个变量的值)

#include <iostream>
#include <cstdio>
#include <cstring>
#include "func.h"

using namespace std;

void swap(int &a, int &b)
{
    int tmp = 0;
    tmp = a;
    a = b;
    b = tmp;
}

int main(void)
{
    int i = 10;
    int j = 20;

    swap(i, j);
    cout << i << endl;
    cout << j << endl;

    return 0;
}

引用与指针的区别:

1、引用不占空间,指针占8字节(64位);

2、引用定义时必须初始化,指针不用;

3、引用被绑定后,这种绑定关系是不能被拆解的,指针可以被拆解;

内联函数

在一般函数前加inline关键字

inline 类型说明符 函数名(含类型说明的形参表)

{
        语句序列
}

        有可能在调用函数时将函数的代码直接展开,不用保护现场和恢复现场,提高代码执行效率但是也有缺点:有可能占用的空间大了。

        内联函数分文件编写会有问题内联函数的函数体应该放在头文件而不是源文件中!!

        函数必须有返回值(void也行),否则会报错

带默认形参值的函数

函数在定义时可以预先声明默认的形参值;函数调用者也不知道传什么参数时会使用到;

若函数在头文件声明,源文件定于,则默认形参值应该写在头文件里。

函数重载

允许出现两个或两个以上函数同名但不同参的情况,这些函数之间的关系称为函数重载

编译器会选择一个与主调函数参数类型最匹配的函数进行调用,在代码的修改的方向有很大的帮助

返回值不能作为函数重载的依据;

类与对象

类:数据类型

对象:变量

类和对象的关系?答:抽象(类)与具体(对象)的关系

类内:类的设计者编写代码的地方

类外:类的使用者编写代码的地方

访问权限关键字:

        public(公有):类外可以访问

        private(私有):类外无法访问

        protected(保护):类外无法访问

class Clock
{
public:
    void showTime()
    {
        cout << hour << ":" << min << ":" << sec << endl;
    }
    void setTime(int h, int m, int s)
    {
        hour = h;
        min = m;
        sec = s;
    }
    int hour;
    int min;
    int sec;
};

int main(void)
{
    Clock c;

    c.setTime(12, 05, 37);
    c.showTime();

    //对c的其他访问方式
    Clock *p;
    p = &c;
    p->setTime(11, 11, 11);
    p->showTime();

    //对c的其他访问方式
    Clock &ref = c;
    ref.showTime();

    return 0;
}

面向对象程序设计的基本特点

抽象

认清实物的本质

对客观世界认知的过程,即对要解决的问题的本身认知的过程。

数据抽象:数据

功能抽象:行为

要抽象一个东西,就要懂一个东西

以后写代码要先解决抽象问题:有哪些数据抽象,有哪些行为抽象

封装

难点

将数据抽象和行为抽象打包组成一个有机的整体,这个整体就称为类

class Clock    //class关键字;类名
{              //边界
public:        //外部接口
    void setTime(int newH, int newM, int newS); //方法/代码成员
    void showTime();                            //方法/代码成员
private://特定的访问权限
    int hour, minute, second;                   //属性/数据成员
};             //边界

数据成员:属性

成员函数:方法

        使用类的使用者是无法洞察类的内部的,类中相关接口来实现与使用者的交互,接口里面怎么实现则不用细究,将这个过程称为封装。

继承

类和类之间的关系

程序员在保持原有属性的基础上,进行更具体,更详细的说明。

多态

强制多态(强制转换)

重载多态

类型参数化多态

包含多态(虚函数)

面向对象的核心

        例:对象的数据类型在程序运行的时候才能被确定,写代码时不知道数据类型是什么,一旦选择数据类型后,函数运行就不能出错。

23种设计模式中22种都用到了包含多态。

练习:

写一个类 class Complex

main.cpp

#include <iostream>
#include "mycomplex.h"

using namespace std;

int main()
{
    Complex c;
    cout << "zhijie" << endl;
    c.setReal();
    c.setImage();
    c.showComplex();

    Complex *p = &c;
    cout << "*" << endl;
    p->setReal();
    p->setImage();
    p->showComplex();

    Complex &ref = c;
    cout << "&ref" << endl;
    ref.setReal();
    ref.setImage();
    ref.showComplex();

    return 0;
}

mycomplex.cpp 

#include "mycomplex.h"
#include <iostream>

using namespace std;

void Complex::setReal(double r)
{
    real = r;
}

void Complex::setImage(double i)
{
    image = i;
}

void Complex::showComplex(void)
{
    cout << real << "+" << image << "i" << endl;
}

mycomplex.h 

#ifndef MYCOMPLEX_H
#define MYCOMPLEX_H

class Complex
{
public:
    void setReal(double r = 0);
    void setImage(double i = 0);
    void showComplex(void);

private:
    double real;
    double image;
};


#endif // MYCOMPLEX_H

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用 监视虚拟机各种运行状态信息&#xff0c;可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 2 命令格式 jstat [options vmid [interval[count]]] 参数解释 第一个参数&#xff1a;options 代…

谷歌插件编写

目录 manifest.json {"manifest_version": 3,"name": "Floating Ball","version": "1.0","description": "A floating ball on the right side of the webpage.","permissions": ["act…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例&#xff1a;计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…

hcia datacom学习(8):静态NAT、动态NAT、NAPT、Easy IP、NAT server

1.私网地址 在现实环境中&#xff0c;企业、家庭使用的网络是私网地址&#xff08;内网&#xff09;&#xff0c;运营商维护的网络则是公网地址&#xff08;外网&#xff09;。私网地址是在局域网&#xff08;LAN&#xff09;内使用的&#xff0c;因此无法被路由&#xff0c;不…

多线程讲解(详解)

目录 什么是多线程&#xff1f; 为什么要使用多线程&#xff1f; 线程的创建 使用Thread实现 从以上代码我们梳理一下多线程创建步骤&#xff1a; 注意&#xff1a; 小示例 首先&#xff0c;引入依赖 然后&#xff0c;按照我们刚刚说的构建多线程的步骤进行构建&#…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接&#xff1a; NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的&#xff0c;始于1985年中国科学院医学情报所&#xff0c;后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分&#xff0c;其中医学立项查新&#xff0c;它是指在医学科研项目申报开题之前&#xff0c…

Wondershaper网络限制脚本源码分析一(下载速度限制篇)

Wondershaper 是一个简单的 Linux 命令行工具&#xff0c;用于自动管理和控制网络接口的上行和下行带宽&#xff0c;旨在为用户提供稳定的网络体验&#xff0c;尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能&#xff0c;但与直接使用 tc 相比&…

python基础之开发工具配置

day01-Python基础 一、Python介绍 Python是一个计算编程语言&#xff0c;可以实现计算程序开发&#xff0c;也可以用于数据处理。SQL语言只能用于结构化数据的处理。Python的比SQL应用更广泛。 1990年推广Python&#xff0c;最初是应用于运维开发&#xff0c;随着不断更新迭代…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE&#xff08;XML External Entity Injection&#xff09;是一种攻击技术&#xff0c;它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置&#xff0c;攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域&#xff0c;PLC工程师扮演着至关重要的角色&#xff0c;他们负责构建、维护自动化系统&#xff0c;推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段&#xff0c;每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

ffmpeg中AVCodec是否需要手动销毁?

在开发到退出一个视频播放功能时&#xff0c;看到对AVCodec*这个指针做了初始化&#xff0c;但是突然有一个好奇的疑问&#xff0c;这个AVCodec到底是否需要人工手动销毁&#xff1f; 我在初始化的时候这样用的&#xff1a; const AVCodec *v_codec NULL; AVCodecContext *v…

从零到一建设数据中台 - 应用场景及实施路径

从零到一建设数据中台 - 应用场景及实施路径 一、数据中台技术场景 异构数据源集成、交换场景&#xff1a;实现异构数据源的整合集中和交换共享数据治理场景&#xff1a;从元数据角度实现企业级数据目录管理、保证数据质量、数据安全&#xff0c;提供数据血缘、数据服务数仓、…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3。 近期写了个python程序&#xff0c;用青龙面板在centos上运行。程序中有while无限循环&#xff0c;但是我在青龙中设置了定时任务&#xff08;每隔半小时运行一次&#xff09;&#xff0c;于是造成了进程中有多个…

宁波财经学院第十三周李倩教学检查第一节课

好奇和满足好奇心的 0.简单的介绍额 1.李倩提到了如何导入jar包,这应该如何去导入呢? 2.波哥防区只获取了一个request的字段 获得文件内容和保存文件

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断&#xff0c;我们可以进行如下抽象。把CPU看做一个母亲&#xff0c;当它正在执行任务的时候&#xff0c;可以看为是一个母…

运维出现的问题 --集成

运维出现的问题 集成 macos 本地打的镜像&#xff0c;推到线上出现 images platform (linux/arm64) does not match the detected解决办法 macos 本地打的镜像&#xff0c;推到线上出现 image’s platform (linux/arm64) does not match the detected WARNING: The requested …

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中&#xff0c;我们可以看到微服务列表&#xff0c;其中有一栏叫“健康实例数” &#xff08;如下图&#xff09;&#xff0c;表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 &#xff1f; 本章…