C++ Primer Notes(14)

来源:互联网 发布:windows桌面插件api 编辑:程序博客网 时间:2024/06/06 06:53

1.重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。对于二元运算符来说,左侧运算对象传递给第一个参数,右侧运算对象传递给第二个参数,除了operator()外,不能有默认实参。

2.当一个重载的运算符函数是成员函数时,this绑定到左侧运算对象,成员运算符函数的参数数量比运算对象少一个。

3.对于一个运算符来说,它或者是类的成员,或者至少含有一个类类型的参数:int operator+(int,int)是错误的。

4.只能重载已有的运算符。

5.不能被重载的运算符: ::      .*      .    ? :

    通常不应该(而不是不能)被重载的符号:逗号、取地址、逻辑与和逻辑或运算。

6.非成员运算符函数调用:data1+data2与operator+(data1,data2)等价;

   成员运算符函数调用:data+data2与data1.operator+(data2)等价。

7.重载运算符的返回类型应该与其内置版本兼容:赋值运算符应返回它左侧运算对象的引用。

8.输入输出运算符的第一个参数是一个ostream或istream对象的引用,第二个参数是要输入或输出对象的引用,返回一个ostream/istream对象的引用;所以重载输入输出运算符函数必须是类的非成员函数,否则其左侧运算对象将是我们的类的一个对象。同时,IO运算符需要读写类的私有成员,所以一般该运算符函数被声明为友元。

8.通常情况下,把算术和关系运算符定义为非成员函数以允许对左侧或右侧的运算对象进行转换。

9.下标运算符必须是成员函数,下标运算符通常以所访问元素的引用作为返回值。如果一个类包含下标运算符,则它通常会定义两个版本:一个返回普通引用,一个是类的常量成员并返回常量引用,eg:string& operator[](size_t n)  {return element[n];}          const string& operator[](size_t n) const {return elemetn[n];}

当作用于一个常量对象时,常量版本下标运算符返回常量引用以确保不会给返回的对象赋值;

10.递增递减运算符重载:

前置运算符返回递增或递减后对象的引用;

后向运算符返回对象的原值(递增递减前的值,而不是引用);

前置:operator++()

后置:operator++(int)  //int参数不会被使用,因此无需命名,编译器为其提供值为0的实参。所以显示调用它为a.operator++(0)。没写0的话就别认为是调用前置版本


11. 一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。

12.函数调用运算符必须是成员函数,一个类定义了调用运算符,则类的对象称为函数对象。


13.如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,有时我们把这种构造函数称为转换构造函数。

14.能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。(explicit能阻止这种一个参数的隐式转换)

15.类类型转换:将一个类转换为另一个类;

16.类型转换运算符:operator type() const;//没有返回类型声明,形参列表也必须为空,type表示某种要转换成的类型,只要该类型能作为函数的的返回类型。

eg:   class smallint

        {

        public:

             operator int() const {return val;}

        private:

             int val;

       };

 smallint si;

si=4;//首先将4隐式地转换为smallint(转换构造函数),然后再调用operator=

si+3;//首先将si隐式地转换为int(通过operator int() const),然后再执行加法;

si+3.1;//将si转换为int,再转换为double


17.显示的类型转换运算符(explicit conversion opreator):

class smallint

{

public:

   smallint(int i):val(i) {}

   explicit operator int () const {return val;}

private:

   int val;

};

smallint si=3;//正确,构造函数不是显示(explicit)的,先将int隐式转换为smallint类型,在调用operator=;

si+3;//错误,此处需要隐式的类型转换,但类型转换运算符是显示的;

static_cast<int> (si)+2;//正确,用static_cast<int>显示的完成转换;

假如构造函数是explicit的,则smallint si=3是错误的,因为si=3需要类型转换,explicit要求必须是显示的类型转换。

应改为smallint si=smallint(3) //直接用构造函数初始化,没有类型转换

或者smallint si=static_cast<smallint>(3)//通过static_cast显示的请求类型转换;


原创粉丝点击