1.操作符重载

  1. 重载操作符的几个限制:

    a)         重载的至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符。

    b)         不能违反操作符原有来的句法规则。

    c)         不能定义新的操作符。另外有一些操作符是不可以重载的,这里不列举。

2.友元函数

  1. 创建友元函数:

    在类声明中加 friend 声明,在定义中不加friend,类的方法定义时加类名和限定符Time::,友元函数的定义则没有:

    //类声明中:
    friend Time operator* (double m, donst Time & t); //类的定义:不带 friend 标识符
    Time operator* (double m, const Time & t)
    {
    ...
    }
  2. 友元函数并没有违反OOP的数据隐藏原则,只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。

  3. 常用的友元: 重载 << 操作符

    作为自定义Time类的友元:

    //声明:
    friend ostream & operator<< (ostream & os, const Time & t);
    //定义:
    ostream & operator<< (ostream & os, const Time & t)
    {
    ...
    }
  4. 在重载操作符时,使用友元函数和类方法不能重复,否则会被视为二义性错误,如下两个只能选择一个:

    //类方法:
    Time operator+ (const Time & t) const;
    //友元函数:
    friend Time operator+ (const Time & t1, const Time & t2);

3.由一个矢量类引出的

  1. 如果方法计算得到了一个新的类对象,则应考虑是否可以使用类构造函数来完成这种工作。这样做不仅可以避免麻烦,而且可以确保新的对象是按照正确的方式创建的。

    Vector Vector::operator+ (const Vector & b) const
    {
    ...
    return Vector (.....);
    }
  2. 一元操作符重载:
    //声明
    Vector operator- () const;
    //定义
    Vector Vector::operator- () const
    {
    ...
    }
  3. 关于随机数:

    包含头文件 <stdlib>。

    标准 ANSI C库(C++中也有)中有一个rand()函数,返回从0到某个值之间的随机整数。rand()函数将一种算法用于一个初始种子值来获得随机数,该随机值将用作下一次函数调用的种子。因此产生的一系列的伪随机数。

    srand()函数允许覆盖默认的种子值,重新启动一个随机数序列。下面的程序在每次程序启动时都会设置不同的种子。(time(time_t)返回从某一时间开始的秒数,要引用<ctime>)

    srand(time( ) );

4.类的自动转换和强制类型转换

  1. 只接受一个参数的构造函数定义了从参数类型到类类型的转换。如果使用关键字explicit限定了这种构造函数,则它只能用于显式转换,否则也可以用于隐式转换。

    //下面的构造函数只能用于显式转换
    explicit Stock(int n);
  2. 转换函数。下面是转换为double类型的转换函数:注意这里是不需要返回类型的,因为double名称已经指出的要返回的类型。

    另:关键字explicit不能用于转换函数。

    //声明。
    operator double(); //定义
    Stock::operator double()
    {
    ...
    return double_val;
    }
  3. 提供转换函数时,应避免调用时的二义性。例如,下面的语句:

    long long_val = stock2;

    会在下面两个转换函数都存在时出错:

    operator int();
    operator long();
  4. (a)对于 Stock = Stock + Stock 的情况:

    可以提供方法定义 或者 友元函数 (只能同时提供一种)来实现:

    //类方法
    Stock operator+ (const Stock & stock1) const;
    //友元
    friend Stock operator+ (const Stock & stock1, const Stock & stock2);

    提供了上面的方法之后,如果还提供了Stock(double) 构造函数,还可以这么做:Stock = Stock + double;

    (b) 但对于 Stock = double + Stock 的情况,只有友元函数才可以。此时C++不会试图将double 转换成Stock类型,若将double 转换成Stock类型,那么double->Stock会变成调用成员函数的对象,因为C++只会对成员函数参数进行转换,而不会对调用成员函数的对象进行转换,所以不能这么做。

  5. 继续鉴于4中提到的问题,每次转换都要调用构造函数,假如要重载加法操作符,我们提供另一种方法,代码虽然多一点,但运行速度快。

    //成员方法
    Stock operator+ (double x);
    //友元函数
    friend Stock operator+ (double x, const Stock & stock);
  6. 在main方法之前插入调用函数的方法。

    定义一个全局对象(即文件作用域的对象):在这个对象的默认构造函数里加入要调用的函数部分。

学习C++.Primer.Plus 11 使用类的更多相关文章

  1. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  2. JavaSE学习笔记(8)---常用类

    JavaSE学习笔记(8)---常用类 1.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类 ...

  3. JavaSE 学习笔记02丨对象与类

    Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...

  4. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  5. SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存

    流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...

  6. Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer

    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...

  7. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  8. 深度学习Keras框架笔记之AutoEncoder类

    深度学习Keras框架笔记之AutoEncoder类使用笔记 keras.layers.core.AutoEncoder(encoder, decoder,output_reconstruction= ...

  9. 深度学习Keras框架笔记之TimeDistributedDense类

    深度学习Keras框架笔记之TimeDistributedDense类使用方法笔记 例: keras.layers.core.TimeDistributedDense(output_dim,init= ...

随机推荐

  1. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  2. JVM监控工具介绍

    JVM监控工具介绍 VisualVM是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力.所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jst ...

  3. js去掉字符串的空格

    //去左空格; function ltrim(s){ return s.replace(/(^s*)/g, ""); } //去右空格; function rtrim(s){ re ...

  4. 请将项目文件中的“AutoGenerateBindingRedirects”属性设置为 true 警告!!!

  5. sharepoint powershell 批量处理匿名访问

    配置Web Application启用匿名访问 Add-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyCont ...

  6. GitHub 实现多人协同提交代码并且权限分组管理

    转载请标明出处: http://www.cnblogs.com/zhaoyanjun/p/5882784.html 出自[赵彦军博客] 2016-09-19 前言: 在上一篇文章中Android gi ...

  7. Android项目实战(二十八):Zxing二维码实现及优化

    前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的ja ...

  8. Hadoop学习2

    搭建伪分布式完成之后: 伪分布式安装详细介绍:http://www.powerxing.com/install-hadoop/ 练习1 编写Java程序实现以下函数: 1.向HDFS中上传文件 2.从 ...

  9. 基于Flume+LOG4J+Kafka的日志采集架构方案

    本文将会介绍如何使用 Flume.log4j.Kafka进行规范的日志采集. Flume 基本概念 Flume是一个完善.强大的日志采集工具,关于它的配置,在网上有很多现成的例子和资料,这里仅做简单说 ...

  10. yii2 左侧菜单子级无法高亮的问题

    作者:白狼 出处:http://www.manks.top/question/20160508000001.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...