第一弹:C++ 的基本知识概述

文章目录

  • 知识点 1:C++ 的概述
    • 1. C++的特征
    • 2. C++ 程序的编辑、编译和执行
    • 3. 第一个 C++ 源程序
    • 4. 面向对象程序设计思想
      • 4.1 面向对象程序设计思想初始
      • 4.2 面向对象程序设计思想的核心
  • 知识点 2:C++ 对 C 的扩展
    • 1. 作用域访问运算符 `::`
      • 1.1 全局变量和局部变量
      • 1.2 作用域为类域或名称空间域
    • 2. 名称空间域
      • 2.1 创建命名空间
      • 2.2 名称空间域成员访问
      • 2.3 多文件命名空间创建
  • 知识点 3:语法增强
    • 1. 数据类型增强
  • 知识点 4:函数重载和默认参数
    • 1. 函数重载
    • 2. 默认参数
  • 知识点 5:内存管理
    • 2. `new` 和 `malloc` 的区别
  • 知识点 6:函数的占位参数
  • 知识点 7:内联函数
    • 1. 内联函数的定义
    • 2. 内联函数的编译规则
    • 3. 内联函数和普通函数的区别
  • 知识点 8:C++中的输入输出
    • 1. 继承 C 语言中的输入输出
    • 2. C++ 新增标准输入输出
  • 知识点 9:字符串类
  • 知识点 10:C++ 内存管理
    • 1. C 语言中的内存管理方式
    • 2. C++ 内存管理
  • 知识点 11:函数返回值为引用
  • 知识点 12:引用与指针的区别


知识点 1:C++ 的概述

1. C++的特征

C++ 是对 C 的扩展,语言在 C 语言的基础上添加了面向对象编程和泛型编程的支持。

  1. C++ 继承 C 语言的思想:具备 C 语言面向过程的思想,语言高效、简洁,具有可移植性。
  2. C++ 具备面向对象程序设计思想
  3. 模板支持的泛型编程

2. C++ 程序的编辑、编译和执行

由于 C++ 继承了 C 语言的特性,C 语言程序可以作为 C++ 程序。在 Linux 系统中,GNU 工具中提供了 C++ 编译器 g++,整个程序的编译过程依然分为 4 个阶段:

  • 整体编译g++ 源程序文件 可以使用 -o 指定输出可执行文件名称,如果未指定则默认生成可执行文件 a.out
  1. 预处理阶段:实现预处理指令的执行,头文件的展开、宏定义的替换、语句的选择编译。

    g++ -E hello.c -o hello.i
    
  2. 编译阶段:实现预处理后程序语法的检测,并生成汇编指令。

    g++ -S hello.i -o hello.s
    
  3. 汇编阶段:将汇编指令翻译为二进制机器指令。

    g++ -C hello.s -o hello.o
    
  4. 链接阶段:将程序中所有的 .o 文件进行链接、依赖库链接和启动程序连接。

    g++ hello.o -o hello
    

3. 第一个 C++ 源程序

#include <iostream>    /* 添加头文件:标准库头文件(提供标准输入输出流) */
using namespace std;    /* 名称空间声明 */int main()
{cout << "hello world" << endl;  /* 标准输出流和换行 */return 0;
}
  1. C++ 源程序后缀:可以使用 .c.cxx.cpp,一般情况将源程序文件后缀设置为 .cpp,可移植性更好。
  2. 头文件的包含#include <iostream>
  3. namespace:用于避免同一个程序中的多个同名变量和函数的访问冲突。
  4. cout 和 endlcout 是标准输出流,定义在 std 命名空间中;endl 是换行标识,同时刷新缓冲区。

4. 面向对象程序设计思想

4.1 面向对象程序设计思想初始

  1. 面向过程程序设计思想:以解决问题的思路为步骤,按照步骤先后顺序依次执行逐一解决问题的过程。核心是功能分解,自顶向下,逐层细化(程序 = 数据结构 + 算法)。
  2. 面向对象程序设计思想:即 OOP 技术。任何类对象都具有一定的属性和操作行为,属性抽象为数据类型变量,行为抽象为函数及其算法。对象 = 数据结构 + 算法;程序 = 对象 + 对象 + ……

