当前位置: 首页 > news >正文

C++初阶2

目录

一,auto关键字

1-1,auto的使用

1-2,基于范围auto的for循环

二,nullptr的运用

三,C++类的初步学习

3-1,类的引用

3-2,类的访问权限

3-3,类的使用

1,类中函数的定义

2,类中对象的使用

3-4,类对象模型

1,类对象的存储方式

2,类的大小


一,auto关键字

开门介绍:

        在C++准有规定中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量是由编译器在编译时期推导而得。具体简单运用如下:

#include <iostream>
using namespace std;
int main() {
    int a = 0;
    int b = a;
    auto c = a;
    auto d = &a;
    auto* e = &a;
    //typeid是输出指定数据的类型
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    cout << typeid(e).name() << endl;
    return 0;
}

运行图:

        可看出,auto可用来存储任意类型,像上面说的,它是一种类型提示符,提示系统声明的变量属于什么类型。


1-1,auto的使用

        auto的使用其实不是向上面一样,auto在C++中真正的用武之地在于后面学习的复杂结构中,如C++中迭代器的使用,容器的运用等,比如vector<string>::iterator it = v.begin();结构很复杂,使用auto可直接优化为auto it = v.begin()。(这里只是演示,我们只需明白auto的用法即可,具体深入使用后面的文章会具体讲解)。

        auto的使用有着以下注意要素:

        1,auto的使用必须初始化。auto是用来简化类型的,系统在编译阶段需要根据auto表达式来推导出auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

        2,当用auto声明指针类型时,auto和auto*没有任何区别,但用auto声明引用类型时则必须 加&。因为引用的本质就是指定数据的"别名",类型与之相同,如果不加&,系统将不知是否使用引用引用型,而指针类型是"独特的",系统可以区分。

        3,auto可以在同一行定义多个变量,但是这些变量必须是相同的类型,否则编译器将会报错,因为编译器在编译阶段只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

        4,auto不支持函数的形参使用和函数的返回值使用,原因是当系统遍历到此函数的形参auto型时,相当于没有初始化一样,而一旦做返回值使用,将会出现很多麻烦。(这里与C++内部的复杂构造有关,在这里就不做过多说明)。

1-2,基于范围auto的for循环

        在C++11标准介绍中,考虑到了for循环使用的麻烦,所以C++11中就引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,具体的细节和解说请看以下代码。初学者可能有些听不懂迭代的感念,不过本文这里不做重点,这里我们只需明白下面代码如何用auto使用即可,具体的知识后文会讲解,这里只是为后面打基础。

void TestFor()
{
    int array[] = { 1, 2, 3, 4, 5 };
    //依次取数组中的所有数据赋值给别名e
    //自动判断结束,自动++往后面走
    //由于引用的使用,下面的for循环相当与将数组中所有元素的乘2

    for (auto& e : array)
        e *= 2;
    //依次输出数据2 4 6 8 10
    for (auto e : array)
        cout << e << " ";
}


二,nullptr的运用

        nullptr相当于C语言中的NULL,C++专门制定此关键字也是为了弥补C中NULL的不足。C语言中的NULL其实是一个宏,直接将其定义为0,但这样以来都会产生一些不避免的麻烦,因为在C++98标准规定中,0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0,而nullptr的使用完美的解决了这一问题,所以,在后序的置空运用中,我们需改用nullptr。


三,C++类的初步学习

        在讲解类之前我们先要明白C++与C基础区别。C语言是面向过程语言,关注的是过程,分析出求解问题的步骤,需要通过函数调用逐步解决问题,而C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成,我们平常设定的常量和变量就是对象。

3-1,类的引用

        C++中的类可认为C中的结构体,与之不同的是C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。需注意的是,在类中定义的函数默认是inline,但会不会当初内联函数,还需看编译器,跟inline的原理一样。

