第一弹: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 语言的基础上添加了面向对象编程和泛型编程的支持。
- C++ 继承 C 语言的思想:具备 C 语言面向过程的思想,语言高效、简洁,具有可移植性。
- C++ 具备面向对象程序设计思想。
- 模板支持的泛型编程。
2. C++ 程序的编辑、编译和执行
由于 C++ 继承了 C 语言的特性,C 语言程序可以作为 C++ 程序。在 Linux 系统中,GNU 工具中提供了 C++ 编译器 g++,整个程序的编译过程依然分为 4 个阶段:
- 整体编译:g++ 源程序文件可以使用-o指定输出可执行文件名称,如果未指定则默认生成可执行文件a.out。
-  预处理阶段:实现预处理指令的执行,头文件的展开、宏定义的替换、语句的选择编译。 g++ -E hello.c -o hello.i
-  编译阶段:实现预处理后程序语法的检测,并生成汇编指令。 g++ -S hello.i -o hello.s
-  汇编阶段:将汇编指令翻译为二进制机器指令。 g++ -C hello.s -o hello.o
-  链接阶段:将程序中所有的 .o文件进行链接、依赖库链接和启动程序连接。g++ hello.o -o hello
3. 第一个 C++ 源程序
#include <iostream>    /* 添加头文件:标准库头文件(提供标准输入输出流) */
using namespace std;    /* 名称空间声明 */int main()
{cout << "hello world" << endl;  /* 标准输出流和换行 */return 0;
}
- C++ 源程序后缀:可以使用 .c、.cxx、.cpp,一般情况将源程序文件后缀设置为.cpp,可移植性更好。
- 头文件的包含:#include <iostream>。
- namespace:用于避免同一个程序中的多个同名变量和函数的访问冲突。
- cout 和 endl:cout是标准输出流,定义在std命名空间中;endl是换行标识,同时刷新缓冲区。
4. 面向对象程序设计思想
4.1 面向对象程序设计思想初始
- 面向过程程序设计思想:以解决问题的思路为步骤,按照步骤先后顺序依次执行逐一解决问题的过程。核心是功能分解,自顶向下,逐层细化(程序 = 数据结构 + 算法)。
- 面向对象程序设计思想:即 OOP 技术。任何类对象都具有一定的属性和操作行为,属性抽象为数据类型变量,行为抽象为函数及其算法。对象 = 数据结构 + 算法;程序 = 对象 + 对象 + ……
4.2 面向对象程序设计思想的核心
- 封装:将对象的属性抽象为数据类型的成员变量,对象的行为抽象为成员函数,并使用访问权限修饰符封装。
- 继承:表示类与类之间的关系,新构造类对象继承原有类对象的属性和行为,有效实现代码重用,避免冗余。
- 多态:一个接口,多种方法,在程序运行过程中决定接口的具体行为。
知识点 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 创建命名空间
- 有名命名空间:
namespace myspace {int a = 5;void show() {printf("myspace -> a = %d\n", a);}
}
- 无名命名空间:无名命名空间中的成员只能在当前文件中访问,相当于使用 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 多文件命名空间创建
在实际应用中,可能多个文件中的成员属于同一个名称空间域。注意以下几点:
- 头文件中不能定义变量和函数,只能声明。
- 名称空间域中的变量只能在源文件中定义,作用域仅限于该文件。
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++ 提供了 new 和 delete 操作符来管理动态内存分配和释放,与 C 语言中的 malloc 和 free 相对。与 C 语言不同,new 自动推导分配空间的大小,并在失败时抛出异常。
int *p = new int;  /* 动态分配单个 int 类型元素存储空间 */
delete p;  /* 释放动态分配的内存 */
2. new 和 malloc 的区别
 
在 C++ 中,new 和 malloc 都用于动态内存管理,但它们之间有一些重要区别:
-  属性不同: - new和- delete是 C++ 的运算符,由编译器支持;可以重载。
- malloc和- free是 C 语言的库函数,需要包含头文件- <stdlib.h>;无法重载。
 