4.2 面向对象程序设计思想的核心

  1. 封装:将对象的属性抽象为数据类型的成员变量,对象的行为抽象为成员函数,并使用访问权限修饰符封装。
  2. 继承:表示类与类之间的关系,新构造类对象继承原有类对象的属性和行为,有效实现代码重用,避免冗余。
  3. 多态:一个接口,多种方法,在程序运行过程中决定接口的具体行为。

知识点 2:C++ 对 C 的扩展

1. 作用域访问运算符 ::

C++ 增加了作用域访问运算符 ::,可修饰函数和变量的作用域,实现对不同作用域下同名成员变量和函数的访问。语法格式:

作用域::函数和变量符号
  • 作用域可以是全局作用域、局部作用域、命名空间域和类域。
  • 函数和变量符号可以是 C 函数和变量、类成员函数和变量以及命名空间域成员函数和变量。

1.1 全局变量和局部变量

当作用域和作用域运算符省略时,模块内定义的局部变量覆盖全局变量。

#include <stdio.h>int a = 1;    /* 定义全局变量 */int main()
{int a = 3;  /* 局部变量覆盖全局变量 */printf("a = %d\n", a); printf("::a = %d\n", ::a);  /* 访问全局变量 */
}

1.2 作用域为类域或名称空间域

#include <stdio.h>int a = 1;namespace myspace {int a = 4;  /* 变量 a 的作用域为 myspace 命名空间 */
}int main()
{int a = 3;printf("a = %d\n", a); printf("::a = %d\n", ::a);  /* 访问全局变量 */printf("myspace::a = %d\n", myspace::a);  /* 访问 myspace 中的变量 */
}

2. 名称空间域

将符号常量、变量、函数、结构体、枚举等数据量使用关键字 namespace 的名称空间域进行封装,解决程序中同名导致的访问冲突问题。

2.1 创建命名空间

  1. 有名命名空间
namespace myspace {int a = 5;void show() {printf("myspace -> a = %d\n", a);}
}
  1. 无名命名空间:无名命名空间中的成员只能在当前文件中访问,相当于使用 static 修饰。
namespace {int a = 4;int b = 5;
}

2.2 名称空间域成员访问

通过作用域访问运算符访问或声明命名空间后直接访问。

std::cout << "namespace" << std::endl;  /* 访问 std 名称空间域中的 cout 和 endl */
using namespace std;  /* 声明名称空间域 */
cout << "namespace" << endl;  /* 已声明的符号可直接访问 */

2.3 多文件命名空间创建

在实际应用中,可能多个文件中的成员属于同一个名称空间域。注意以下几点:

  1. 头文件中不能定义变量和函数,只能声明
  2. 名称空间域中的变量只能在源文件中定义,作用域仅限于该文件
namespace myspace {void test(void);  /* 在头文件中声明 */
}

知识点 3:语法增强

1. 数据类型增强

C++ 提供了更严格的类型检查和更丰富的数据类型支持,例如 bool 类型。

bool flag = true;  /* 在 C++ 中直接支持 bool 类型 */

知识点 4:函数重载和默认参数

1. 函数重载

C++ 支持同名但参数不同的函数,这称为函数重载。不同函数根据参数类型、数量或顺序进行区分。

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

2. 默认参数

在函数声明时,可以为形参设置默认值,调用函数时如果没有传递实参,则使用默认值。

void printVal(int a = 0, int b = 0) {printf("a = %d, b = %d\n", a, b);
}

知识点 5:内存管理

C++ 提供了 newdelete 操作符来管理动态内存分配和释放,与 C 语言中的 mallocfree 相对。与 C 语言不同,new 自动推导分配空间的大小,并在失败时抛出异常。

int *p = new int;  /* 动态分配单个 int 类型元素存储空间 */
delete p;  /* 释放动态分配的内存 */

2. newmalloc 的区别