struct Stack {
    //变量的定义
    int* a;
    int top;
    int capacity;
    //函数的定义
    void StackPush(Stack* S, int x) {
        if (S->top == S->capacity - 1) {
            S->capacity = S->capacity == 0 ? 4 : S->capacity * 2;
            S->a = (int*)realloc(S->a, sizeof(int) * S->capacity);
        }
        S->a[++S->top] = x;
    }
    void StackPop(Stack* S) {
        if (S->top < 0) {
            return;
        }
        S->top--;
    }
};

        其中,C++兼容了C语言的几乎所有用法,同时,将结构体升级为类,类的类名就是类型,如上述代码中Stack就是一整个类型,只需在定义时加上struct,在运用时不需要加struct。如下:

int main() {
    //定义stack1和stack2两个类
    Stack stack1;
    Stack stack2;
    return 0;
}

        上面结构体的定义,在C++中常用class来代替,效果都是一样的。如将struct Stack{};换成class Stack{},class与struct之间也有不同之处,具体不同下面和以后的文章会详细讲解

3-2,类的访问权限

        类的权限是用于管理类是否可以被外部访问。C++用类将不同对象的属性与方法结合在一块,通过访问权限选择性的将其提供给外部的用户使用。类的权限类型和注意要素如下图:

        这里要注意的是class与struct的不同之处,不光是在权限上,在继承和模板参数列表位置,struct和class也有区别,本文只是初步介绍类,在此不作过多讲解,后面的文章将会详细介绍。

权限的运用代码;

struct Stack {
private://以下的变量对象设置私有权限,只能在类中使用
    int* a;
    int top;
    int capacity;
public://以下的函数定义设置为公有权限,可以在类Stack外部使用
    void StackPush(Stack* S, int x) {
        if (S->top == S->capacity - 1) {
            S->capacity = S->capacity == 0 ? 4 : S->capacity * 2;
            S->a = (int*)realloc(S->a, sizeof(int) * S->capacity);
        }
        S->a[++S->top] = x;
    }
    void StackPop(Stack* S) {
        if (S->top < 0) {
            return;
        }
        S->top--;
    }
};

3-3,类的使用
1,类中函数的定义

        C++的类中,由于函数都自带inline,所以常常将内部大的函数只声明,在外部定义,把内部小的函数直接定义,系统将自动识别为内联函数。当在外部定义类中的函数时,需要运用域的限定符"::",因为类其实是定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用"::"作用域操作符指明成员属于哪个类域。不光是类,只要运用了"{}"大括号,其实都是一个作用域。样例代码如下:

class Person
{
public:
    void Student(char* name1, char* gender1, int age1);
private:
    char name[20];
    char gender[3];
    int  age;
};
//这里需要指定Student是属于Person这个类域的函数实现
void Person::Student(char* name1, char* gender1, int age1)
{
    strcpy(name, name1);
    strcpy(gender,gender1);
    age = age1;
    //输出Person中的变量,因为此函数就是调用Person类中的函数,使用时可直接认为在类中使用
    cout << name << " " << gender << " " << age << endl;
}

2,类中对象的使用

        类中对象的使用跟类中函数定义不一样,之前说过,类如同C中结构体一般,当使用类时就相当于使用结构体,因此,用法也自然跟结构体一样,唯一要注意的是使用哪个对象时一定要把对象的权限设为public,即公有的。代码如下:

#include <iostream>
using namespace std;
class Person
{
public:
    void Student(char* name1, char* gender1, int age1);
    char name[20];
    char gender[3];
    int  age;
};
void Person::Student(char* name1, char* gender1, int age1)
{
    strcpy(name, name1);
    strcpy(gender,gender1);
    age = age1;
    cout << name << " " << gender << " " << age << endl;
}
int main() {

    //定义类a1
    Person a1;
    strcpy(a1.name, "张三");
    strcpy(a1.gender, "45");
    a1.age = 15;
    a1.Student(a1.name, a1.gender, a1.age);
    return 0;
}

3-4,类对象模型
1,类对象的存储方式

        类存储的规则是这样的,类中的变量是存储在类中,但类中的函数没有存储在类中,而是存放在专门的类成员函数表中。如图:

