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的兼容
- C++几乎支持所有的C语言语法,g++是编译C++文件时用到的编译器,C++编译器要不C语言编译器更加严格
- C中的头文件<stdio.h>在C++中仍然支持C语言的头文件,一般去掉h在头文件名前面加上c,<stdio.h>-.>cstdio>
- C文件一般.c结尾,C++文件一般是.cpp结尾
- 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. 运算符
- <<和>>在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. 介绍
命名空间的作用: 为了解决命名污染问题(命名冲突问题)
- 查看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;
}