1.缘由
工作需要,再次接触C++项目,上次、上上次接触还是2014年上半年和2012年下半年了>_<
有感要记录下这个过程,一方面避免印象逐渐淡化导致日后重复造轮子,另一方面也想做一些分享。
2.方向
工欲善其事必先利其器。对待问题要将其抽象化、泛化为一般性问题,突出问题的特点后才便于查找解决。
3.点滴记录
161121
WinMain几问:
- WinMain的特点是?
- 和main函数的区别和联系是?
- 哪些情况下会用到WinMain?
- 函数定义是?
pragma warning的作用?
map型数据结构
说起map,首先要介绍下“关联容器”。关联容器是按关键字来存储的。map就是一种关联容器。关联容器有:
- map 字典(key-value对)
- set 集合(与列表做区分,集合中不会有多个相同的元素)
- multimap
- multiset
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
(单看数据结构名有种python的感觉)
# include <map>
std::map<int, FILE*> fileMap; // 用int做key,构造一个文件映射
throw
通过throw语句,我们可以raise一个异常
throw时可以接一些方法,例如stdexception里的:
throw runtime_error("It's error msg~");
typedef
类型别名,用于给数据结构一个直观的名字(说不直观的童鞋习惯就好~)
//老式风格
typedef int filekey;
//新式风格(cpp 11)
using filekey = int;
namespace
多个库开发时可能会出现namespace pollution,前人有通过其很长的名字(库前缀)来避免,然而也是蛋疼。namespace就提供了一种控制手段。
namespace cpp_test {
class CTest {
/* ... */
};
}
疑点:namespace中重载运算符有啥特点,使用时需要注意什么?
namespace可以不连续
pragma
一个有点复杂的预处理指令,用于设定编译器状态或指示编译器完成一些特定动作。编译指令对每个操作系统是不同的,而且对每个编译器也不同。
// message: 编译时可以打印出来咯
#ifdef _X86
#pragma message("_X86 macro activated!")
#endif
// code_seg: 设置代码存放的代码段,开发驱动程序使用
#pragma code_seg(["section-name"[,"section-class"]])
// once: 本文件只编译一次。和ifdef那种套路一样,但后者跨平台性能更好(毕竟pragma对编译器有要求)
#pragma once
// warning: 对警告进行处理
#pragma warning(disable:450734)//不显示4507和34号警告信息
#pragma warning(once:4385)//4385号警告信息仅报告一次
#pragma warning(error:164)//把164号警告信息作为一个错误。
// 一个常用套路
#pragma warning(push)
#pragma warning(disable:4705)
#pragma warning(disable:4706)
#pragma warning(disable:4707)
// ...
#pragma warning(pop)
// 在这段代码的最后,重新保存所有的警告信息
vs项目目录中的名词
结构
- 解决方案
- 项目
- 筛选器
- 文件
多项目的意义:每个项目被编译为一个程序集,把相关的项目放入同一个解决方案,便于组织项目文件、共享组件和源代码、批量编译和测试。
运算符new/delete的重载
自己担负起控制内存分配的职责
161123
void指针
int val = 5;
int *p = nullptr; // 等价于0
p = &val;
void *x = p;
void指针主要用于函数的输入输出,及void指针间相互赋值
基本数据类型与类型修饰符
int、double这些属于基本数据类型,*、&这些属于类型修饰符。
int *p, val;
int* p, val;
// 二者是等价的,都是只有p为int型指针
int *a = nullptr;
int *&r = a; // r是a的引用。阅读顺序从右到左
int **p = &a; // p是指向a的指针
const限定符
默认只在单文件内有效。需要多文件共享需要声明为extern
const int pi = 3.14;
extern const int a = 1;
int *const p1; // 顶层const,指针本身是个常量
const int *p2; // 底层const,指针所指向的对象是个常量