QT 是一个跨平台的 C++ 图形用户界面应用程序开发框架,广泛用于开发 GUI 程序以及非 GUI 程序,比如控制台工具和服务器。
一、输入输出
在学习C++的输入输出前,我们需要先了解命名空间的概念。其中std 是 C++ 标准库的命名空间。它是一个定义在 C++ 标准库中的所有类、函数和变量的命名空间。
1、命名空间
1)命名空间功能
C++ 中的命名空间(Namespace)是一种封装标识符(如变量名、函数名等)的方式,用于解决标识符的命名冲突问题,特别是在大型项目中,或者当多个库或模块被同时使用时。命名空间提供了一种将一组相关的标识符组织在一起的方法,从而使得代码更加清晰、易于维护。
2)命名空间的使用方式
在 C++ 中,如果你想使用标准库中的任何类、函数或对象,你通常有两种选择:
①使用 std:: 前缀:这是最常见的方式,它明确指定了你正在使用的是位于 std 命名空间中的元素。适用于大型项目。
②使用 using namespace std; :这允许你在不显式指定 std:: 的情况下使用 std 命名空间中的所有元素 。适用于中小型项目。
2、标准输入输出流
1)下边以输入输出为例
QT 可以使用 C 语言,但主要和更常见的做法是使outb用 C++,它提供了与 C 语言的互操作性。所以我们来用C预言的输入输出来对照一下C++,方便大家的理解。
#include <stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a);
}
①方式一 使用 std:: 前缀(c++中标准输出流为cout;标准输入流为cin;)
#include <iostream>
int main()
{
int a;
std::cin>>a;
std::cout<<a<<std::endl;
return 0;
}
注:关于输入输出流中箭头的方向大家可以这么理解,输入端将内容送给了a,而输出时a的值又被送给了输出端。
②方式二 使用 using namespace std;
#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<<a<<endl;
return 0;
}
2) 举例:自定义命名空间
#include <iostream>
namespace MyNamespace {
void myFunction() {
std::cout << "Hello from MyNamespace::myFunction!" << std::endl;
}
}
using namespace MyNamespace; // 使用 MyNamespace 命名空间中的所有成员
int main() {
myFunction(); // 直接调用,无需 MyNamespace:: 前缀
return 0;
}
二、数据类型(变量使用应注意变量域)
1.基本数据类型
C++中的其中数据类型为下图所示 ,相较C多了一个宽字符型。宽字符型:主要用于表示和存储多字节字符,如汉字、韩文、日文等。在C语言中,标准的char类型通常只能存储一个字节的字符,而宽字符型(如C++中的wchar_t)则用于存储多字节字符,通常占据两个字节的空间。其存储空间
下面具体演示一下宽字符型数据的使用
#include <iostream>
#include <locale>
#include <wchar.h>
int main() {
// 设置本地化以支持宽字符
std::setlocale(LC_ALL, "");
// 使用 wchar_t 类型定义一个宽字符串
wchar_t wstr[] = L"你好,世界!";
// 在 C++ 中打印宽字符串
std::wcout << wstr << std::endl;
return 0;
}
2.如何使用 <climits>
#include <iostream>
#include <climits> //要使用 <climits> 中定义的常量,需要包含这个头文件
int main() {
std::cout << "整型的最小值为 " << INT_MIN << std::endl;
return 0;
}
它提供的各种常量如下:
- INT_MAX : int 类型的最大值。
- INT_MIN : int 类型的最小值。
- UINT_MAX : unsigned int 类型的最大值。
- LONG_MAX : long int 类型的最大值。
- LONG_MIN : long int 类型的最小值。
- LLONG_MAX : long long int 类型的最大值。
- LLONG_MIN : long long int 类型的最小值。
3.typedef 声明(使用 typedef 为一个已有的类型取一个新的名字 eg:typedef int HAHA)
三、字符串、数组、判断、循环(等同C语言,有基础的可以直接跳过)
1.字符串
在 C++ 中, string 类是标准库的一部分,用于表示和操作字符串。它是对传统的 C 风格字符串(以空字符 '\0' 结尾的字符数组)的一个更安全、更方便的封装。 string 类是在 <string> 头文件中定义的,并且位于 std 命名空间中。
以表格中第一个示例:返回字符串的长度
#include <iostream>
#include <string>
int main()
{
std::string str="hello";
std::cout<<str.length()<<std::endl;
return 0;
}
2.数组(容器vector可以自适应的变更大小,更为常用)
int arr1[10];//一维数组 int arr2[]3[3];//二维数组3×3
3.判断 (示例为判断所输入数的正负)
#include <iostream>
using namespace std;
int main()
{
int num;
cin>>num;
if(num==0){
cout << "你输入的数为0"<<endl;
}
else if(num>0){
cout << "你输入的数为正数"<<endl;
}
else{
cout << "你输入的数为负数"<<enl;
}
return 0;
}
4.循环(示例为输出0-9)
1) while循环
#include <iostream>
int main()
{
int i=0;
while(i<10){
std::cout<<i<<std::endl ;
i++;
}
return 0;
}
2)for循环
#include <iostream>
int main()
{
for(int i=0;i<10;i++){
std::cout<<i<<std::endl ;
}
return 0;
}
四、函数、内联函数、以及Lambda 表达式
1、函数(实现两个数相加为例,函数的定义在前引用在后,这里实现了num1+num2)
#include <iostream>
#include <string>
using namespace std;
int add(int a,int b){
return a + b;
}
int main()
{
int num1=1,num2=2;
cout<<add(num1,num2)<<endl;
}
2、内联函数
内联函数(Inline Function)是C++中一种特殊的函数,其定义直接在每个调用点展开。这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。
#include <iostream>
#include <string>
using namespace std;
inline int add(int a,int b){
return a + b;
}
int main()
{
int num1=1,num2=2;
cout<<add(num1,num2)<<endl;
}
上述代码等同于
#include <iostream>
#include <string>
using namespace std;
int main()
{
int num1=1,num2=2;
cout<<num1+num2<<endl;
}
注:内联函数适用于最适合内联的小型函数和在性能要求高的代码中频繁调用的函数,不能滥用。
3、Lambda 表达式(匿名函数)
Lambda 构成如下
[捕获列表](参数列表) -> 返回数据类型{
// 函数体
}
1)下面我们用lambda函数来实现一下a+b,以参数列表的形式
#include <iostream>
using namespace std;
int main()
{
auto add = [](int a,int b)->int{
return a+b;
};
int num1=1,num2=2;
cout<<add(num1,num2)<<endl;
}
2)以捕获列表的形式
#include <iostream>
using namespace std;
int main()
{
int num1=1,num2=2;
auto add = [num1,num2]{
return num1+num2;
};
cout<<add()<<endl;
}
- 捕获获取的是它们的值,并不能进行变更, [=]可以捕获所有外部变量。当我们尝试在匿名函数中变更num1的值时,它会提示我们这个值是只读的,你可以理解为值的复制。
- 那如何进行变更呢 ,L可以使用 [&] ,即按引用捕获所有外部变量,此时可以进行值的变更
#include <iostream> using namespace std; int main() { int num1=1,num2=2; auto add = [&](){ num1=3; return num1+num2; }; cout<<add()<<endl; }
此时输出的值为5。