C++之操作符重载学习笔记

来源:互联网 发布:2016韩国进出口数据 编辑:程序博客网 时间:2024/05/20 00:10

看了国嵌的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;

}

 



0 0
原创粉丝点击