2,类的大小

        上面我们说过类的存储方式,那么一个类的大小,实际就是该类中”成员变量”之和,要注意的是内存对齐情况和空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。(内存对齐在之前C语言中结构体存储的那章博客上就有详细说明,在这里我们做简单的介绍,若有不明白的可观看本人之前的那章博客)。

内存对齐规则:

        1,第一个成员在与结构体偏移量为0的地址处。

        2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8。

        3,结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

        4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

演练代码如下:

#include <iostream>
using namespace std;
class Person
{
public:
    void Student(char* name1, char* gender1, int age1);
    char name[20];
    int  age;
    char gender[3];
};
class Person1
{};
int main() {
    Person a1;
    Person1 a2;
    cout << sizeof(a1) << endl;//输出28
    cout << sizeof(a2) << endl;//输出1
    return 0;
}

相关文章:

C++初阶2

目录 一&#xff0c;auto关键字 1-1&#xff0c;auto的使用 1-2&#xff0c;基于范围auto的for循环 二&#xff0c;nullptr的运用 三&#xff0c;C类的初步学习 3-1&#xff0c;类的引用 3-2&#xff0c;类的访问权限 3-3&#xff0c;类的使用 1&#xff0c;类中函数的…...

网络安全(黑客)—小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…...

在win10下,使用torchviz对深度学习网络模型进行可视化

目录 1. 安装 graphviz 和 torchviz 2.安装 graphviz.exe 3.实例测试 4.如果你的电脑还是无法画图&#xff0c;并且出现了下面的报错&#xff1a; 5.参考文章&#xff1a; 1. 安装 graphviz 和 torchviz 首先打开 Anaconda prompt 进入自己的 pytorch 环境(图中 pt 是我自…...

【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer

相关博客 【自然语言处理】【长文本处理】RMT&#xff1a;能处理长度超过一百万token的Transformer 【自然语言处理】【大模型】MPT模型结构源码解析(单机版) 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BLOOM模型结构源码解析(…...

交叉编译工具链(以STM32MP1为例)

1.什么是交叉编译工具链&#xff1f; 在一个系统上进行编译&#xff0c;在另一个系统上进行执行 2.STM32MP1交叉编译工具链 3.交叉编译器内容 4.两种工具链模式 5.两种链接模式 6.工具使用 注意&#xff1a;OpenSTLinux已经提供了编译框架&#xff0c;不需要命令行手工编译 …...

使用 Pyro 和 PyTorch 的贝叶斯神经网络

一、说明 构建图像分类器已成为新的“hello world”。还记得当你第一次接触 Python 时&#xff0c;你的打印“hello world”感觉很神奇吗&#xff1f;几个月前&#xff0c;当我按照PyTorch 官方教程并为自己构建了一个运行良好的简单分类器时&#xff0c;我也有同样的感觉。 我…...

How to install the console system of i-search rpa on Centos 7

How to install the console system of i-search rpa on Centos 7 1、 准备1.1 、查看磁盘分区状态1.2、上传文件1.2.1、添加上传目录1.2.2、上传安装包1.2.3、解压安装包1.2.4、查看安装包结构 1.3、安装依赖包1.3.1、基础依赖包1.3.2 相关依赖 1.4、关闭防火墙1.5、解除SeLin…...

sql--索引使用 ---覆盖索引

覆盖索引 Select 后接 * 走id索引才是最优&#xff0c;使用二级索引则需要回表&#xff08;性能稍差&#xff09; 前缀索引 Create index 索引名 on 表名( 字段名( n ) ) n数字 n代表提取这个字符串的n个构建索引 &#xff1f;&#xff1f;那么 n 为几性能是最好的呢&…...

