心得体会
通过这段时间对运算符重载和STL标准模板库的学习,使我对c++这种编程语言又有了些新的认识。
首先,在编写类程序的过程中,如果某种运算不能实现预期的功能,我们可以通过运算符重载来
重新制定某种运算规则,这在某种程度上可以使程序更加简洁,减少编程时间,运算符重载的实质
就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型,从而实现功能。
其次,我们在定义类时,可以用对象调用函数的形式来使用STL标准模板库规定的一些以类封装好
的工具,这些工具是由可适应不同需求的集合类以及对这些数据集合的算法组成,可以满足不同需要,
是系统自定义的数据类型,不属于c++基本数据类型,提供了适应更多数据的通用类型,即规定了模板
数据成员的类型可以自己来定义,元素可以是任意类型,没有限定,这就使得程序设计更加的灵活和
方便,根据自己的需求来添加数据类型。
在使用运算符重载和STL中应该注意的问题
1、在运算符重载时,一定要自定义一个拷贝构造函数,这样在重载运算符返回对象副本的时候,编译器
会自动调用拷贝构造函数,否则会出现结果错误。
2、流运算符不能重载为成员函数,只能用友元函数重载,如果要用成员函数,则会有cout.operator<<(const F& f),
所以这是不可能的.因此只能用友员来实现,operator<<(cout,f) 而cout是ostream型的,因此有以下标准格式.
注意不能加const,因为cout是要改变的,会改变里的缓冲成员.
ostream& operator<<(ostream& out,class_name& obj)
{
out<<obj.item1;
out<<obj.item2;
.. .
out<<obj.itemn;
return out;
}
istream& operator>>(istream& in,class_name& obj)
{
in>>obj.item1;
in>>obj.item2;
. . .
in>>obj.itemn;
return in;
}
3、 在类成员函数中重载运算符是不允许返回引用的,会出现“返回局部变量的地址”警告
4、
强制类型转换:类型(数据) --> (不必写返回类型,因为始终与后面的类 型是相同的) operator类型(无形参)
只能写成成员函数,不能是友员.
#include<iostream>
using namespacestd;
class A{
int data;
public:
A(intd=0):data(d){}
operator int()
{
return data;
}
operator bool()
{
return data!=0;
}
operator char()
{
return (char)data;
}
};
int main()
{
A a1(65),a2(200);
cout << "a1="<< (char)a1 << endl;
int d=a2;
if(a2)
cout << "good"<< endl;
}
5 、STL迭代器失效问题
容器本身是空的,使用迭代器前,需要检验迭代器是否有效。
容器本身增删失效,erase返回的是下一个迭代器,容器改变了插入删除了那么原来的迭代器就很容易失效。
6.STL结构体里面包含有 STL容器,那么不能使用memset来初始化
容器本身是空的,使用迭代器前,需要检验迭代器是否有效。
容器本身增删失效,erase返回的是下一个迭代器,容器改变了插入删除了那么原来的迭代器就很容易失效。
6.STL结构体里面包含有 STL容器,那么不能使用memset来初始化