-  使用方式不同: - malloc动态开辟内存时,需要显示指定申请的内存大小,并返回- void*类型指针,通常需要进行类型转换。- int *malloc_p = (int *)malloc(4); /* 开辟 4 字节的空间 */ free(malloc_p);
- new动态开辟内存时,自动分配适合数据类型大小的内存,并返回相应类型的指针。- int *new_p = new int; /* 根据 int 类型分配内存 */ delete new_p;
 
-  存储内存位置不同: - malloc所申请的内存一定位于堆区。
- new的内存空间称为自由存储区,默认使用堆区实现自由存储区。自由存储区是 C++ 动态内存分配和释放的概念,实际存储位置由- new实现决定。
 
-  返回类型不同: - malloc返回- void*,需要进行强制类型转换。
- new返回指定类型的指针,无需强制类型转换。
 
-  分配失败处理: - malloc失败时返回- NULL,需要手动检查是否为空。
- new失败时抛出- bad_alloc异常。
 
-  构造与析构: - malloc仅分配内存,不调用构造函数,需要手动初始化对象。
- new会自动调用对象的构造函数,- delete会自动调用析构函数。
 
-  内存扩展: - 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 是建议编译器将函数作为内联处理,但编译器根据以下规则决定是否真正将函数内联:
- 函数体不能包含任何形式的循环语句。
- 函数体不能有过多的条件判断语句。
- 函数体不能过于庞大。
- 不能对函数进行取址操作。
3. 内联函数和普通函数的区别
- 占用更多存储空间:内联函数在编译时将函数体替换到调用点,因此会占用更多的代码空间。
- 提高执行效率:内联函数省去了函数调用时的压栈、跳转及返回操作,从而提升执行效率。内联函数本质上是通过“以空间换时间”来提高性能。
知识点 8:C++中的输入输出
1. 继承 C 语言中的输入输出
C++ 继承了 C 语言的输入输出机制,可以直接使用标准 C 库中的 printf、scanf 等函数实现输入输出。
2. C++ 新增标准输入输出
-  标准输出流 std::cout:
 C++ 提供了std::cout作为标准输出流,通过<<重定向运算符实现输出。std::cout << "Hello, World!" << std::endl; /* 输出字符串并换行 */注意: - 多个数据输出时,可以使用多个 <<进行链接。
- 数据可以是变量或常量。
- std::endl是换行符,等价于 C 语言中的- \n,同时会刷新缓冲区。
 
- 多个数据输出时,可以使用多个 
-  标准输入流 std::cin:
 std::cin作为标准输入流,通过>>运算符实现数据输入。int a; std::cin >> a; /* 从标准输入读取数据赋值给变量 a */
知识点 9:字符串类
在 C++ 中,字符串可以通过字符数组存储,也可以使用 C++ 标准库中的 std::string 类来处理。
- C 风格字符串:仍然可以使用 C 语言的字符数组存储字符串。
- std::string类:C++ 中新增的字符串类提供了更多方便的操作方法和运算符重载,如- +进行字符串连接,- []访问字符等。
- +:用于连接两个字符串。
- =:用于赋值操作,相当于 C 语言中的- strcpy。
- +=:在原有字符串后追加新字符串,相当于 C 语言中的- strcat。
知识点 10:C++ 内存管理
1. C 语言中的内存管理方式
C 语言中的内存管理包括静态分配和动态分配:
- 静态分配:全局变量、局部变量、常量的存储位置和生命周期是由编译器管理的。
- 动态分配:使用 malloc、calloc、realloc函数动态分配内存,在使用完毕后需要调用free释放内存。
void *malloc(size_t size);
void free(void *ptr);
2. C++ 内存管理
C++ 继承了 C 语言的内存管理方式,同时新增了使用 new 和 delete 运算符进行动态内存管理:
-  使用 new和delete:- new动态分配内存,- delete释放内存。
- new自动调用对象的构造函数,- delete自动调用析构函数。
 int *p = new int; /* 分配单个 int 类型的空间 */ delete p; /* 释放内存 */
