C++基础总结

2023-05-16

1.引用和指针区别

引用变量是一个别名,相当于定义了一个const类型变量,但不分配空间
引用定义时必须初始化,指针无要求
初始化时引用一个实体后不能再引用其他的,指针可以在任何时候指向任一同类型实体
没有NULL引用,有NULL指针
引用的sizeof结果为引用类型的大小,指针的sizeof结果为地址空间所占字节
有多级指针,没有多级引用
引用比指针使用相对安全 :(1)引用在定义时就与变量绑定了,而指针不一定,指针在定义后没有初始化就是[野指针(2)引用与被引用的变量是同一个地址,使引用不用进行地址操作,这样使地址是不可修改的,使访问更加安全。

2.内联函数

空间换时间的做法,省去函数调用和返回的开销,直接展开运行
适用被多次调用的函数,且函数代码较小没有包含循环、递归,否则会被编译器优化
声明和定义不分离
内联函数于#define的区别:
(1)内联函数在运行时可调试,而宏定义不可以;
(2)编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
(3)内联函数可以访问类的成员变量,宏定义则不能;
(4)在类中声明同时定义的成员函数,自动转化为内联函数。

3.代替宏

const修饰的变量为常量,在编译阶段替换
inline修饰的函数为宏函数

4.auto关键字

编译时根据初始化表达式推导auto的实际类型
auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

5.范围for

6.类

类是 C++ 的核心特性,用于指定对象的形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUNIbZVS-1661245035226)(cpp-classes-objects-2020-12-10-11.png)]
默认情况下,类的所有成员都是私有的
在类的外部使用范围解析运算符 :: 定义函数
访问修饰符:
public:在程序中类的外部是可访问的
protected:在类和友元函数和派生类(即子类)中是可访问的
private:只有类和友元函数可以访问
继承中的特点:

  1. public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
  2. protected 继承::protected, protected, private
  3. private 继承::private, private, private

构造函数
构造函数的名称与类的名称是完全相同的,不会返回任何类型,可带参数,在每次创建类的新对象时执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ntuk5k0q-1661245035227)(屏幕截图%202022-03-20%20232811.png)]

析构函数:
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,在每次删除所创建的对象时执行
有助于在跳出程序(比如关闭文件、释放内存等)前释放资源
拷贝构造函数
在创建对象时,使用同一类中之前创建的对象来初始化新创建的对象
拷贝构造函数通常用于:
通过使用另一个同类型的对象来初始化新创建的对象。
复制对象把它作为参数传递给函数。
复制对象,并从函数返回这个对象。

友元函数
类的友元函数是定义在类外部,声明在类内部,并不是成员函数
声明函数为一个类的友元,函数原型前使用关键字 friend
友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
this指针
每一个对象都能通过 this 指针来访问自己的地址。
在成员函数内部,它可以用来指向调用对象及成员
静态成员
不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化
静态成员函数只要使用类名加范围解析运算符 :: 就可以访问
静态成员函数和普通成员函数区别:

  1. 静态成员函数没有this指针,只能访问静态成员
  2. 普通成员函数有this指针,可以访问类中任意成员

7.继承

继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易,也达到了重用代码功能和提高执行效率的效果。
class derived-class: access-specifier base-class
派生类可以访问基类中所有的非私有成员
一个派生类继承了所有的基类方法,但下列情况除外:

基类的构造函数、析构函数和拷贝构造函数
基类的重载运算符
基类的友元函数

公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问

8.重载运算符和重载函数

在同一作用域中的某个函数和运算符指定多个定义
重载函数指声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。

// 重载 + 运算符,用于把两个 Box 对象相加
      Box operator+(const Box& b)
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }

9.多态

虚函数是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

10.数据抽象,数据封装,抽象类

数据抽象: 接口和实现分离
如果改变底层实现,接口也将保持不变。在这种情况下,不管任何程序使用接口,接口都不会受到影响,只需要将最新的实现重新编译即可。
数据封装:数据和操作数据的函数绑定在一起
设置类成员状态为私有(private),除非我们真的需要将其暴露,这样才能保证良好的封装性。
抽象类: 类中至少有一个函数被声明为纯虚函数
使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

10.文件和流

引用头文件fstream
ofstream输出文件流
ifstream输入文件流
fsteram文件流
成员:

打开:void open(const char *filename, ios::openmode mode);
关闭:void close();
重新定位文件位置指针 :seekg

写入文件:ofstream 或 fstream 对象 <<
读取文件:ifstream 或 fstream 对象 >>

11.异常处理

