看了国嵌的c++视频,记录一下
C++标准库并不是C++语言的一部分,C++标准库是由C++语言编写而成的类库和函数的集合,C++标准库中定义的类和对象都位于std命名空间中,C++标准库的头文件都不带.h后缀,C++标准库涵盖了C库的功能,C库中<name.h>头文件对应C++中的<cname>
C++标准库预定义了多数常用的数据结构,如字符串,链表,队列,栈等。
C++中通过operator关键字可以利用函数扩展操作符
1.全局的友员重载操作符函数
operator的本质是通过函数重载实现操作符重载
友员函数:
private声明使得类的成员不能被外界访问
但是通过friend关键字可以例外的开放权限,可以访问到私有成员变量。
友员函数就是一种函数。它是一个类的好朋友。所以可以调用这个类中的的所有成员
例如:
Class complex
{
Int a ;
Int b;
Friend complex operator+(constcomplex& c1,const complex& c2);//声明友员函数
Friend ostream& operate<<(ostream& out,const complex& c);//友员函数,重载了运算符
}
然后下面是操作符重载函数的定义。
ostream& operator<< (ostream&out, const Complex& c)
{
out<<c.a<<" + "<<c.b<<"i";
return out;
}
Complex operator+ (const Complex& c1,const Complex& c2)
{
Complex ret;
ret.a = c1.a + c2.a;
ret.b = c1.b + c2.b;
return ret;
}
其实操作符重载函数,也是函数,它的函数名是operator<<,operator+,返回类型一个是ostream&(标准输出类的引用),一个是Complex类,
使用时可以这样使用,
Complex c1(1, 2);
Complex c2(3, 4);
Complex c3 = c1 + c2;
cout<<c1<<endl;
cout<<c2<<endl;
cout<<c3<<endl;
这个时候使用的重载操作符函数是属于全局操作符重载函数,但是它是类的友员函数,所以可以调用类中的私有成员变量。
如果一个函数要作为一个左值使用,那么这个函数必须返回一个引用,
2.操作符重载函数做为类成员
用成员函数重载的操作符比全局操作符重载函数少一个参数,即左操作数,不需要使用friend关键字。
classComplex
{
int a;
int b;
Complex operator+ (const Complex& c2);//成员重载函数
Complex operator++ (int);//成员重载函数
Complex& operator++();//成员重载函数
friendostream& operator<< (ostream& out, const Complex& c);
};
ComplexComplex::operator++ (int)
{
Complex ret = *this;
a++;
b++;
return ret;
}
Complex&Complex::operator++()
{
++a;
++b;
return *this;
}
当无法修改左操作数的类时,使用全局函数进行重载
=, [], ()和->操作符只能通过成员函数进行重载
C++编译器会为每个类提供默认的赋值操作符,默认的赋值操作符只是做简单的值复制
类中存在指针成员变量时就需要重载赋值操作符。
所以在进行类的赋值操作的时候,就要重载=运算符,这个类似于拷贝构造函数中那个,默认的只会进行值的赋值,不会新开辟内存。所以需要用户再自定义。
Array& Array::operator= (constArray& obj)
{
delete[] mSpace;
mLength = obj.mLength;
mSpace = new int[mLength];
for(int i=0; i<mLength; i++)
{
mSpace[i] = obj.mSpace[i];
}
return *this;
}