C++基础记录
C++基础记录
此博文用于记录使用C++的基础相关内容,包括一些概念与常用API使用。供日后自己查阅。
指针
所有类型的指针中的内容都是一样的,都是存储着指向对象的内存地址。类型的不同只是告诉编译器,内存中存的数据类型是什么(对于对象不同的类型,程序对内存的操作会不一样),所有指针中存储的值都是一个整数,指向对象的内存地址。
int i =1;
// &为取地址符号。此处也可以写成 int *p = &i; 但我认为写成 int* p = &i; 更让人理解。
int* p = &i;
// *符号为解引用符号,指针p前添加解引用符号表示指针指向的内存所存储的内容(p指向的是开始地址,int类型的指针说明了总共占4个字节)
*p = 3;
初始化与赋值
C++中初始化与赋值是完全不同的,初始化是在创建变量时赋予一个初始值,而赋值是将对象的当前值擦除,以一个新的值代替。
定义于函数体内的内置类型对象如果没有初始化,则其会被未定义,因为这个踩了很多坑了。
类型
C++ 中的基础类型
char
char 为单个字符,仅占一个字节,可以直接使用 整型 赋值给 char , 也支持 -
运算符,为字符对应的 assic 码值。
char test_c = 'A';
char test_c = 'B' + ('a' - 'A');
字符串
String库
string test_s = "12";
string hello_s = "hello,world";
//将字符串转换成int类型
stoi(test_s);
//截取字符串,从index开始,截取n个字符。
hello_s.substr(0, 2);
类 Class
类的大小
C++中类的大小由其成员变量的总大小与虚函数数量有关。当类中拥有虚函数时,其会有一个指向 虚函数表 的指针。如:
class No{
public:
virtual void printf() = 0;
private:
int* ptr;
};
//在64位操作系统下,指针大小为8字节。此类的大小 = 8(int*) + 8(函数printf 指针) = 16
输入输出
分割输入的字符串
标准模版库STL
标准模版库 使用 泛型编程 提供了许多模版,可以方便地将其使用在各种类型中。
vector
vector类似于数组,但可以动态变化大小(其实别人在底层封装写好实现的)。
#include<vector>
using namespace std;
//初始化一个大小为1的 string vector容器
vector<string> result(1);
//清空容器中的元素
result.clear();
//向容器中压入元素
result.push_back('hello');
//重新定义容器大小,多出的元素直接删去
result.resize(1);
map 与 unordered_map
两者都是哈希表。两者的区别在于map存储的数据是有序的,而 unordered_map 中的数据则是无序的。
#include<unordered_map>
using namespace std;
unordered_map<string, string> mapping_relation;
//新增键值对
mapping_relation["hello"] = "world";
//查看是否有 "hello" 这个key值,有则返回1。
mapping_relation.count("hello");
//可以直接使用, "world"
mapping_relation["hello"]
unordered_set
queue
标准模版库中封装了队列可以直接使用。
#include<queue>
using namespace std;
# 初始化一个int队列
queue<int> testQueue;
# 入队操作
testQueue.push(5);
# 返回队首元素
int test = testQueue.top();
# 出队操作,不会返回如何东西
testQueue.pop();
# 查看队列是否为空
bool eTest = testQueue.empty();
函数
友元
友元函数并非类的成员函数,但可以有权限访问类的私有变量。友元函数通常被看作类的扩展接口,通常使用在为类重载二元运算符中。
Lambda函数
Lambda函数
文件操作
文件操作方式:
r #只读模式打开文件,文件必须存在。
w #只写模式打开文件,文件不存在时创建。内容在清空文件原始内容后添加
a #追加模式打开文件,文件不存在则创建。内容添加到文件末尾
b #以二进制进行操作,文件内容以二进制形式进行读写。