throw: 抛出异常
catch: 捕获异常
try: 检测try 块中的代码是否有异常
标准错误流cerr <<

#include <iostream>
using namespace std;
 
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}
 
int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
     z = division(x, y);
     cout << z << endl;
   }catch (const char* msg) {
     cerr << msg << endl;
   }
 
   return 0;
}

通过继承和重载 exception 类来定义新的异常

12.动态内存

new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。
一维数组:

// 动态分配,数组长度为 m
int *array=new int [m];
 
//释放内存
delete [] array;

二维数组:

int **array
// 假定数组第一维长度为 m, 第二维长度为 n
// 动态分配空间
array = new int *[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int [n]  ;
}
//释放
for( int i=0; i<m; i++ )
{
    delete [] array[i];
}
delete [] array;

三维数组:

int ***array;
// 假定数组第一维为 m, 第二维为 n, 第三维为h
// 动态分配空间
array = new int **[m];
for( int i=0; i<m; i++ )
{
    array[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
        array[i][j] = new int [h];
    }
}
//释放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
        delete[] array[i][j];
    }
    delete[] array[i];
}
delete[] array;

13.命名空间

namespace namespace_name {
   // 代码声明
}
name::code;  // code 可以是变量或函数

使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称

14.模板

15.预处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础总结 的相关文章

  • 通俗地、有效地学习Linux驱动&应用(只要没更完有空就更)

    目录 食用方法 Warning Linux系统分层的意义 系统移植和烧写 Windows系统下通过OTG烧写 Ubuntu脚本烧写 Windows脚本烧写 通过uboot进行操作 Debian移植 xff08 EBF6ULL系列请看 xff
  • ROS+Opencv的双目相机标定和orbslam双目参数匹配

    本文承接ROS调用USB双目摄像头模组 目录 先完成单目标定双目标定生成可用于ORB SLAM2的yaml文件生成可用于ORB SLAM3的yaml文件参考 按照上面链接配置好后 xff0c 执行 rostopic list 你应该可以找到
  • 双目相机 -- IMU联合标定

    声明 xff1a 一些图片是不该有水印的 xff0c CSDN把图片链接的格式改了 xff0c 暂时还不知道怎么去掉 xff0c 请见谅 xff01 xff01 xff01 目录 声明 xff1a 一些图片是不该有水印的 xff0c CSD
  • window子系统wsl2安装kali及桌面

    一 先升级wsl2 xff08 1 xff09 wsl1没有Linux的内核 xff0c 所以很多Linux版本的工具都无法在wsl1中运行 xff0c 比如 xff1a docker xff0c Linux版本的浏览器等等 所以需要升级为
  • 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我!

    1 0背景 目前开发过程中 xff0c 按照公司规范 xff0c 需要依赖框架中的缓存组件 不得不说 xff0c 做组件的大牛对CRUD操作的封装 xff0c 连接池 缓存路由 缓存安全性的管控都处理的无可挑剔 但是有一个小问题 xff0c
  • 一次搞懂,Docker底层原理分析实战

    当今 xff0c Docker 技术已经形成了更为成熟的生态圈 xff0c 各家公司都在积极做业务容器化改造 xff0c 大家对 Docker 也都已经不再陌生 但在我刚接触 Docker 时 xff0c 市面上的资料还非常少 xff0c
  • RocketMq安装出现的问题

    RocketMq4 9 3版本下载安装问题 xff08 Win10 xff09 1 官网https rocketmq apache org docs quick start 找到下图中所示的链接 下载链接 解压到自己想要的目录下 xff0c
  • 阿里云服务器搭建fastdfs

    fastdfs安装介绍 环境准备 本人的阿里云服务器CentOS Linux release 7 9 2009 Core 版本 xff08 通过命令cat etc redhat release查看自己的Linux版本信息 xff09 过程中
  • win10搭建mysql主从复制的两个测试主从数据库

    mysql主从复制基础 win10电脑设置两个mysql数据库 卸载MySQL数据库 本人只是想把自己的mysql5 7 4升级为mysql8版本 xff0c 这里顺带记录一下 xff0c 以便有需要的人查看备份数据库 本人使用的是sqly
  • mac系统n工具下载node.js速度过慢(导致下载失败)

    n工具下载node js失败 n工具n工具下载node js失败的原因解决注意 n工具 n工具是mac系统用来管理多个node js版本的工具 xff0c 我们如果要使用到多个node js版本 xff0c 那么就可以使用n工具 xff0c
  • 使用Git小乌龟初始化本地仓库并且创建新的分支提交 删除分支(超详细图文教程,手把手教你做)

    前段时间入了小乌龟的坑 xff0c 最近项目需要多人合作 xff0c 就需要使用分支提交项目 xff0c 这里刚好就使用到了创建分支功能 xff0c 就记录一下使用的完整过程 文章目录 第一步 初始仓库 xff1a 1 1 创建完成项目会多
  • opencv笔试面试必背题目

    算法工程师 xff0c 技术软件类求职opencv必背八股文 更多算法 业务 HR面等笔试题面试题 gt 个性签名自取 xff01 1 opencv中RGB2GRAY是怎么实现的 答 xff1a 以R G B为轴建立空间直角坐标系 xff0
  • 我的新地址 http://www.cppblog.com/flyingxu/

    我的新地址 http www cppblog com flyingxu 这里的文章不会移过去 xff0c 也不会继续更新 xff0c 保持现状 以后会不会重新开始更新 xff0c 也不确定
  • px4+ros+gazebo+ORB_SLAM2室内视觉无人机导航

    px4 43 ros 43 gazebo 43 ORB SLAM2室内视觉无人机导航 一 ros 43 px4环境搭建 我用的ORB SLAM2视觉相机跑图首先要安装ros 43 px4环境 xff0c 我用的阿木实验室的镜像 xff0c
  • pc+tx2通信

    https blog csdn net RNG uzi article details 107285113
  • F4烧写PX4固件

    一 硬件准备 一个f4v3pro或者f4v3s飞控 xff0c 一根USB线 xff0c F450机架 xff0c ET07接收机和配套遥控器 xff0c 20A电调 xff0c 电机 xff0c 格式3s电池 1 无人机组装效果图 上 上
  • C++结构体类型变量

    C 43 43 定义结构体类型变量的方法 1 先声明结构体类型再定义变量名 xff0c 在定义了结构体变量后 xff0c 系统会为之分配内存单元 span class token keyword struct span Student sp
  • pycharm中如何安装tensorflow、cv2

    做卷积神经网络时用到了Python xff0c 记录一下遇到的问题 xff0c 首先 xff0c anaconda和pycharm的安装可按照网上的教程来 tensorflow的安装 但是 xff0c 当配置好解释器之后 xff0c 面临的
  • 【vscode和gitee】如何更改VsCode的gitee远程库地址,并提交到新的仓库中

    如何更改VsCode的gitee远程库地址 xff0c 并提交到新的仓库中 1 查看并更换git远程仓库地址 span class token number 1 span 查看当前remotes span class token funct
  • 【软件评测】03程序语言基础

    仅为学习记录 程序设计语言概述 低级语言 机器语言 xff1a 用二进制代码表示的计算机的指令等 xff0c 所有都是二进制表示 xff0c 计算机可以直接执行 xff0c 而不需要再次进行编译 优点 xff1a 执行效率较高 xff0c

