c++体系:语法(const、析构之类)、面向对象(重点:虚函数)、STL(结构、容器实现)、泛型模板、内存管理。
该篇作为C++的学习笔记,看到什么重要的就随意记下来,作为思维锚点,不成体系。
1、string、vector 的=、拷贝构造都是深复制。string.replace(位置, 替几位, "替入字符")、string.at(位置);
2、const_func() const:一个类的常成员函数可以被该类的常量对象调用,而该类的常量对象不能调用普通成员函数,即 const myclass* obj; obj->const_func(); 但不能obj->norlmal_func();该类的非常量对象可以调用所有成员函数;
3、class<type>()实例化一个模板类,模板类的定义都在头文件中;
4、void* 可以指向任意类型的数据:
int *a;
void *p;
p=a;
a = (int*)p;
5、以前,std的容器的allocator都只是melloc的封装,每一个元素都会附带cookie信息;?现在还是吗
6、switch case每个case后要记得加break,不然每个case都会执行一遍;
7、memset:在某块内存内填充某个给定的值;memcpy(void* p1, void*p2, size_t n)从p2处复制n个字符到p1区;memmove和memcpy差不多,只是memmove在p1区与p2区有重叠时,先将重叠区处理了再复制(当p2区在p1区前时,memcpy会丢失重叠区域),而cpy没有;
8、编码问题:c++中要注意三个位置的编码,1)编辑器编码;2)编译器编码;3)运行期编码;三个位置的编码都相同时,才能正确解读字符串。windows下vs默认跟随系统是gbk编码;
9、变量初始化:1)默认初始化,不加圆括号,未定义的值;2)值初始化:加了圆括号,却不提供初值;3)直接初始化,加圆括号,提供初值;4)拷贝初始化,=;5)列表初始化,{},可对容器初始化;
10、解决问题的尚方宝剑:加一个中间层。
11、iterater中会保存三个东西:iter_type:这个iter是什么类型的,如可向前加加的,向后减减的,双向的;value_type:这个iter指向的数据是什么类型的,如string;distance_type:两个iter之间的最大距离可用什么类型表示,如int=4字节表示的最大数字?
12、traits:萃取机,分辨iter是泛化指针(带有type的iter)还是普通指针,并提取iter中上述类型;
13、const 指针只是不能通过该指针修改所指对象的值,而对象是一个普通对象,可在其他地方修改;
14、vs中编辑器编码默认是gbk,编译器也是,只改变编辑器编码时,中文对于编译器来说无法识别,
所以要在 c/c++, 命令行中添加 /utf-8,将编译器的编码方式改为编辑器相同的方式;
15、在python项目中启用混和模式调试,
16、在c++项目中调用python解释器时,除了要包含Python.h的目录,依赖python37.lib等库,在代码处或exe处放入
python.dll之外,还要将python下的Lib文件夹放到exe的目录下,让python可以找到其标准库;
17、c++与python混合调试:需要在vs安装程序中修改python支持,添加python代码工具,并且下载python37.pdb(该文件需要安装python37时勾选下载debug binary);调试选择python/native debug,会提示加载python符号,(将python37_d.pdb拷至python37_d.dll相同目录下/错误!);应设置调试器的工作目录为系统python的工作目录,并且要用python37_d.lib(专门用于调试的库)作为链接库,系统才会在工作目录下找python37_d.dll,然后再在该目录下加载对应的python37_d.pbd符号文件;注:在离线单机上安装vs后出现无法读取项目的错误时,可以试试安装程序中的“修改”,减少一个组件之类的;
18、c++运行python代码时,实际运行的是python37.dll和python37.lib,而不是python.exe;
19、容器的迭代器被删除时,失效的三种情况:
1)数组型容器vector、array:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。解决方法:erase(*iter)的返回值是下一个有效迭代器的值。 iter =cont.erase(iter);
2)链表型数据结构:对于list型的数据结构,使用了不连续分配的内存,删除运