-  new 和 malloc 的区别:如前面章节中详细介绍。 
知识点 11:函数返回值为引用
在 C++ 中,函数可以返回引用类型。这允许函数返回一个对现有变量的引用,而不是一个新的值。
int& getValue() {static int a = 10;return a;  /* 返回静态变量的引用 */
}
- 引用返回值的优点:可以避免不必要的内存拷贝,提高程序效率。
- 注意事项:返回的引用变量必须是静态的或全局的,不能是局部变量,否则会出现非法访问。
知识点 12:引用与指针的区别
引用和指针在 C++ 中有相似的作用,但它们有明显的区别:
- 引用是别名,不占用额外的存储空间,定义时必须初始化且不能更改引用的对象。
- 指针是一个存储地址的变量,可以为空(NULL),且可以在运行时指向不同的对象。
- 访问方式:引用通过变量名直接访问,而指针需要通过 *运算符进行解引用。
int a = 10;
int &ref = a;  /* 引用 */
int *ptr = &a;  /* 指针 */
到此为止,我们
完整覆盖了最初的 C++ 知识点内容。
相关文章:
第一弹:C++ 的基本知识概述
文章目录 知识点 1:C 的概述1. C的特征2. C 程序的编辑、编译和执行3. 第一个 C 源程序4. 面向对象程序设计思想4.1 面向对象程序设计思想初始4.2 面向对象程序设计思想的核心 知识点 2:C 对 C 的扩展1. 作用域访问运算符 ::1.1 全局变量和局部变量1.2 作…...
 
在职场,没人告诉你的人情世故
职场中,想要过得游刃有余,就必须懂一些人情世故和处事原则。今天,给大家分享个人认为非常重要的5点人情世故,希望能帮你在职场里少吃点亏、多份从容。 01 不要空口道谢 在职场中,别人帮了你,口头道谢是基…...
 
激光切割机适用材质有哪些
激光切割机是一种利用激光束对各种材料进行高精度、高速度切割的机器设备。其适用材质广泛,包括但不限于以下两大类: 一、金属材料 不锈钢:激光切割机较容易切割不锈钢薄板,使用高功率YAG激光切割系统,切割不锈钢板的…...
 
C#自定义工具类-数组工具类
目录 数组工具类基本操作 1.排序:升序,降序 2.查找 1)查找最值:最大值,最小值 2)查找满足条件的单个对象 3)查找满足条件的所有对象 4)选取数组中所有对象的某一字段 完整代…...
 
18年408数据结构
第一题: 解析:这道题很简单,按部就班的做就可以了。 画出S1,S2两个栈的情况: 第一轮: S1: S2: 2 3 - 8 * 5 从S1中依次弹…...
 
Android 通过自定义注解实现Activity间跳转时登录路由的自动拦截
应用场景 在Android 中部分软件需要登录才能使用,但是有的页面又不需要登录,Android不同于Web可以直接拦截重定向路由,因此如果在Android中如果需要检测是否登录,如果没登录跳转登录的话就需要再每个页面中判断,当然也…...
安全开发指南
1. 准备工作与培训 安全文化与意识:建立并强化组织的安全文化,对所有成员进行安全意识培训。安全策略与标准:制定明确的安全开发策略、标准和流程,包括代码审查、安全测试、事件响应等。工具与技术选择:选择合适的开发…...
 
【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白
【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前:脚注位于左下角,但右栏与左栏内容对其,未填充右下角的空白区域 解决方法 备份源文件复制脚注内…...
 
ROS学习笔记(三):VSCode集成开发环境快速安装,以及常用扩展插件配置
文章目录 前言VSCode集成开发环境1 安装VSCode2 VSCode扩展插件2.1 VSCode扩展插件模块介绍2.1 常用扩展插件配置一、语言支持类插件二、智能辅助类插件三、科学计算与数据分析类插件四、ROS开发相关插件 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装,可以看这几…...
 
论文精读--Two-Stream Convolutional Networks for Action Recognition in Videos
对于单张图片,丢进卷积和全连接层直接得出分类结果就行 但对于视频,早期的一些工作把视频中的一些关键帧抽取出来,把一个个帧通过网络,最后把结果合并,或者把帧叠起来,一起丢进网络。在网络中进行early fu…...
 
