Linux 学习记录40(C++篇)

Linux 学习记录40(C++/QT篇)

在这里插入图片描述

本文目录

  • Linux 学习记录40(C++/QT篇)
  • 一、QT软件的使用
    • 1. 新建工程
  • 二、C语言和C++的区别
    • 1. C++对C的扩充
    • 2. C++对C的兼容
  • 三、第一个C++程序
    • 1. cout标准输出流对象
      • (1.介绍:
      • (2. 运算符
      • (3. cout的使用
    • 2. cin标准输出流对象
      • (1.介绍:
      • (3. cin的使用
  • 四、命名空间
    • 1. 介绍
    • 2. 定义命名空间
    • 3. 命名空间冲突问题
      • (1. 指明引入的空间名
      • (2. 不同时将两个空间都全局引入
      • (3. 局部变量和命名空间冲突问题
      • (4. 全局变量和命名空间冲突问题
    • 4. 命名空间的嵌套
      • (1. 命名空间的添加
      • (2. 命名空间的嵌套
      • (3. 命名空间重命名
    • 5. using的用法
  • 五、字符串/C++中的string类
    • 1. 定义一个字符串类型
    • 2. C++字符串转换为C字符串
      • (1. c_str函数
      • (2. data函数
    • 3. string常用函数
      • (1. at 函数
      • (2. empty 函数
      • (3. length 函数
      • (4. clear 函数
    • 4. 字符串能够直接比较
    • 5. 字符串输入
      • (1. getline 函数
  • 六、C++中的布尔类型
  • 思维导图
  • 练习
    • 1. 字符串逆置

一、QT软件的使用

1. 安装路径要为全英文路径
2. 创建文件时也要求全英文路径

1. 新建工程

1.在这里插入图片描述
2. 新建非QT的文件
在这里插入图片描述
3. 选择创建的路径
在这里插入图片描述
4. 选择编译套件(后面一直下一步即可)
在这里插入图片描述
5. 修改文件编码
在这里插入图片描述
在这里插入图片描述

二、C语言和C++的区别

C++也叫C plus plus,对C语言进行了语法的扩充,支持大部分C语言语法。
C++是编译型语言
C语言是面向过程的语言,C++是面向对象的语言
面向过程的语言:自己写代码完成求解的过程
面向对象的语言:求解的方法。

面向对象的语言:求解的方法。

1. C++对C的扩充

1. 命名空间(用于解决命名冲突问题)
2. 函数重载和运算符重载(字符串的比较)
3. 引用(与指针相似)
4. 面向对象的特征
5. 泛式编程
6. 模板编程
7. STL标准模板库

2. C++对C的兼容

  1. C++几乎支持所有的C语言语法,g++是编译C++文件时用到的编译器,C++编译器要不C语言编译器更加严格
  2. C中的头文件<stdio.h>在C++中仍然支持C语言的头文件,一般去掉h在头文件名前面加上c,<stdio.h>-.>cstdio>
  3. C文件一般.c结尾,C++文件一般是.cpp结尾
  4. g++仍然能编译C程序,但是qcc不能编译c++程序

三、第一个C++程序

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int i = 90;
    cout << i << endl;   //90
    double num = 9.123456789;
    cout <<num << endl; //默认输出6位,小数点也算一位
    //setbase()输出,指定的进制
    cout << setbase(8) << i << endl;   //132   输出了i的8进制
    cout << setbase(16) << i << endl;  //5a    输出i的16进制
    cout << i << endl;    //5a,因为前一句对cout的输出格式做了修改,并且没有更改回来
    cout << setbase(10) << i << endl;  //90
    //使用关键字输出指定进制
    cout << oct << i << endl;    //八进制输出
    cout << hex << i << endl;    //十六进制
    cout << dec << i << endl;    //十进制输出

    //指定宽度的输出
    //printf("%nd");   右对齐n个宽度
    cout << setw(5) << i << endl;    //指定宽度的输出,默认是右对齐输出
    cout << setw(5) << left << i << endl;   //指定宽度的输出,左对齐输出

    //对num指定宽度的输出
    cout << setprecision(8) << num << endl;   //指定小数点后的输出位数
    return 0;
}

输出结果:
在这里插入图片描述

1. cout标准输出流对象

(1.介绍:

1. cout是由ostream提供的C++中的标准输出流类
2. cout还包含在std中,cout就是一个类对象

(2. 运算符

  1. <<和>>在C++中被定义为左移右移运算符,但是 iostrean中对<<和>>进行了重载重载后,<<输出,>>输入

(3. cout的使用

如果需要用到函数就必须引用头文件,不然编译会不通过

1. 不需要使用%d,%c,%f等占位符
2. 可以级联输出

2. cin标准输出流对象

(1.介绍:

istream类中提供的输入流对象
1. 不需要加格式符
2. 不能加endl
int main()
{
    int in_data = 0;

    cin >> in_data ;//
    cout << in_data <<endl;

    return 0;
}

(3. cin的使用

1. cin会根据变量的类型决定获取数据
2. 如果有遗留的数据会按类型提供给下一个要输入的数据

四、命名空间

1. 介绍

命名空间的作用: 为了解决命名污染问题(命名冲突问题)

  1. 查看std: 按住ctrl点击std
    在这里插入图片描述
#include <iostream>
#include <iomanip>
using namespace std; //用于全局导入命名空间内的所有标识符
using std::cout; //用于全局导入命名空间内的部分标识符
:: //双冒号是域标识符
命名空间名::该空间内的名//标识调用该命名空间内的名,直接引用该命名空间内的名

2. 定义命名空间

命名空间可以有变量名,函数名,结构体名...等等
格式·:

namespace 命名空间名
{
}

例:

#include <iostream>
#include <iomanip>
using namespace std;

namespace A
{
    int a;
    int b;
    double c;
    int add(int num1,int num2);
}

//定义函数并将函数名定义到A命名空间内
int A:: add(int num1,int num2)
{
    return num1+num2;
}

using namespace A;
int main()
{
    a = 25;
    cout << a << endl;

    return 0;
}

3. 命名空间冲突问题

当多个命名空间中,标识符冲突时,会报错

(1. 指明引入的空间名

#include <iostream>
//using namespace std;   //全局导入命名空间中的标识符
using std::cout;  //全局导入std中的cout
using std::endl;  //全局导入std中的endl
//定义了一个命名空间A
namespace A
{
     int a;
     int b;
     double num;
     void show();
}
namespace B {
     int a;
}
void A::show()
{
    std::cout << "hello" << endl;
}
using namespace A;
using namespace B;
int main()
{
    //using namespace std;    //在mian内局部引入std中的所有标识符
    cout << A::a << endl;     //指明使用A中的a
    B::a=100;
    cout << B::a << endl;
    show();
    cout << "Hello World!" << endl;
    return 0;
}

(2. 不同时将两个空间都全局引入

#include <iostream>
//using namespace std;   //全局导入命名空间中的标识符
using std::cout;  //全局导入std中的cout
using std::endl;  //全局导入std中的endl
//定义了一个命名空间A
namespace A
{
     int a;
     int b;
     double num;
     void show();
}
namespace B {
     int a;
}
void A::show()
{
    std::cout << "hello" << endl;
}
using namespace A;
int main()
{
    //using namespace std;    //在mian内局部引入std中的所有标识符
    cout << a << endl;     //使用A中的a,因为只引入了A命名空间
    a=100;
    cout << a << endl;
    show();
    cout << "Hello World!" << endl;
    return 0;
}

(3. 局部变量和命名空间冲突问题

默认使用局部变量,局部有限
如果想要使用命名空间中的标识符,需要加上,命名空间名和域限定符

#include <iostream>
using namespace std;
namespace N1 {
     int age=79;
}
using namespace N1;
int main()
{
    int age = 100;
    cout << age << endl;   //100,局部优先
    cout << N1::age << endl;   //79,知名访问N1中的age
    return 0;
}

(4. 全局变量和命名空间冲突问题

匿名空间:没有名字的命名空间,直接用::使用匿名空间中的值

1. 如果全局变量和普通的命名空间重提,直接在变量名前加上域限定符::,就可以访问全局变量
2. 如果全局变量和匿名空间冲突,使用域限定符只能访问到全局变量的值,匿名空间中的值被覆盖
pace N1 {
     int age=79;
}
//定义了一个匿名空间
namespace  {
     int age = 100;
     int fat = 100;
}
using namespace N1;
int main()
{
    cout << N1::age << endl;   //访问命名空间中的age
    cout << ::age << endl;     //通过域限定符访问全局变量age,全局变量默认存储在匿名空间中
    cout << ::fat << endl;     //::通过域限定符访问匿名空间中的标识符
    return 0;
}

4. 命名空间的嵌套

(1. 命名空间的添加

如果定义了多个命名空间,最后会合并为一个

namespace N1
{
    int a;
}

namespace N1
{
    int b;
}
什么两个命名空间会合并为一个命名空间
==============

(2. 命名空间的嵌套

#include <iostream>
#include <iomanip>
using namespace std;

namespace N1
{
    int age=1;
    //N1内嵌套了一个N2命名空间
    namespace N2 
    {
        int age=2;
        int fat=3;
    }
}
using namespace N1;
int main()
{
	//访问N1内嵌套N2的数据
    cout << N1::N2::age << endl;
    return 0;
}

(3. 命名空间重命名

重命名:namespace 新名 = 旧名 ,旧名依然可以使用

namespace N1
{
    int age=1;
}
using namespace N1;
int main()
{
    namespace p = N1;//将N1重命名为P,同时N1还可以继续使用
    return 0;
}

5. using的用法

需要导入的类:#include <cstring>
可以用于类型的重定义,是C++11的新特性,不完全通用

using 新名 = 旧名;

五、字符串/C++中的string类

C语言中是不支持字符串类型的

在这里插入图片描述

1. 定义一个字符串类型

通过string类来定义一个字符串类型

#include <iomanip>
#include <cstring>

using namespace std;

int main()
{
    char str[30] = "word";
    string str1 ="hello";
    string str2 =str1;//能够直接使用已有字符串赋值
    string str3 (5,'a');//赋值5个a
    string str4 ("he");//赋值he
    cout << str2 << endl;
    cout << str3 << endl;
    cout << str4 << endl;
    str1 += str;//能够直接拼接赋值
    cout << str1 << endl;

    return 0;
}

运行结果:
在这里插入图片描述

2. C++字符串转换为C字符串

C字符串能够直接被C++字符串直接使用
C++字符串需要转换成C字符串才能被C使用

(1. c_str函数

功能:将C++字符串转换为C字符串
返回值为一个指针
#include <iostream>
#include <iomanip>
#include <cstring>

using namespace std;

int main()
{
    string str1 ="hello";
    char str2[30] = "world";

    printf("%s",str1.c_str());

    return 0;
}

(2. data函数

功能:将C++字符串转换为C字符串
返回值为一个指针
#include <iostream>
#include <iomanip>
#include <cstring>

using namespace std;

int main()
{
    string str1 ="hello";
    char str2[30] = "world";

    printf("%s",str1.data());

    return 0;
}

3. string常用函数

(1. at 函数

功能:通过下标访问字符串中的具体字符,当越界时会抛出异常,报警告
int main()
{
    string str1 ="hello";

    cout << str1.at(3) << endl;

    return 0;
}

报错:
在这里插入图片描述

(2. empty 函数

功能:判断字符串是否为空
int main()
{
    string str1 ="hello";

    if (str1.empty())
    {
        cout << "NULL" <<endl;
    }else
    {
        cout << "Not NULL" <<endl;
    }

    return 0;
}

(3. length 函数

功能:计算字符串长度
int main()
{
    string str1 ="hello";
    cout << str1.length() << endl;
    return 0;
}

(4. clear 函数

功能:清空字符串
int main()
{
    string str1 ="hello";
    str1.clear()
    return 0;
}

4. 字符串能够直接比较

C++中字符串能够直接比较,类似C中strcmp功能


5. 字符串输入

无法直接获取带空格的字符串

例:
int main()
{
    string str1;

    cin >> str1;

    cout << str1 << endl;

    return 0;
}

结果
在这里插入图片描述

(1. getline 函数

功能:能够获取带空格的字符串
第一个参数为输入流,第二个为字符串
例:
int main()
{
    string str1;

    getline(cin,str1);

    cout << str1 << endl;

    return 0;
}

结果
在这里插入图片描述

六、C++中的布尔类型

1. 在C语言在是不支持布尔类型的,需要导入头文件<bool.h>
2. C++中支持布尔类型
3. true和false,是bool类型的值,并且true和false是关键字
4. bool类型在C++中默认是数字表示的,如果需要以字符串形式打印需要加关键字boolalpha关键字

int main()
{
    bool a =true;//定义布尔类型的变量
    bool b =false;

    cout << a <<endl;//以默认形式打印
    cout << b <<endl;

    cout << boolalpha << a <<endl;//以字符串形式打印
    cout << b <<endl;

    cout << noboolalpha << a <<endl;//取消上一个形式

    return 0;
}

输出
在这里插入图片描述

思维导图

在这里插入图片描述

练习

1. 字符串逆置

定义一个命名空间Myspace,包含以下函数:将一个字符串中的所有单词进行反转,并输出反转后的结果。例如,输入字符串
为”Hello World”,输出结果为"olleH dlrow”,并在主函数内测试该函数。

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>

using namespace std;

namespace Mysqace
{
    string str_Inversion(string str);
    string world(string str);
}


string Mysqace::world(string str)
{
    int i = 0;
    int len = 0;
    char ret[128] = {0};
    len = str.length();

    //单个字符串逆置
    for (i=0; i < len ; i++)
    {
        ret[i] = str.at(len-1-i);
    }
    return ret;
}

string Mysqace::str_Inversion(string str)
{
    string ret;
    char buf[128];
    char buf2[128] = {0};
    strcpy(buf,str.c_str());
    char* p1=buf;
    char* p2=buf;
    int i=0;

    while(1)
    {
        p1=strstr(p1," ");
        p1+=1;
        //获取单个字符串
        i=0;
        while(1)
        {
            if(*(p2+i)==0x20 || *(p2+i)==0)
            {
                break;
            }

            buf2[i]=*(p2+i);
            printf("%c \r\n",*(p2+i));
            i++;
        }
        buf2[i]=' ';
        buf2[i+1]='\0';
        printf("接收到:%s \r\n",buf2);
        ret+=Mysqace::world(buf2);
        printf("逆置为:%s \r\n",ret.c_str());
        if(ret.length()==str.length())return ret;
        p2=p1;
        if(p1 == NULL) return ret;
    }

    return ret;
}

int main()
{
    string str;

    getline(cin, str); //获取字符串

    cout << "获取到的字符串:" << str << endl;

       Mysqace::str_Inversion(str);
//    cout << "逆置后的字符串:" << Mysqace::str_Inversion(str) << endl;
       cout << "结束" << endl;

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP详解(一)

TCP/IP协议是Internet互联网最基本的协议&#xff0c;其在一定程度上参考了七层OSI&#xff08;Open System Interconnect&#xff0c;即开放式系统互联&#xff09;模型 OSI参考模型是国际组织ISO在1985年发布的网络互联模型&#xff0c;目的是为了让所有公司使用统一的规范来…

序列化和反序列化的认识【protobuf、json、xml】

1. 什么是序列化与反序列化&#xff1f; 程序员在编写应用程序的时候往往需要将程序的某些数据存储在连续的内存中&#xff0c;然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化&#xff08;seri…

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent&#xff08;存储事件&#xff09; 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

【spring源码系列-04】注解方式启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

团体程序设计天梯赛-练习集L2篇⑨

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念&#xff0c;用于描述矩阵的行&#xff08;或列&#xff09;向量的线性无关程度。矩阵的秩可以通过…

Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

在进行数据查询时&#xff0c;控制台报了Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1异常&#xff0c;查询得知&#xff1a;这是由于查mysql库&#xff0c;转换类型为datetime类型的字段引起的。 网上的解决方案有多种&#xff0c;大…

fastadmin如何自定义一个列表上的按钮。

参考文档&#xff1a; 首先&#xff0c;这是没有新增按钮的&#xff0c;只有删除和编辑。 然后js按钮是这一块&#xff1a; 我现在呢想加上一个撤销的按钮怎么办呢&#xff0c;只需要在js加上这一串代码就行了。 {field: "operate",title: __("Operate")…

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

场景 最近在使用uni-app开发H5移动端&#xff0c;跟往常一样使用axios发请求&#xff0c;做一些全局的请求拦截响应拦截操作 uni-app数据存储&#xff0c;uni-ui组件开发&#xff0c;配置axios&#xff0c;vuex。配置了vue.config.js文件做跨域操作 运行到谷歌浏览器一切正常…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER => toString} 注意:要避免scan一张大表! 2 需求二:查询订单数据(只显示3条) scan ORDE…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社区中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#xff0c;据说年…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 &#xff0c;那么响应式是什么呢&#xff1f; 响应式&#xff1a;响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说&#xff1a; 自适应&#xff1a;元素随着…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC &#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;方法&#xff0c;它允许位于同一主机&#xff08;计算机&#xff09;或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket&#xff0c;开发人员可以…

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中&#xff0c;玩家操纵一条贪吃的蛇在长方形场地里行走&#xff0c;贪吃蛇按玩家所按的方向键折行&#xff0c;蛇头吃到食物(豆)后&#xff0c;分数加10分&#xff0c;蛇身会变长&#xff0c;如果贪吃蛇碰上墙壁或者自身的话&#xff0c;游戏就结束了(当然也可能是减去…

企业级微服务架构实战项目--xx优选-用户登录

一 用户登录的触发页面 1.登录常量 2.登录地址 3.配置域名 4.启动程序 触发连接小程序后端的登录接口 小程序controller的登录方法

XR云新未来圆桌精彩回顾 | XR应用场景迭代下的新商业模式

6月15日&#xff0c;由平行云联合首都在线共同主办&#xff0c;中关村软件园协办&#xff0c;以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 本次会议我们邀请到平行云科技创始人兼CEO 李岩、XREAL 云XR负责人 吴维、瑞帆科技…

利用SQL注入漏洞登录后台

所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令&#xff0c;比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的&#xff0c;这类表单特别容易受到SQ…

LLM-Client一个轻量级的LLM集成工具

大型语言模型(llm)已经彻底改变了我们与文本交互的方式&#xff0c;OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求&#xff0c;集成这些模型是一项耗时且具有挑战性的任务。 所以…