c++补充
友元的成员函数实现
B 类的成员函数 displayB 成为 A 类的友元。因为 A 类声明了 B 类的成员函数为其友元,而 B 类在 A 类之前还没有定义,编译器并不知道 B 的存在。因此,必须先前向声明 B 类
友元的全局函数实现
全局函数是不需要加作用域的
友元全局函数类内声明和类模板
友元全局函数类外声明和类模板
原因是当使用 p2 + p1 这样的语法时,首先编译器会检查 p2 所属的类型 Person,并且优先寻找该类型的成员函数中是否定义了 operator+ 运算符重载。如果找到了成员函数重载,则会调用它,因此调用的是 p2.operator+(p1),即 p2 是调用者,p1 是参数。
但是,如果没有成员函数版本的 operator+ 重载,编译器会再去寻找是否存在合适的全局函数版本 operator+(const Person&, const Person&)。但是例子中的成员函数和全局函数的 + 运算符重载都存在,所以成员函数的优先级更高。
左移运算符通常用于输出流,比如 std::cout,而输出流不是类的成员
当重载了 operator>> 运算符以处理自定义类型(如自定义的Maker 类)时,原有的 cin 操作对于基本类型(如 int 和 string)仍然有效,但当使用cin 对自定义类型进行输入时,编译器会优先选择自己定义的重载版本。
前置自增的语义是“先增加再使用”,所以返回引用是合适的。
后置自增的特点是“先使用当前值,然后再增加”,因此需要先保存当前对象的状态(即创建一个副本),在执行增加操作后返回这个副本。
MyArray.h
MyArray.c
MyArray_main.c
1.函数或类是通用,但是里面的数据类型的多种状态
2.模版有:函数和类
1、局限性
2、具体做法
demo1:(不建议 失去模板通用性)
demo2:
类模板的分文件编写出现的问题:
类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决:
解决方式1:直接包含.cpp源文件
解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制
解决方式1的分文件编写:
person.h
person.c
90 类模板的分文件编写
91 类模板的分文件编写2.cpp
对于模板类,编译器必须在编译时看到模板的全部实现,才能根据不同的模板参数生成相应的代码。
模板的二次解析机制:C++ 使用两阶段的模板解析。第一次解析是在模板定义时,只会检查语法而不会实例化模板。第二次解析是在模板被实例化时,这时候编译器需要看到所有模板相关的定义。
C++中有两种函数:全局函数和成员函数,二者区别如下: 全局函数位于对象和类之外,成员函数(也称为成员方法)位于类内
1、类中函数前面加friend的函数; 2、该函数不属于任何对象,其实就是一个全部函数,但是这个全局函数仅仅作用于该类的对象。 3、该函数可以访问该类的私有成员变量
vectorv1;//这个调用了std::vector的默认构造函数
std::vector v(10);//这个调用了std::vector的有参构造函数
vector v1 = {1, 2, 3}; // v1 初始化
vector v2 = v1; // 调用拷贝构造函数,v2 是 v1 的拷贝
vector(v)//创建了一个 std::vector 类型的临时对象,并使用已有的对象 v 进行初始化
支持随机访问迭代器的容器
std::vector
动态数组,支持快速随机访问,适合频繁访问和修改元素。
std::deque
双端队列,支持在两端快速插入和删除,同时支持随机访问。
std::array
固定大小的数组,支持随机访问,适合用于已知大小的数组。
std::string
字符串类,也可以视为字符数组,支持随机访问字符。