JAVA姓氏头像情侣头像家庭头像签名头像谐音顽埂头像设计小程序头像大全系统小程序源码
姓氏头像到谐音梗,打造你的专属头像大全系统 🎨✨ 👨👩👧👦 家庭头像:记录温馨瞬间 在这个充满爱的时代,用一张家庭头像来记录你和家人的美好瞬间吧!我们的“姓氏…...
 
UE5.4.3 Replay 重播回放系统
工程的配置文件DefaultEngine.ini中需要加入 +NetDriverDefinitions=(DefName=“DemoNetDriver”,DriverClassName=“/Script/Engine.DemoNetDriver”,DriverClassNameFallback=“/Script/Engine.DemoNetDriver”) 此步骤将启用并加载DemoNetDriver .ini添加示例 [/Script/En…...
 
深入掌握 Protobuf 与 RPC 的高效结合:实现C++工程中的高效通信
目录 一、Protobuf与RPC框架的通信流程概述二、Protobuf与RPC在C中的实际应用2.1 定义 .proto 文件2.2 编译 .proto 文件生成C代码2.3 实现服务器端逻辑2.4 实现客户端逻辑2.5 使用CMake构建工程2.6 编译与运行2.7 关键组件解析2.8 序列化与反序列化的实现 三、关键实现与解析四…...
 
录屏软件大比拼:四款必备工具助你轻松录制精彩瞬间!
哎呀,说到电脑录屏这事儿,我这个办公室小文员可是深有体会啊!平时工作里,经常需要录个会议啊、做个教程啊,或者分享个操作技巧给同事们看。市面上的录屏软件多得数不清,但我最常用的几款工具。今天就来跟大…...
 
计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
目录 1.课题背景 2.课题意义  3.技术介绍 4.技术性需求 4.1后端服务: 4.2 前端展示 5.数据库设计: 6.系统性能: 7.安全性: 8. 功能介绍: 9. 部分代码 1.课题背景 近年来,随着宠物饲养数量…...
 
用示波器测动态滞回线
大学物理(下)实验-中南民族大学通信工程2022级 手动逐个处理数据较为麻烦且还要绘图,故想到用pythonmatplotlib来计算结果并数据可视化。 代码实现 import matplotlib.pyplot as plt# 样品一磁化曲线 X [0, 0.2, 0.4, 0.6, 0.8, 1, 1.5, 2.…...
 
【JDK动态代理】JDK动态代理:为何只能代理接口和接口实现类
在Java开发中,JDK动态代理是一种非常有用的技术,它允许开发者在不修改目标类代码的情况下,为目标类添加额外的功能。然而,JDK动态代理的使用有一些限制,特别是它只能代理接口和接口实现类。本文将深入探讨这一限制的原…...
 
MFC工控项目实例二十一型号选择界面删除参数按钮禁用切换
承接专栏《MFC工控项目实例二十手动测试界面模拟量输入实时显示》 对于禁止使用的删除、参数按钮,在选中列表控件选项时切换为能够使用。 1、在TypDlg.h文件中添加代码 #include "ShadeButtonST.h" #include "BtnST.h" class CTypDlg : publi…...
 
前端框架对比和选择指南
前端框架对比和选择指南 随着 Web 开发技术的快速发展,前端框架已经成为了现代 Web 开发的核心工具之一。它们为开发人员提供了快速构建高效、交互性强的应用的基础。当前流行的前端框架主要包括 React.js、Vue.js 和 Angular.js。在这篇技术博客中,我们…...
 
人工智能价格战——如何降低成本让人工智能更易于普及
十年前,开发人工智能 (AI) 是只有大公司和资金充足的研究机构才能负担得起的事情。必要的硬件、软件和数据存储成本非常高。但从那时起,情况发生了很大变化。一切始于 2012 年的 AlexNet,这是一种深度学习模型,展示了神经网络的真…...
 
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
 
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
 
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
 
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
 
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
 
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
