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++中类的大小由其成员变量的总大小与虚函数数量有关。当类中拥有虚函数时,其会有一个指向 虚函数表 vtable 的指针。如:

class No{
public:
 virtual void printf() = 0;
private:
 int* ptr;
};

//在64位操作系统下,指针大小为8字节。此类的大小 = 8(int*) + 8(函数printf 指针) = 16

输入输出

分割输入的字符串

标准模版库STL

标准模版库Standard Template Library 使用 泛型编程generic programming 提供了许多模版,可以方便地将其使用在各种类型中。

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 #以二进制进行操作,文件内容以二进制形式进行读写。