zoukankan      html  css  js  c++  java
  • Effective C++ 条款24 若所有参数皆需类型转换,请为此采用non-member函数

    1. 通常,将只接受拷贝构造函数声明为explict是一个不错的主意,因为这可以避免自动的隐式类型转换所带来的错误,但有些情况下,使类支持隐式类型转换是可行的,例如自定义的数值类型:

    class Rational{
    public:
        Rational(int numerator=0,int denominator=1);
        int numerator()const;
        int denominator()const;
    private:
        int numerator;
        int denominator;
    }
    View Code

    2. 就1中例子而言,如果想要为Rational类定义数值运算,例如operator*,那么将其声明为non-member-non-friend函数比member函数对混合运算的支持度更好,例如,以下两个函数:

    const Rational Rational::operator*(Rational);
    const Rational operator*(const Rational& lhs,const Rational& rhs);
    View Code

    后者对于Rational和int类型混合运算的支持度显然比前者高:

    虽然对于

    Rational result=oneHalf*1;//oneHalf是Rational类型对象

    两者都能胜任,但对于

    Rational result=1*oneHalf;//oneHalf是Rational类型对象

    只有后者可以调用,这是由于member函数含有一层语义:函数的第一个参数必须是函数所属的类类型对象.

    另外,由于可以通过numerator()和denominator()访问类成员,因此最好不要把operator*声明为friend以免降低封装性.

  • 相关阅读:
    equals方法
    StringBudilde
    日期
    system
    File类
    calender
    stringbuilder tostring
    File的三种构造方法
    Java入门——day52
    Java入门——day53
  • 原文地址:https://www.cnblogs.com/reasno/p/4771254.html
Copyright © 2011-2022 走看看