【学习笔记】C++相关知识点整理

C++ 中的类型转换

基本转换

  1. 隐式转换:由低精度的数据类型转换为高精度的数据类型(int->double)
  2. 显式转换:显式的,由高精度强制转换为低精度数据类型(double->int),存在丢失精度的问题

四种强制转换

强制转换格式:

	b = XXXX_cast(a);
  1. static_cast:通用转换,C++中的基本数据类型之间的转换(如char和int等),隐式转换基本都是static_cast
  2. const_cast:常量转换,将常量指针/引用转为非常量的,仅适用于指针/引用,不适用于其他基本数据类型
  3. dynamic_cast:通常在基类和派生类之间转换使用。static_cast转换也可以用于基类和派生类之间,但在基类转化为派生类时并不安全(没有进行动态类型检查)
  4. reinerpret_cast:强制转换,用于进行两种无关的类型转换

STL库中的常用容器

c.size() && c.capacity():
		c.size():容器中当前占有的存储量(现在里面存了多少个)
		c.capacity():容器预计占有的存储量(现在里面可以存多少个)
  1. list:双向链表,每个数据块有一个前向指针和后向指针,需要一个存储空间就开辟一个(不连续),双端都可以进行push和pop,插入和删除方便,但不方便随机访问。

  2. vector:数组,由单向链表实现。根据需要在初始化时申请一大块整块的内存空间进行存储,仅支持尾部的push和pop,支持随机访问,但不便于进行随机插入和删除。
    + 如果超出一开始申请的存储容量,需要另申请一块更大的,将整个vector拷贝过去,并释放原有空间。

  3. deque:双端队列(double-end queue)。合并了list和vector,在list的基础上可以进行随机访问,但同样占用较多内存。

  4. set:集合,由红黑树实现,可以进行快速的随机访问及删除、插入等操作。与vector相比,set中的元素全部为不重复的。

  5. map:类似于Python中的dic,元素形式为[key:value],同样由红黑树进行实现。

多态

  1. 静态多态:编译前绑定,根据绑定的内容确定运行时执行的函数体内容;
  2. 动态多态:运行时绑定。

符号重载&关键字重载

符号重载:

T* operator <符号>(parameters)
  1. new:void * operator new (size_t size){}
    new关键字工作原理:(1)malloc一个内存空间;(2)进行内存空间初始化
    该过程不可编辑,不可更改,但可以使用重载进行改写:
void * operator new (unsigned int size, const char* file, int line)
{
	void * p = operator new(size); // 此处调用原有的new
	return p;
}

#define new new(__FILE__, __LINE__)
  1. delete
    delete关键字重载时无需宏定义,但需要重新定义两个函数进行内存释放:delete与delete []。
void operator delete (void * p)
{
	free(p);
	return;
}

void operator delete [] (void * p)
{
	free(p);
	return;
}

对于数组来说,delete和delete[]的效用一样,但delete []可以在对象 数组释放时逐个进行析构,这一步底层通过循环来实现。

深拷贝&浅拷贝

  1. 深拷贝:内存资源重新分配,拷贝的内容包括一个新的地址,存储拷贝的值内容;
  2. 浅拷贝:内存资源不分配,拷贝的内容指向原有地址,即新增一个指针。(operator = 为浅拷贝)

你可能感兴趣的:(笔记整理,笔记整理,编程基础,C++)