一、QtCreator基本使用
(一)编码格式:
windows下QtCreator软件默认的编码格式:utf-8
C++程序使用的编码格式为GBK或者GB2312;
qt程序用的编码格式为UTF-8.
(二)C++编程
1. 文件后缀
C++程序一般以.cpp为后缀,也可以是.cc
/.cxx
/.C
2. 编译
C++程序一般使用g++编译器;
但是依然可以使用gcc编译器:
gcc hello.cpp -lstdc++
g++ hello.cpp -o hello
3. 头文件
- 头文件:C++完全兼容C,C++可以使用C的头文件
#include <iostream>
C++中和I/O相关的类型、对象、函数都在此头文件中- C++中多数头文件没有“.h”后缀,为了与C语言区分开
- 头文件所在的系统路径:
linux下头文件所在的系统路径:/usr/include/c++/编译器版本/..
Qt Creator下头文件所在的系统路径:
Qt5.14\Tools\mingw730_64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++
二、名字空间
(一)概念以及访问方式
1. 概念
名字空间又叫命名空间,关键字:namespace
作用:
为了避免名字冲突;
为了划分更加精细的逻辑的单元;
格式:
namespace 名字空间名{
int value; //名字空间中可以有变量
int func(){} //名字空间中可以有函数
namespace ns{} //名字空间嵌套(使用场景较少)
}
- 注:
- 名字空间中可以有变量、函数、名字空间嵌套
- namespace只起到标识作用;
- 花括号后面最好不要加分号;
使用示例:
#include <iostream>
using namespace std;
namespace A{
int value = 100;
void show(){
cout << "show函数:value="<<value<<endl;
} //注意,此处无需加分号,加了也没影响
namespace B {
int value = 200;
}
}
int main()
{
int value = 100;
cout << "局部变量优先:value="<<value<<endl;
cout << "A:: value="<<A::value<<endl;
cout << "B:: value="<<A::B::value<<endl;
A::show();
return 0;
}
输出结果:
2. 访问方式
(1)通过作用域限定符进行访问
格式:
名字空间名::名字空间中的成员
(2)通过名字空间指令进行访问
格式:
using namespace 名字空间名;
从该名字空间指令往后只要使用该名字空间内的成员都不用使用作用域
注意:一般在使用时,
如果是C++中标准的名字空间,写在程序的开头;
如果是自定义的名字空间,哪里使用写在哪里。
(3)通过名字空间声明进行访问
格式:
using 名字空间名::名字空间中的成员;
从该名字空间指令往后只要使用该名字空间内的此成员都不用使用作用域
(二)匿名空间
g++编译器会将全局的变量或者全局的函数放在匿名空间中
局部优先原则
通过作用域限定符进行访问
::匿名空间中的成员
(三)名字空间嵌套
- 通过作用域限定符进行访问
- 通过别名的方式进行访问
namespace C = A::B;
cout << "C:: value="<<C::value<<endl;
三、名字空间总结
1.名字空间的作用:
防止名字冲突,划分更加精细的逻辑单元;
2.名字空间的访问方式:
通过作用域限定符进行访问;
通过名字空间指令进行访问;
通过名字空间声明进行访问;
3.匿名空间:将全局的变量或者是函数放在匿名空间中;
访问匿名空间中的成员和局部域中的成员采用的是局部优先原则
优先在局部域里找变量或者函数,局部域没有再去全局域。
四、C++中的结构体
(一)C语言和C++的不同点
- C语言定义结构体不能省略struct关键字;
C++定义时可以省略struct关键字 - C语言中,结构体中不可以定义函数;
C++语言中结构体可以定义函数
注:结构体中定义函数但是不属于结构体,不占结构体大小,属于全局域 - C++语言中访问结构体成员:
通过“.
”
通过“->
”访问
五、C++中的bool类型
C语言中想要使用bool类型,需要添加头文件;
C++中bool作为基本类型,可以直接使用true或者false
bool占一个字节
因为内存中最小单位是字节,bool类型占一个字节,但是只需要一个bit位
count << boolalpha;
boolalpha可以让bool可以更加明显的显示
count << noboolalpha;
//取消显示
不管是什么类型的值赋值给bool类型变量,都会隐式转换成bool类型。
eg:
输出结果:
六、C++中的字符串(string)
C++中的字符串兼容C语言中的字符串
cin打印字符串不计算空格
getline(cin,str1);
七、C++中的函数
C++中函数可以重载;
C++中函数可以有缺省参数;
C++中可以有哑元参数;
(一)函数重载(overload)
相同的函数名,相同的作用域,不同的参数就可以构成重载关系。
同名不同参(参数的个数或者数据类型不同)
跟返回值无关
调用会根据传入的实参进行选择对应的函数进行调用
重载的机制:
只是在代码层面上看到的函数的名字是一样的,但是编译时g++编译器会对函数名重新定义,之后函数名就不同了。
(二)缺省参数(默认参数)
在函数定义时可以对参数进行赋值操作
缺省值赋值遵循靠右原则
如果一个函数有多个参数,应当将带有缺省值的参数放置在函数声明的最右侧。
函数声明和函数定义不能同时加缺省参数;
加到函数定义不行,必须加到函数声明的位置,因为程序在编译时先看到函数的声明。
(三)哑元参数
在形参表中只有数据类型,没有参数名,这样的参数叫做哑元参数。
使用场景:
自增自减运算符重载时,必须使用哑元参数,此时哑元参数用来占位置,来区分是前自增/自减,还是后自增/自减
开发时用于代码升级
(四)内联函数(inline)
内联函数是一个真正的函数,具有普通函数所有的属性和行为
内联函数就是在普通函数前面加上inline关键字
格式:
inline 返回值类型 函数名(){}
编译器建议内联函数在编译阶段展开,节省函数跳转的开销;
内联函数到底展不展开是由编译器的算法来决定