在 C++ 中,newmalloc 都用于动态内存管理,但它们之间有一些重要区别:

  1. 属性不同

    • newdelete 是 C++ 的运算符,由编译器支持;可以重载。
    • mallocfree 是 C 语言的库函数,需要包含头文件 <stdlib.h>;无法重载。
  2. 使用方式不同

    • malloc 动态开辟内存时,需要显示指定申请的内存大小,并返回 void* 类型指针,通常需要进行类型转换。
      int *malloc_p = (int *)malloc(4);  /* 开辟 4 字节的空间 */
      free(malloc_p);
      
    • new 动态开辟内存时,自动分配适合数据类型大小的内存,并返回相应类型的指针。
      int *new_p = new int;  /* 根据 int 类型分配内存 */
      delete new_p;
      
  3. 存储内存位置不同

    • malloc 所申请的内存一定位于堆区。
    • new 的内存空间称为自由存储区,默认使用堆区实现自由存储区。自由存储区是 C++ 动态内存分配和释放的概念,实际存储位置由 new 实现决定。
  4. 返回类型不同

    • malloc 返回 void*,需要进行强制类型转换。
    • new 返回指定类型的指针,无需强制类型转换。
  5. 分配失败处理

    • malloc 失败时返回 NULL,需要手动检查是否为空。
    • new 失败时抛出 bad_alloc 异常。
  6. 构造与析构

    • malloc 仅分配内存,不调用构造函数,需要手动初始化对象。
    • new 会自动调用对象的构造函数,delete 会自动调用析构函数。
  7. 内存扩展

    • malloc 可以使用 realloc 来扩展已经分配的内存。
    • new 没有内存扩展机制,必须重新分配内存并手动迁移数据。

知识点 6:函数的占位参数

所谓的函数占位参数,指的是在函数定义时,形参列表中有些参数只定义了数据类型而没有定义形参变量名,这些参数仅用于占位。例如:

void func(int a, int = 3)  /* 第二个参数是占位参数,默认值为 3 */
{printf("a = %d\n", a);
}

占位参数可用于区分前置和后置递增/递减运算符的重载。


知识点 7:内联函数

1. 内联函数的定义

内联函数类似于 C 语言中的宏定义。内联函数通过在函数前加上 inline 关键字来声明,编译器将尽量将其替换为内联代码,减少函数调用的开销。

inline int func(int a) {return a++;
}

类中的成员函数如果定义在类的内部,默认会被视为内联函数。

class Demo {
public:int func(int a) {return a++;  /* 类内部的函数自动为内联函数 */}
};

2. 内联函数的编译规则

虽然 inline 是建议编译器将函数作为内联处理,但编译器根据以下规则决定是否真正将函数内联:

  1. 函数体不能包含任何形式的循环语句。
  2. 函数体不能有过多的条件判断语句。
  3. 函数体不能过于庞大。
  4. 不能对函数进行取址操作。

3. 内联函数和普通函数的区别

  1. 占用更多存储空间:内联函数在编译时将函数体替换到调用点,因此会占用更多的代码空间。
  2. 提高执行效率:内联函数省去了函数调用时的压栈、跳转及返回操作,从而提升执行效率。内联函数本质上是通过“以空间换时间”来提高性能。

知识点 8:C++中的输入输出

1. 继承 C 语言中的输入输出

C++ 继承了 C 语言的输入输出机制,可以直接使用标准 C 库中的 printfscanf 等函数实现输入输出。

2. C++ 新增标准输入输出

  • 标准输出流 std::cout
    C++ 提供了 std::cout 作为标准输出流,通过 << 重定向运算符实现输出。

    std::cout << "Hello, World!" << std::endl;  /* 输出字符串并换行 */
    

    注意:

    1. 多个数据输出时,可以使用多个 << 进行链接。
    2. 数据可以是变量或常量。
    3. std::endl 是换行符,等价于 C 语言中的 \n,同时会刷新缓冲区。
  • 标准输入流 std::cin
    std::cin 作为标准输入流,通过 >> 运算符实现数据输入。

    int a;
    std::cin >> a;  /* 从标准输入读取数据赋值给变量 a */
    

知识点 9:字符串类

