实习/秋招时按自己需求总结的知识点,内容并不十分详细,建议选择性阅读。
C++基础
如何在main函数之前调用函数
- C语言,采用__attribute__关键字,void f()attribute((constructor))
- C++,构造函数构造的全局对象
static和const的作用和区别
static
- 修饰变量,放在静态存储区,调用时返回的是上次改变之后的结果
- 修饰函数,避免同名问题
- 修饰成员变量,多个类的对象共有,且可在对象呗构造出来之前使用
- 修饰成员函数,多个类的对象共有,且只能访问静态成员变量
const
- 修饰变量,使其不可变
- 修饰引用,避免拷贝
- 修饰指针,常量指针,指针不可变;指向常量的指针,常量不可变
- 修饰成员函数,函数内部不可修改成员变量
指针和引用的区别
- 指针初始化可为null,引用必须绑定对象
- sizeof§返回的是指针字节大小,sizeof(引用)返回的是绑定对象的字节大小
- 指针有自己的空间,而引用只是别名
野指针
- 指向非法内存的指针
- 指向一个被删除对象的指针
new和malloc的区别
- new是按类型分配的,而malloc是按字节数的大小分配的;
- new返回的是特定的类型,而malloc返回的是void*,因此使用时需转换,如下:
char *p = new int[12];
char *p = (char*)malloc(sizeof(char)*12);
- new的对象用delete删除,malloc的对象用free释放
- new不仅会分配内存,还会执行构造函数
- new是一个操作符,可以重载,而malloc是一个库函数
- new会调用构造函数
malloc
malloc用于动态分配内存,为了避免内存碎片以及降低系统调用的开销,malloc采用内存池的方式,先申请大块内存作为堆区,然后将堆区分成若干块,以块作为内存分配的基本单位
malloc在申请内存时,若申请的大小小于128k,则采用brk系统调用,大于128k时,采用mmap系统调用
volatile关键字
百度释义:
易变的; 无定性的; 无常性的; 可能急剧波动的; 不稳定的; 易恶化的; 易挥发的; 易发散的;
指那些会被编译器之外的,如操作系统,硬件或其他线程修改的变量,被修饰为volatile的变量不会被编译器优化,所谓的优化是指:
编译器读取一个变量时,会定位到这个变量的地址里读,下次再读时,就直接取出这个值,而不用再访问地址
但是被volatile修饰的变量,编译器每次读取都会从变量所在的地址里读(这是因为之前读过的变量可能会被操作系统/硬件/其他线程篡改)
extern关键字
https://blog.csdn.net/weixin_37569048/article/details/83378642
修饰变量,在a.c中定义,如int i=2;在b.c中使用,需
extern int i;
extern “C”
目的是为了C++按照C的方式编译,从而实现C和C++的混合编程
比如用C语言开发了一个DLL库并导出,为了能够让C++也能调用,需要在C++中使用 extern “C” 来强制编译器不要修改函数名
在C++中:
// cpp_test.h
# ifndef CPP_TEST_H_
#define CPP_TEST_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif
- C++的运算符重载
可以理解为编译时多态,如对于函数
void f(int i, int i)
编译器会将其编译为
f_int_int
即函数名+参数类型的组合,从而实现运算符重载,而C语言是不会做这个修改的,因此按C++编译的函数,无法在源C文件中找到对应的目标文件,从而报错
final和override关键字
C++11中,在类后面加final关键字使其不可被继承:
class A final { // 不可被继承
};
使用override关键字显示指明重载了某一函数