C++问题记录之模板:
关于友元的注意事项:
1.友元关系不可传递。
2.友元关系的单向性。
3.友元声明的形式和数量不受限制。
友元只是封装的补充。友元的使用破坏了封装性。
友元函数没有this指针,为什么?
因为this指针是在指向类成员本身,但是友元函数并不在类里面,而是在类外面
友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
友元包括:友元函数,友元类,友元成员函数。
友元成员函数:
普通成员函数:C++ 普通成员函数本质上是一个包含指向具体对象this指针的普通函数,即c++类的普通成员函数都隐式包含一个指向当前对象的this指针。
因此类的静态成员函数和类的普通成员函数的区别是:
静态成员函数不包含指向具体对象的this指针;
普通成员函数包含一个指向具体对象的this指针。
静态注意事项:
1.静态数据成员必须单独初始化。
2.静态成员函数不能调用非静态成员函数和非静态数据成员。反之,非静态的成员函数可以调用静态的成员函数和静态的数据成员。
3.静态数据成员只有一份,且不依赖对象而存在。
4.类的静态成员函数没有this指针,故不能加const关键字。
sizeof求对象的大小。不会包含静态数据成员大小。
静态成员函数上不允许修饰符
5.运算符重载:给原有的运算符赋予新的功能。
本质:函数重载。
关键字:operator
一元运算符重载:-(负号)和++符号的重载。
-(负号)重载:
要返回*this,即对象的引用,如果需要返回的是自身,那么就用引用,如果返回的是临时变量,则不用引用。
++重载(前置和后置):
后置加加重载中,需要返回的是临时变量,前置加加中,返回的是自身的引用。
二元运算符重载(+):
函数中传入了隐形的参数*this,代表加号前面的对象。如:
当前的this指向的是coor1,返回的是临时变量temp。
而对于友元函数重载来说,友元函数不存在this指针,只能传入两个参数。
Const可以写,也可以不写。
<<流运算符重载:
cout是ostream的是一个对象。
必须用友元函数,不能采用成员函数重载。因为流运算符重载函数的第一个参数必须是ostream的一个对象,不能是this指针(当前的对象),而作为成员函数是有this指针的。友元之后,便可以访问类中的数据成员。
[]索引运算符:
模板关键字:template typename class(不是定义类的,表明数据类型的)
STL:标准模板库
向量(vector):对数组的封装
特点:读取能在常数时间内完成。
迭代器(iteration):
List(链表):特点:数据插入速度比较快。使用方法和vector类似
Map(映射):
List不能直接使用list[i]来直接访问数据,故在循环中需要使用迭代器来对list中的数据进行遍历。
Map中没有push_back,用insert