在 C++ 中,字符串可以通过字符数组存储,也可以使用 C++ 标准库中的 std::string 类来处理。

  1. C 风格字符串:仍然可以使用 C 语言的字符数组存储字符串。
  2. std::string:C++ 中新增的字符串类提供了更多方便的操作方法和运算符重载,如 + 进行字符串连接,[] 访问字符等。
  • +:用于连接两个字符串。
  • =:用于赋值操作,相当于 C 语言中的 strcpy
  • +=:在原有字符串后追加新字符串,相当于 C 语言中的 strcat

知识点 10:C++ 内存管理

1. C 语言中的内存管理方式

C 语言中的内存管理包括静态分配和动态分配:

  1. 静态分配:全局变量、局部变量、常量的存储位置和生命周期是由编译器管理的。
  2. 动态分配:使用 malloccallocrealloc 函数动态分配内存,在使用完毕后需要调用 free 释放内存。
void *malloc(size_t size);
void free(void *ptr);

2. C++ 内存管理

C++ 继承了 C 语言的内存管理方式,同时新增了使用 newdelete 运算符进行动态内存管理:

  1. 使用 newdelete

    • new 动态分配内存,delete 释放内存。
    • new 自动调用对象的构造函数,delete 自动调用析构函数。
    int *p = new int;  /* 分配单个 int 类型的空间 */
    delete p;  /* 释放内存 */
    
  2. new 和 malloc 的区别:如前面章节中详细介绍。


知识点 11:函数返回值为引用

在 C++ 中,函数可以返回引用类型。这允许函数返回一个对现有变量的引用,而不是一个新的值。

int& getValue() {static int a = 10;return a;  /* 返回静态变量的引用 */
}
  • 引用返回值的优点:可以避免不必要的内存拷贝,提高程序效率。
  • 注意事项:返回的引用变量必须是静态的或全局的,不能是局部变量,否则会出现非法访问。

知识点 12:引用与指针的区别

引用和指针在 C++ 中有相似的作用,但它们有明显的区别:

  1. 引用是别名,不占用额外的存储空间,定义时必须初始化且不能更改引用的对象。
  2. 指针是一个存储地址的变量,可以为空(NULL),且可以在运行时指向不同的对象。
  3. 访问方式:引用通过变量名直接访问,而指针需要通过 * 运算符进行解引用。
int a = 10;
int &ref = a;  /* 引用 */
int *ptr = &a;  /* 指针 */

到此为止,我们

完整覆盖了最初的 C++ 知识点内容。

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

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

相关文章

若无向图G(V,E)中含7个顶点,为保证图G在任何情况下都是连通的,则需要的边数最少是多少?

这乍一看是不是可抽象&#xff08;迷糊&#xff09;了&#xff0c;butttt待我小翻译一下。 先举少一点的例子&#xff0c;假如我们有三个点&#xff0c;我给你两条边&#xff0c;那是不是不管咋连都一定一定是连通的。 那我们再进一步&#xff0c;假如四个点呢&#xff1f;我给…

RabbitMQ 界面管理说明

1.RabbitMQ界面访问端口和后端代码连接端口不一样 界面端口是15672 http://localhost:15672/ 后端端口是 5672 默认账户密码登录 guest 2.总览图 3.RabbitMq数据存储位置 4.队列 4.客户端消费者连接状态 5.队列运行状态 6.整体运行状态

在Linux中将设备驱动的地址映射到用户空间

本期主题&#xff1a; MMU的简单介绍&#xff0c;以及如何实现设备地址映射到用户空间 往期链接&#xff1a; Linux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析Linux下如何操作寄存器&#xff08;用户空间、内核空间方法讲解&#xff09;…

Redis篇(最佳实践)(持续更新迭代)

介绍一&#xff1a;键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如&#xff1a; 我们的登录业务&#xff0…

『功能项目』宠物的攻击巨型化【80】

本章项目成果展示 我们打开上一篇79宠物的召唤跟随的项目&#xff0c; 本章要做的事情是实现在战斗中有几率触发宠物巨型化攻击将怪物击飞的效果 首先在主角预制体中增加隐藏的宠物巨型化 制作巨型化宠物的攻击效果 将该动画控制器放置在隐藏的巨型化宠物的动画控制器上 首先查…

