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以免降低封装性.

  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/reasno/p/4771254.html
Copyright © 2011-2022 走看看