随机推荐

  • 【软件评测】06计算机网络基础知识

    计算机网络基础知识 OSI RM七层模型七层模型TCP IP四层协议冲突域和广播域的区别 常见的协议协议族常见协议及对应端口常用的端口号 域名空间万维网Windows网络相关命令IP地址IP地址IP地址的分类IP地址掩码变长子网掩码特殊含义
  • 【软件评测】07安全性基础知识

    安全性基础知识 安全保护等级安全防护体系数据安全策略安全防护策略防火墙包过滤状态检测代理服务 安全协议 病毒与木马病毒木马 网络攻击访问控制访问控制实现方式身份验证方式 加密技术对称性加密技术非对称性加密技术单向加密PKI签名 43 加密
  • 【软件评测】09知识产权和项目管理基础知识

    仅为学习记录 知识产权 著作权概述 著作权 知识产权是指人们基于自己的智力活动所创造的成果和经营管理活动中的经验知识而依法享有的权利 知识产权的特点 xff1a 无形性 双重性 确认性 独创性 地域性 时间性 版权 xff08 著作权 xf
  • 131. Palindrome Partitioning

    文章目录 1 题目理解2 回溯3 动态规划 1 题目理解 输入 xff1a 字符串s 规则 xff1a 将字符串s分割 xff0c 分割后每一个部分都是一个回文串 输出 xff1a 所有的分割方式 Example 1 Input s 61
  • 【软件评测】10数据库技术

    仅记录学习过程 数据库技术相关术语 术语 数据 描述事物的符号 xff0c 是传递信息的载体信息 事物的状态和事物状态变化的反馈数据库 存放数据的地方 xff0c 统一管理 长期存放在计算机内 有组织 相互关联的数据集合 xff0c 特点是
  • 【软件评测】11软件测试理论

    仅为学习记录 软件测试理论 软件测试基础软件测试软件测试验证与确认软件缺陷 测试质量与保证软件质量质量保证 测试用例测试策略测试的原则软件测试模型V模型W模型H模型敏捷测试模型 软件测试分类回归测试按照关联代码划分按实施主体划分按工程阶段划
  • 数学建模-第六章:最优化方法建模

    最优化方法 数学规划 xff0c 是运筹学的一个分支怎样建立最优化问题的数学模型 决策变量和函数约束或限制条件目标函数 连续变量优化模型 线性规划 标准形式的线性规划模型 线性规划问题转为标准形式 max w 61 7x 43 12y s
  • Linux基础命令总结(超全)

    Linux中一些基础命令 1 pwd xff1a 显示当前所在位置的绝对路径 2 cd 43 路径 xff1a 切换当前工作位置 3 cd xff1a 退回到当前位置 4 cd xff1a 退回到上一层 5 ls xff1a 默认显示当前位
  • C#窗体简单应用

    创建登录页面 xff0c 登录成功跳转测试页面 第一步 xff0c VS创建窗体 第二步 xff0c 进入程序 xff0c 开始编辑 第三步 xff0c 从 视图 找出 工具箱 xff0c 拉出对应控件 xff0c 排布登录页面 第四步 x
  • 四旋翼无人机仿真之hector_quadrotor无人机(ROS + Gazebo)(一)

    这里写自定义目录标题 应用环境hector quadrotor 功能包结构简介hector quadrotor 功能包安装1 安装所需依赖库2 下载 安装hector quadrotor参考文章 应用环境 ubuntu16 04 虚拟机实体
  • 四旋翼无人机仿真之hector_quadrotor无人机(ROS + Gazebo)(三)传感器数据读取与复现(IMU、GPS)

    系列文章目录 文章1 xff1a 四旋翼无人机仿真之hector quadrotor无人机 xff08 ROS 43 Gazebo xff09 文章2 xff1a 四旋翼无人机仿真之hector quadrotor xff08 二 xff0
  • 魔霸新锐2021双系统配置

    https blog csdn net FontThrone article details 104282121 主要参考独立显卡部分 https www bilibili com read cv11300312 xff08 主要参考核心显
  • XTDrone vins-fusion+ego-swarm debug(已解决)

    问题描述 xff1a 低优先级无人机 xff08 除0号无人机以外 xff09 运行撞墙 xff1b 启动时低优先级无人机会异常的飘逸一段距离 xff0c 而rviz里显示的b样条曲线的控制点起点没变 这是刚启动的情况 启动大概不到1秒无人
  • cmake find_packages 搜索路径与 opencv版本管理

    find packages搜索路径 xff1a 设定一个project DIR变量来指定路径 xff0c 找到对应库的 cmake xff0c 例如 xff1a set OpenCV DIR usr share OpenCV 多版本proj
  • 小白理解Kubernetes系列

    初识Kubernetes 从本篇文章开始 xff0c 记录Kubernetes的内容 xff0c Kubernetes相关的知识点包括十三个部分 xff0c 分别是前世今生 组件说明 Pod概念 网络通讯方式 集群安装 资源清单 资源控制器
  • Warning: skipping non-radio button in group

    现象 xff1a 当我们加入一组单选按钮 xff0c 并将它们设置为一组互斥按钮 xff0c 然后又添加其他控件 xff0c 这时按F5编译 xff0c 出现如下警告信息 xff1a Warning skipping non radio b
  • ubuntu蓝牙相关问题(ubuntu 18.04 + ax210)

    装驱动 xff08 ax210的驱动好像要内核5 10以上能用 xff0c 可以参考我之前的博客升级 xff09 span class token function wget span span class token parameter
  • 嵌入式软件面试经典问题

    一 进程与线程 xff08 不同的系统资源管理方式 xff09 1 区别 进程 xff1a 资源分配的基本单位 xff0c 由一个或者多个线程组成 线程 xff1a 调度器进行调度的基本单位 xff0c 一个任务 每个进程都有自己独立的内存
  • ESP8266常用API函数总结(vscode+platformIO)

    1 COMMON 1 includePath ctrl 43 shift 43 p进入命令面板输入C C 43 43 Edit Configurations 在包含文件中选择include文件目录 2 输出监视器 在platformio i
  • C++基础总结

    1 引用和指针区别 引用变量是一个别名 xff0c 相当于定义了一个const类型变量 xff0c 但不分配空间 引用定义时必须初始化 xff0c 指针无要求 初始化时引用一个实体后不能再引用其他的 xff0c 指针可以在任何时候指向任一同