1.C/C++采用静态编译模型,结构和类的大小都是在编译后确定的
定义结构和类变量时,需要根据大小来分配内存模型
2.头文件包含问题:
(1)可以不包含头文件,那就不要包含
(2)尽量在CPP文件中包含头文件,而非在头文件中
(3)如果两个类相互递归定义,考虑前向声明或友元
(4)使用#ifndef, 不要使用#pragma once(考虑到跨平台问题)
3.virtual 虚函数
虚函数表在编译时生成
4.local static 变量使得函数不具有线程安全,不可重入
5. assert是宏而不是函数,仅在Debug版本起作用
6. 函数调用会产生开销(保护现场、恢复现场),函数开销 = 调用开销 + 函数体开销
7. 函数重载是自然语言一词多义在编程语言中的体现
(1)使代码可读性更好(抽线更好)
(2)构造函数
8. 函数的可变参数没有类型检查,这样不安全
9. 降低函数复杂度是提高软件质量的一个重要手段
10. windows系统底层全部采用Unicode编码,ASCII接口也是在内部调用了Unicode接口,所以WinApp在开发时应采用Unicode字符串
windows的Unicode编码为UTF-16, 而Linux流行的编码方案为UTF-8
11. 0 和 '0' 是不一样
0是整形,内存模型全0
'0'是字符,ascii为33
12. 缓冲区溢出
C字符串以'\0'结尾,如果结尾处没有'\0',就会一直往后找
13. 预处理是编译器的工作,和C语言无关
宏的作用域为文件(所以一般定义在头文件中)
14. 宏没有命名空间的限制
因为命名空间(namespace)是C++的东西,而宏是从C过来的
因为C没有命名空间,所以一个项目引入了很多第三方库之后,很多时候会导致命名冲突、类型重复定义
15. #和##
#:字符串化操作符
#define _raise_error(info) _raise(#info)
##: 符号连接操作符
#define _T(x) L##x
16.