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

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

在这里插入图片描述

一、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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值