C++ Primer Plus(十一) 使用类

  1. 不要返回指向局部变量或临时对象的引用,函数执行完毕后,局部变量和临时对象都将消失,引用将指向不存在的数据。

  2. C++对用户定义的运算符重载的限制:

    1. 重载的运算符不必是成员函数,但必须至少有一个操作数是用户定义的类型。

    2. 使用运算符时不能违反运算符原来的句法规则,不能修改运算符的优先级。

    3. 不能创建新的运算符。

    4. 不能重载以下的运算符:【sizeof,.,.*,::,?:,typeid,const_casr,dynamic_cast,reinterpret_cast,static_cast】

    5. 以下的运算符只能通过成员函数进行重载:【=,( ),[ ],->】

  3. 如果要为类重载运算符,并将非类的第一项作为其第一个操作数,则可以用友元函数来反转操作数顺序。

  4. 只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据;通过使用友元函数和类方法,可以用同一个用户接口表达这两种操作,类方法和友元只是表达类接口的两种不同机制。

  5. 友元要将关键在friend放在原型声明前,但不要在定义中使用关键字friend。

  6. 虽然友元函数是在类声明中声明的,但它不是成员函数,一次不能用成员运算符来调用。

    虽然友元函数不是成员函数,但它与成员函数的访问权限相同。

  7. 假设有构造函数Stone(double),如果在类构造函数声明中使用了关键字explicit,则该构造函数只能用于显式强制转换,否则还可以用于下面的隐式转换:

    1. 将对象初始为double值时

    2. 将double值赋给Stone对象时

    3. 将double值传递给接受Stone参数的函数时

    4. 返回值被声明为Stone的函数试图返回double值时

    5. 在上述任意一种情况下,使用可转换为double类型的内置类型时

  8. 被称为转换函数的特殊类成员运算符函数,用于将类对象转换为其他类型,它没有返回类型、没有参数,名为operator typeName( ),其中typeName是对象将被转换成的类型,将类对象赋值给typeName变量或将其强制转换为typeName类型时,该转换函数将自动调用。

  9. 提供执行自动、隐式转换的函数所存在的问题是:在用户不希望进行转换的时候,转换函数也有可能进行转换。应谨慎的使用隐式转换函数,最好选择仅在显式的调用时才会被执行的函数。在C++98中,关键字explicit不能用于转换函数,但C++11消除了这种限制。

你可能感兴趣的:(C++ Primer Plus(十一) 使用类)