系统平台同一网络下不同设备及进程的话题通讯--DDS数据分发服务中间件

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)中间件的介绍(2)DDS介绍(3)发布者(4)订阅者(5)idl文件(定义msg结构体)(6)QoS(Quality of Service)策略(7)DDS测试工具介绍(…...

轻量级 IDE 文本编辑器 Geany 发布 2.0

Geany 是功能强大、稳定、轻量的开发者专用文本编辑器&#xff0c;支持 Linux、Windows 和 macOS&#xff0c;内置支持 50 多种编程语言。 2005 年Geany 发布首个版本 0.1。上周四刚好是 Geany 诞生 18 周年纪念日&#xff0c;官方发布了 2.0 正式版以表庆祝。 下载地址&#…...

好用工具分享 | tmux 终端会话分离工具

目录 1 tmux的安装 2 tmux的基本操作 2.1 启动与退出 2.2 分离会话 2.3 查看会话 2.4 重接会话 2.5 杀死会话 2.6 切换会话 tmux是一个 terminal multiplexer&#xff08;终端复用器&#xff09;&#xff0c;它可以启动一系列终端会话。 我们使用命令行时&#xff0c;…...

计算机网络重点概念整理-第三章 数据链路层【期末复习|考研复习】

计算机网络复习系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言三、数据链路层3.1 数据链路层的基础概念3.2 帧3.2.1 帧的概念3.2…...

迅速的更改conda 环境的名称!

快速的做法是&#xff0c;复制之前创建的环境 重新命名 然后再删除旧的环境即可&#xff01;&#xff01;&#xff01; 因为之前已经装过环境了&#xff0c;只是名字不叫A而是B&#xff0c;所以现在把B(old_name)改成A(new_name)。 具体方法如下&#xff1a; 1. 复制出来一份…...

基本微信小程序的外卖点餐订餐平台

项目介绍 餐饮行业是一个传统的行业。根据当前发展现状&#xff0c;网络信息时代的全面普及&#xff0c;餐饮行业也在发生着变化&#xff0c;单就点餐这一方面&#xff0c;利用手机点单正在逐步进入人们的生活。传统的点餐方式&#xff0c;不仅会耗费大量的人力、时间&#xf…...

十大排序算法(C语言)

参考文献 https://zhuanlan.zhihu.com/p/449501682 https://blog.csdn.net/mwj327720862/article/details/80498455?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169837129516800222848165%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&…...

iTransformer: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING

#论文题目&#xff1a;ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING #论文地址&#xff1a;https://arxiv.org/abs/2310.06625 #论文源码开源地址&#xff1a;https://github.com/thuml/Time-Series-Library #论文所属会议&#xff1a;Mach…...

QT C++ AES字符串加密实现

使用方法&#xff1a;在.h中引入类库。然后在cpp中直接引入使用即可 类库的下载地址https://download.csdn.net/download/u012372365/88478671 具体代码&#xff1a; #include <QCoreApplication> #include <QTest> #ifdef __cplusplus #include "unit_tes…...

关于mysql json字段创建索引

前言&#xff1a; 创建索引的方式分为两种&#xff0c;CREATE index 和 ALTER TABLE&#xff1b; 被创建索引的关键字类型又分两种&#xff0c;数字&#xff08;UNSIGNED&#xff09;和字符串&#xff08;char(128)&#xff09; 一、给json对象属性param_value&#xff08;假…...

“探索Linux世界:从CentOS安装到常见命令使用“

目录 引言一、安装CentOS二、Linux的常见命令文件夹和目录操作命令文件编辑命令vi或vim编辑器命令模式编辑模式末行模式 总结 引言 在计算机领域&#xff0c;Linux作为一种强大而灵活的操作系统&#xff0c;在服务器、嵌入式设备和个人电脑等领域广泛应用。本文将引导您了解并…...

SVN出现Cleanup failed to process the following paths...

SVN报错&#xff0c;需要执行SVN的清理命令clean up&#xff0c;但clean up时出现错误Cleanup failed to process the following paths... 解决办法&#xff1a; 1、clean up的窗口&#xff0c;勾选Break locks和Fix time stamps&#xff08;简单方便&#xff09;&#xff1b…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization&#xff08;RMSNorm&#xff09; 二、激活函数 1. Sigmoid激活函数&#xff08;二分类&…...

后端下载限速(redis记录实时并发,bucket4j动态限速)

✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制&#xff08;动态&#xff09;✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 &#x1f9e9; 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...