第一弹: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,这是一种深度学习模型,展示了神经网络的真…...

企业间图文档发放:如何在保障安全的同时提升效率?
不管是大型企业,还是小型创业公司,不论企业规模大小,每天都会有大量的图文档发放,对内传输协作和对外发送使用,数据的生产也是企业业务生产力的体现之一。 伴随着业务范围的不断扩大,企业与客户、合作伙伴之…...

深入解析 ConcurrentHashMap:从 JDK 1.7 到 JDK 1.8
✨探索Java基础 ConcurrentHashMap✨ 引言 ConcurrentHashMap 是 Java 中一个线程安全的高效 Map 集合。它在多线程环境下提供了高性能的数据访问和修改能力。本文将详细探讨 ConcurrentHashMap 在 JDK 1.7 和 JDK 1.8 中的不同实现方式,以及它们各自的优缺点。 …...

VS code user setting 与 workspace setting 的区别
VS code user setting 与 workspace setting 的区别 引言正文引言 相信有不少开始接触 VS code 的小伙伴会有疑问,user setting 与 workspace setting 有什么区别呢?这里我们来说明一下 正文 首先,当我们使用 Ctrl + Shift + P 打开搜索输入 setting 后,可以弹出 4 个se…...

XPath基础知识点讲解——用于在XML中查找信息的语言
1. 什么是XPath? XPath(XML Path Language)是用于在XML(Extensible Markup Language)文档中查找信息的语言。它可以通过路径表达式来选择XML文档中的节点,类似于如何在文件系统中使用路径查找文件。XPath是…...

Visual Studio 2022
VS(Visual Studio)是一款由微软开发的集成开发环境(IDE),用于开发应用程序、网站以及移动应用等。VS的历史可以追溯到1997年,当时发布了第一个版本的VS。以下是VS的一些重要历史里程碑: Visual …...

微软Win11 22H2/23H2 九月可选更新KB5043145发布!
系统之家于9月27日发出最新报道,微软针对Windows11系统,发布了九月最新可选更新补丁KB5043145,22H2用户安装后,系统版本号升至22621.4249,23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…...

试试号称最好的7B模型(论文复现)
试试号称最好的7B模型(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 试试号称最好的7B模型(论文复现)概述论文原理部署与复现推理微调adapter 融合 概述 Mistral 7B 是一个新型的具有 7.3 万亿参数的大语言模型。…...

CTF中文件包含
php伪协议的分类 伪协议是文件包含的基础,理解伪协议的原理才能更好的利用文件包含漏洞。 php://input php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。 使用条件:includ…...

20.指针相关知识点1
指针相关知识点1 1.定义一个指针变量指向数组2.指针偏移遍历数组3.指针偏移的补充4.指针和数组名的见怪不怪5.函数、指针、数组的结合 1.定义一个指针变量指向数组 指向数组首元素的地址 指向数组起始位置:等于数组名 #include <stdio.h>int main(){int ar…...

PFC和LLC的本质和为什么要用PFC和LLC电路原因
我们可以用电感和电容的特性,以及电压和电流之间的不同步原理来解释PFC(功率因数校正)和LLC(谐振变换器)。 电感和电容的基本概念 电感(Inductor): 电感是一种储存电能的组件。它的电流变化比较慢,电流在电感中延迟,而电压变化得比较快。可以把电感想象成一个“滞后…...