1.1QT介绍
1.1.1 QT简介
Qt 是一个跨平台的应用程序和用户界面框架,用于开发图形用户界面(GUI)应用程序以及命令行工具。它最初由挪威的 Trolltech (奇趣科技)公司开发,现在由 Qt Company 维护,2020年12月8日发布QT6。Qt 使用 C++ 语言编写,支持多种编程语言通过绑定进行使用。
1.1.2 QT Creator 常用的快捷键使用基本介绍


2.1 命名空间
2.1.1命名空间作用
创建自己的命名空间是 C++ 中组织代码的一种好方法,特别是在开发大型项目或库时。命名空间可以帮助你避免名称冲突,并且清晰地组织代码。
std 是 C++ 标准库的命名空间。它是一个定义在 C++ 标准库中的所有类、函数和变量的命名空间。
在 C++ 中,如果你想使用标准库中的任何类、函数或对象,你通常有两种选择:
1. 使用 std:: 前缀:这是最常见的方式,它明确指定了你正在使用的是位于 std 命名空间中的元
素。
std::cout << "Hello, world!" << std::endl;
2. 使用 using namespace std; :这允许你在不显式指定 std:: 的情况下使用 std 命名空间中的
所有元素。
using namespace std;
cout << "Hello, world!" << endl;
std包含的内容
std 命名空间包含了许多类、函数和对象,例如:
输入输出库(如 std::cout , std::cin , std::endl )
容器类(如 std::vector , std::map , std::set )
字符串类( std::string )
异常类( std::exception 和相关子类)
算法(如 std::sort , std::find )
实用工具(如 std::pair , std::tuple )
其他许多功能
使用建议
对于小型代码或示例代码,使用 using namespace std; 通常是安全的。
对于大型项目或库,建议显式地使用 std:: 前缀,以避免潜在的名称冲突,并提高代码的可读性
和可维护性。
std 命名空间是 C++ 编程的基础部分,理解和正确使用它对于编写健壮和高效的 C++ 代码至关重要。
2.1.2自定义命名空间
定义命名空间
假设我们要创建一个命名空间来包含与圆形相关的功能。我们可以命名这个命名空间为 cir :
在这个头文件中,我们定义了一个名为 cir 的命名空间,其中包含了计算圆的面积和周长的函数,以及圆周率常量 PI 。
使用命名空间
在另一个文件中,我们可以使用这个命名空间中定义的函数和常量:
在 main.cpp 中,我们首先包含了定义 Cir 命名空间的头文件。然后,我们可以使用 Cir:: 前缀来访 问该命名空间中的函数和常量。
通过使用自定义命名空间,你可以有效地组织你的代码,并减少不同库之间的名称冲突。这在大型项目和团队协作中尤其重要。
输出结果
2.2 从C语言快速入门
2.2.1 输入输出
C++ 中的输入和输出(I/O)主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库,它提供了用于输入和输出的基本流类,包括 cin 、 cout 、 cerr 和 clog 。
标准输出流 ( cout )
cout 代表标准输出流,通常用于向屏幕输出数据。
使用操作符 << (插入操作符)向 cout 发送数据。
例如, std::cout << "Hello, world!" << std::endl; 会在屏幕上打印 "Hello, world!" 并换行。
标准输入流 ( cin )
cin 代表标准输入流,用于从键盘接收数据。
使用操作符 >> (提取操作符)从 cin 提取数据。
例如, int x; std::cin >> x; 会从用户那里读取一个整数并存储在变量 x 中。
标准错误流 ( cerr ) 和标准日志流 ( clog )
cerr 用于输出错误消息。与 cout 不同, cerr 不是缓冲的,这意味着它会立即输出。
clog 类似于 cerr ,但它是缓冲的。它通常用于记录错误和日志信息。
2.2.2 基本变量类型
C++ 基本数据类型整理成表格。以下是一个表格,展示了不同的基本数据类型及其一般用途和大小范围:
和C语言类似。
2.2.3 内联函数
内联函数(Inline Function)是C++中一种特殊的函数,其定义直接在每个调用点展开。这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。
特点
1. 减少函数调用开销:内联函数通常用于优化小型、频繁调用的函数,因为它避免了函数调用的常规开销(如参数传递、栈操作等)。
2. 编译器决策:即使函数被声明为内联,编译器也可能决定不进行内联,特别是对于复杂或递归函 数。
3. 适用于小型函数:通常只有简单的、执行时间短的函数适合做内联。
4. 定义在每个使用点:内联函数的定义(而非仅仅是声明)必须对每个使用它的文件都可见,通常意味着将内联函数定义在头文件中。
使用方法
通过在函数声明前添加关键字 inline 来指示编译器该函数适合内联:
inline int max(int x, int y)
{
return x > y ? x : y;
}
示例
#include <iostream>
inline int add(int a, int b)
{
return a + b;
}
int main()
{
int result = add(5, 3); // 编译器可能会将此替换为:int result = 5 + 3;
std::cout << "Result: " << result << std::endl;
return 0;
}
在这个示例中,函数 add 被定义为内联函数。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。
注意事项
过度使用的风险:不应滥用内联函数,因为这可能会增加最终程序的大小(代码膨胀)。对于大型
函数或递归函数,内联可能导致性能下降。
编译器的决定:最终是否将函数内联是由编译器决定的,即使函数被标记为 inline 。
适用场景:最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数。
内联函数是一种用于优化程序性能的工具,但需要合理使用,以确保代码的可维护性和性能的平衡。
2.2.4 Lambda 表达式
Lambda 表达式是 C++11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数
Lambda 表达式的基本语法如下:
[capture clause](parameters) -> return_type
{
// 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
}
Lambda 表达式由以下部分组成:
捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕
获列表可以为空,也可以包含变量列表 [var1, var2, ...] 。
参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表 (param1,
param2, ...) 。
返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类
型 -> return_type 。如果函数体只有一条返回语句,可以省略返回类型。
函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。
Lambda 表达式最简单的案例是在需要一个小型函数或临时函数时直接使用它。以下是一个非常简单的例子,其中使用 Lambda 表达式来定义一个加法操作,并立即使用它来计算两个数的和。
#include <iostream>
int main()
{
// 定义一个简单的 Lambda 表达式进行加法
auto add = [ ](int a, int b)
{
return a + b;
};
// 使用 Lambda 表达式计算两个数的和
int sum = add(10, 20);
std::cout << "Sum is: " << sum << std::endl;
return 0;
}
在这个例子中:
我们定义了一个名为 add 的 Lambda 表达式,它接受两个整数参数,并返回它们的和。然后,我们使用这个 Lambda 表达式来计算两个数字(10 和 20)的和,并将结果存储在变量 sum中。最后,我们打印出这个和。
这个例子展示了 Lambda 表达式的基本用法:作为一种简洁而快速的方式来定义小型函数。
我们可以写一个例子,其中使用一个函数来找出两个数中的较大数,这个函数将接受一个 lambda 函数作为回调来比较这两个数。Lambda 函数将直接在函数调用时定义,完全是匿名的。
先回忆以下回调函数
#include <iostream>
bool myCompare(int