Linux下的基本指令/命令(一)

目录 基本命令 1. Is命令/指令: 罗列当前目录下指定的文件或者目录. 2. pwd命令&#xff1a; 查看当前工作的路径 3. cd命令&#xff1a; 切换到指定路径下。 只能切换到目录中 4. tree命令: 树状显式目录 使用前要输入命令 yum install -y tree &#xff0c;用来安装一个…

基于Hive和Hadoop的哔哩哔哩网站分析系统

本项目是一个基于大数据技术的哔哩哔哩平台分析系统&#xff0c;旨在为用户提供全面的哔哩哔哩视频数据和深入的用户行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xf…

数据流处理技术与Flink框架

一数据流 数据流定义&#xff1a; 数据流&#xff08;Data Stream&#xff09;是指数据以连续不断的方式到达和处理的序列。在现实世界中&#xff0c;许多数据来源都是以流的形式存在&#xff0c;比如&#xff1a; 1. 用户行为&#xff1a;用户在网站上的点击流、移动应用中…

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录/etc/systemd/system、/lib/systemd/system 以及/usr/lib/systemd/system 等&#xff0c;这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介绍 目录/lib/systemd/s…

使用C#,MSSQL开发的钢结构加工系统

很久以前的项目&#xff0c;上位机使用C#开发。数据库使用mssql。控制系统选用了三菱PLC&#xff0c;上位机和PLC之间走ModbusTCP通讯协议。 主要功能&#xff1a;读取加工文件&#xff08;csv格式&#xff09;&#xff0c;导入到数据库&#xff0c;并根据机床刀具规则&#x…

Python编码系列—Python命令模式:将请求封装为对象

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【软件测试】详解软件测试中的测试级别

目录 一、测试级别二、组件测试三、开发者测试3.1测试与调试3.2 组件测试目标3.3 测试功能 四、稳健性测试4.1 效率的测试4.2 测试可维护性4.3 测试策略4.4 白盒测试 一、测试级别 软件系统通常是由许多子系统组成的&#xff0c;而这些子系统又是由多个组件组成的&#xff0c;…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-operations-for-logs/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 集中式日志管理 VMware Aria …

C#测试调用FreeSpire.PDFViewer浏览PDF文件

Free Spire.PDFViewer是商业版Spire.PDFViewer的社区版本&#xff0c;支持以控件形式打开并查看PDf文件&#xff0c;但由于是免费版本&#xff0c;存在使用限制&#xff0c;打开的PDF文档只显示前10页内容。如果日常操作的pdf文件都不超过10页&#xff0c;可以考虑使用Free Spi…

Redis: Sorted Set 底层算法的简单分析

概述 我们先看下 Shorted Set 有序集合的内部数据结构所谓有序集合&#xff0c;比如有个容器&#xff0c;容器里边都已经排好序了&#xff0c;那无非就是快速的查找和插入不管你是查找还是插入&#xff0c;肯定要确定那个位置最简单的办法就是从最开头开始&#xff0c;挨个比较…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

无源码实现免登录功能

因项目要求需要对一个没有源代码的老旧系统实现免登录功能&#xff0c;系统采用前后端分离的方式部署&#xff0c;登录时前端调用后台的认证接口&#xff0c;认证接口返回token信息&#xff0c;然后将token以json的方式存储到cookie中&#xff0c;格式如下&#xff1a; 这里有…

HTTPS加密流程

本文尽量用最小的篇幅来介绍HTTPS的加密过程&#xff0c;如果还看不懂可以参考文末尾的文章。 加密算法 先简单介绍一下HTTPS中使用的是混合加密算法&#xff0c;即对称加密和非对称加密的混合使用&#xff1a; 1.对称加密:顾名思义就是加密和解密都是使用同一个密钥。 优点…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中

DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统

1、项目功能演示 DC00025【含文档】基于springboot短视频推荐管理系统协同过滤算法视频推荐系统javaweb开发程序设计vue 2、项目功能描述 短视频推荐系统分为用户和系统管理员两个角色 2.1 用户角色 1、用户登录、用户注册 2、视频中心&#xff1a;信息查看、视频收藏、点赞、…