1. 普通函数不能在头文件中定义:
当多个.cpp调用时,在编译链接时会在.o文件中重复定义报错
2. 为什么内联函数可以在头文件中定义:适用短小函数
当.cpp调用时,编译器只会在当前文件展开该函数,相当于每个.cpp会重新定义该函数,不会在.o文件中生成该函数的符号
3. 为什么模版函数必须在头文件中定义:
- 模板函数的定义实际上是一个“模板”或“蓝图,它并没有真正生成代码,直到你使用它。
- 当你在某个 .cpp 文件中 调用模板函数 时,编译器会根据传入的类型 实例化 这个模板函数。
- 实例化过程 会生成一个具体类型的函数实现,比如 “add(int,int)” 或 “add(double,double)”。
- 模板实例化 是编译器在遇到模板调用时才进行的,编译器需要看到函数模板的定义才能生成相应的代码。
- 如果你将模板函数的定义放在了 .cpp 文件中,那么其他 .cpp 文件调用时,编译器并不会看到模板的定义,从而 无法实例化,就会导致链接错误。
4. 动态库和静态库导出不同,动态库导出必须要导出.lib的符号文件,此时的.lib并不是静态库,而是包含着符号定义的导出库,函数名、变量名等。
5. 指针常量,常量指针的区别:
- 常量指针: int const *p 或者const int p; 表示指针所指向的对象不能被修改,但是指针本身可以被赋值其他地址,也就是说p不能被修改
- 指针常量: int* const p; 表示指针是常量,其不能被修改,但是指针指向的对象能被修改,主要看const作用在什么上
- const int* const p; 第一个const 防止*P被修改,第二个const防止p被修改
6. 函数指针和指针函数:
函数指针:本质是指针,只是指针指向的是某个函数名 int (*f)(int a, int b); f是一个指向返回为int,有两个参数也是int的指针
指针函数:本质是函数,返回类型是指针int *f(int a, int b);
7. inline 函数,关键字inline ,在编译的时候将代码副本放置到每个函数调用的地方,提高计算效率,但是增加体量,内联函数越小越有优势
8. 定位符new, int *p = new(&a) int; 意思是在已有地址a上开辟一块内存,因此不需要使用delete释放
- new是放在堆上的,需要delete释放,属于动态内存分配
9. namespace: 防止多个文件命名冲突,比如头文件1和2都定义了value变量,但是main函数调用的时候就不知道是哪个文件
- 有名的 如namespace nn{}
- 无名 namespace{}
- 有名可以被其他调用,无名只能本文件调用,相当于static
10. 模版函数,比如两个变量实现交换,参数可以是任何类型,这是就需要模板来解决,template f, T可以是任务类型,传参的时候,类型确定即可;
11. 类的构造函数,在类实例化会被调用,用于初始化成员数据
12. 类的私有数据不能再外部通过实例来调用,但是类的成员函数可以赋值修改调用私有数据
13. *this 指向对象自己,每一个类中都有一个this指针指向对象自己,*this就是对象自身的引用,因为this就本来就是对象自己
14. const Stock &Stock::topval(const Stock &s) const;
- 第一个const 修饰的是topval,表示函数中不能修改任何类中的数据
- 第二个const 修饰的是s, 表示s的引用不能被修改
- 第三个const 修饰的是返回值,表示返回的对象也必须是const常量
15. 类中的友元函数在类中声明,但不是类的成员函数,因此不能用::调用,但是和类的成员函数是一样的,可以调用类中的数据和函数
16. 只有static成员数据才可以在外部定义,其他成员数据不可以在内部和外部定义,指定通过构造函数来初始化。
17. C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数
- 主要区别,深拷贝重新生成一块内存来存储,而浅copy只是简单的赋值,当成员中存在指针,则浅copy指向两个相同的地方,析构会导致指针悬挂。
- 拷贝(复制)构造函数只有一个参数,而且必须是当前类的引用,不然会陷入死循环
- 用类的一个对象去初始化另外一个类的时候会用到
- 深copy通过重载运算符实现,通过删除原有指针空间并使用new创建新的指针空间来实现
18. 智能指针:
- 如auto_ptr,其实是一类模版类,用于防止内存泄漏,后来被unique_ptr 取代了 C++11使用这个而不是auto_ptr ,shared_ptr也可以使用
如atuo_ptr str(new )
19. 虚函数 和纯虚函数
- virtual 和 pure virtual
- 虚函数是为了基类和派生类中的同名函数而定义的,目的是派生类可以修改这个函数定义,基类和派生类可通过指针和引用调用