学习C++.Primer.Plus 11 使用类
1.操作符重载
- 重载操作符的几个限制:
a) 重载的至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符。
b) 不能违反操作符原有来的句法规则。
c) 不能定义新的操作符。另外有一些操作符是不可以重载的,这里不列举。
2.友元函数
创建友元函数:
在类声明中加 friend 声明,在定义中不加friend,类的方法定义时加类名和限定符Time::,友元函数的定义则没有:
//类声明中:
friend Time operator* (double m, donst Time & t); //类的定义:不带 friend 标识符
Time operator* (double m, const Time & t)
{
...
}友元函数并没有违反OOP的数据隐藏原则,只有类声明可以决定哪一个函数是友元,因此类声明仍然控制了哪些函数可以访问私有数据。
常用的友元: 重载 << 操作符
作为自定义Time类的友元:
//声明:
friend ostream & operator<< (ostream & os, const Time & t);
//定义:
ostream & operator<< (ostream & os, const Time & t)
{
...
}在重载操作符时,使用友元函数和类方法不能重复,否则会被视为二义性错误,如下两个只能选择一个:
//类方法:
Time operator+ (const Time & t) const;
//友元函数:
friend Time operator+ (const Time & t1, const Time & t2);
3.由一个矢量类引出的
- 如果方法计算得到了一个新的类对象,则应考虑是否可以使用类构造函数来完成这种工作。这样做不仅可以避免麻烦,而且可以确保新的对象是按照正确的方式创建的。
Vector Vector::operator+ (const Vector & b) const
{
...
return Vector (.....);
} - 一元操作符重载:
//声明
Vector operator- () const;
//定义
Vector Vector::operator- () const
{
...
} - 关于随机数:
包含头文件 <stdlib>。
标准 ANSI C库(C++中也有)中有一个rand()函数,返回从0到某个值之间的随机整数。rand()函数将一种算法用于一个初始种子值来获得随机数,该随机值将用作下一次函数调用的种子。因此产生的一系列的伪随机数。
srand()函数允许覆盖默认的种子值,重新启动一个随机数序列。下面的程序在每次程序启动时都会设置不同的种子。(time(time_t)返回从某一时间开始的秒数,要引用<ctime>)
srand(time( ) );
4.类的自动转换和强制类型转换
- 只接受一个参数的构造函数定义了从参数类型到类类型的转换。如果使用关键字explicit限定了这种构造函数,则它只能用于显式转换,否则也可以用于隐式转换。
//下面的构造函数只能用于显式转换
explicit Stock(int n); - 转换函数。下面是转换为double类型的转换函数:注意这里是不需要返回类型的,因为double名称已经指出的要返回的类型。
另:关键字explicit不能用于转换函数。
//声明。
operator double(); //定义
Stock::operator double()
{
...
return double_val;
} - 提供转换函数时,应避免调用时的二义性。例如,下面的语句:
long long_val = stock2;
会在下面两个转换函数都存在时出错:
operator int();
operator long(); - (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++只会对成员函数参数进行转换,而不会对调用成员函数的对象进行转换,所以不能这么做。
- 继续鉴于4中提到的问题,每次转换都要调用构造函数,假如要重载加法操作符,我们提供另一种方法,代码虽然多一点,但运行速度快。
//成员方法
Stock operator+ (double x);
//友元函数
friend Stock operator+ (double x, const Stock & stock); - 在main方法之前插入调用函数的方法。
定义一个全局对象(即文件作用域的对象):在这个对象的默认构造函数里加入要调用的函数部分。
学习C++.Primer.Plus 11 使用类的更多相关文章
- Kotlin学习笔记(9)- 数据类
系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...
- JavaSE学习笔记(8)---常用类
JavaSE学习笔记(8)---常用类 1.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类 ...
- JavaSE 学习笔记02丨对象与类
Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存
流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...
- Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...
- JavaWeb学习——Servlet相关的接口和类
JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...
- 深度学习Keras框架笔记之AutoEncoder类
深度学习Keras框架笔记之AutoEncoder类使用笔记 keras.layers.core.AutoEncoder(encoder, decoder,output_reconstruction= ...
- 深度学习Keras框架笔记之TimeDistributedDense类
深度学习Keras框架笔记之TimeDistributedDense类使用方法笔记 例: keras.layers.core.TimeDistributedDense(output_dim,init= ...
随机推荐
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
目 录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章 框架总体的设计... 2 2.1 ...
- 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题
最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...
- HTML5标签
可以进行省略的标签 不允许写结束标记的标签:area(定义图像映射中的区域).base(为页面上的所有链接规定默认地址或默认目标).br.col(为表格中一个或多个列定义属性值).embed(定义嵌入 ...
- Linux学习心得之 Linux下命令行Android开发环境的搭建
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...
- iOS之两个ImageView实现图片滚动
原创作者:codingZero 导语 在不少项目中,都会有图片轮播这个功能,现在网上关于图片轮播的框架层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里说说笔者的主 ...
- iOS之自动调节输入文本框的高度
//自动调节输入文本框的高度 - (void)textViewDidChange:(UITableView *)textView{ float height; if ([[[UIDevice curr ...
- 如何获取ios 设备名字 model
由于需要获取设备名字,在网上找了一些方法,发现能够解决问题,但是需要做一个匹配,然后设备年年都会出新款,而且设备的种类又很多,所以在获取设备信息后我又做了一个操作,--->我在google上找到 ...
- Linux常用命令:文件与目录
目录与路径 cd:切换目录 例如:cd ~willhua,则回到用户willhua的主文件夹 cd ~或者cd,则表示回到自己的的主文件夹 cd -,则表示回到上个目录 pwd:显示目前所在目录 ...
- Redis 5种数据结构使用及注意事项
1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同 ...
- centos7搭建自己的yum源
http://www.wenbin.cf/post/37/ 1. 安装nginx,createrepo yum install nginx -y yum install createrepo -y ...