• 《C++ Primer Plus》第11章 使用类 学习笔记


    本章介绍了定义和使用类的许多重要方面。
    一般来说,访问私有类成员的唯一方法是使用类方法。C++使用友元函数来避开这种限制。要让函数称为友元,需要在类声明中声明该函数,并在声明前加上关键字friend。
    C++扩展了对运算符的重载,允许自定义特殊的运算符函数,这种函数描述了特定的运算符与类之间的的关系。运算符函数可一个类成员函数,也可以是友元函数(有一些运算符函数只能是类成员函数)。要调用运算符函数,可以直接调用该函数,也可以以通常的句法使用被重载的运算符。对于运算符op,其运算符函数的格式如下:
    operator op(argument-list)
    argument-list表示该运算符的操作数。如果云酸腐是类成员函数,则第一个操作数是调用对象,它不再argument-list中。例如,本章通过为Vector类定义operator+()成员函数重载了加法。如果up、right和result都是Vector对象,则可以使用下面的任何一条语句来调用矢量加法:
    result = up.operator+(right);
    result = up + right;
    在第二条语句中,由于操作数up和right的类型都是Vector美因茨C++将使用Vector的加法定义。
    当运算符函数是成员函数时,则第一个操作数将是调用该函数的对象。例如,在前面的语句中,up对象是调用函数的对象。定义运算符函数时,如果要使其第一个操作数不是类对象,则不许使用友元函数。这样就可以将操作数按所需的顺序传递给函数了。
    最常见的运算符重载人物之一是定义<<运算符,使之可与cout一起使用,来显示对象的内容。要让ostream对象称为第一个操作数,需要将运算符函数定义为友元;要使重新定义的运算符能与其自身拼接,需要将返回类型声明为ostream &。下面的通用格式能够满足这种要求:
    ostream & operator<<(ostream & os, const c_name & obj)
    {
        os << ...; // display object contents
        return os;
    }
    然而,如果类包含这样的方法,它返回需要显示的数据成员的值,则可以使用这些方法,无需在operator<<()中直接访问这些成员。在这种情况下,函数不比(也不应当)是友元。
    C++允许指定在类和基本类型之间进行转换的方式。首先,任何接受唯一一个参数的构造函数都可被用作转换函数,将类型与该参数相同的值转换为类。如果将类型与该参数相同的值付给对象,则C++将自动调用该构造函数。例如,假设有一个String类,它包含一个将char *值作为其唯一参数的构造函数,那么如果bean是String对象,则可以使用下面的语句:
    bea = "pinto";    // converts type char * to type String
    然而,如果在该构造函数的声明前面加上了关键字explicit,则该构造函数将只能用于显示转换:
    bean = String("pinto");    // converts type char * to type String explicitly
    要将类对象转换为其他类型,必须定义转换函数,指出如何进行这种转换。转换幻术必须是成员函数,将类对象转换为typeName类型的转换函数的原型如下:
    operator typeName();
    注意,转换函数没有返回类型、没有参数,但必须返回转换后的值(虽然没有声明返回类型)。例如,下面是将Vector转换为double类型的函数:
    Vector::operator double()
    {
        return a_double_value;
    }
    经验表明,最好不要依赖于这种隐式转换函数。
    与简单的C-风格结构相比:使用类时,必须更谨慎、更小心,单作为补偿,它们为我们完成的工作也更多。

  • 相关阅读:
    给定中序和后序遍历,求前序序列(C++递归方式实现)
    myeclipse2014删除antlr-2.7.2.jar--解决struts和hibernate包冲突
    hadoop1.2.1配置与运行子串统计程序
    任务计划crontab
    建NTP
    vnc下运行runInstall报java错误
    rpm软件安装
    redis
    rpm包和deb包转换
    新老版本centos下载
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5660875.html
Copyright © 2020-2023  润新知