C++_类入门2-使用类
进一步探讨类的特征,重点是类设计技术,而不是通用原理。一些特性很容易,一些特性很微妙。
运算符重载
目的是使C++操作更美观,更接近于内置类型的操作。
隐藏了内部的实现机理,并强调了实质。
格式:operator + ()
==========================================
计算时间:一个运算符重载的示例
==========================================
友元
C++类的私有数据成员的访问只能通过类公有成员函数,这种访问方式限制太严格,有时候不需要另一种访问类私有数据成员的方式。
友元:友元函数不是类的成员函数,但是能够访问类的私有数据成员。
之前有个矛盾就是规定非成员函数不能直接访问类的私有数据,但是这会儿却可以,但那只是针对常规非成员函数而言,特殊的非成员函数就可以访问类的私有数据——友元函数。
创建友元: 必须将其原型声明放在类声明中,并且在原型声明前加上关键字friend;[j周3]
例:friend Time operator* (double m, const Time & t);
友元函数就是这么特殊,虽然在类中声明,却不是类的成员函数,这是因为加了前缀friend。
编写函数定义:不需要加friend。
友元的理念是否有悖于OOP:
可以把友元看成与类方法一样都是表达类接口的一种方式。
友元的作用:可以用它来反转操作数的顺序;
之前类重载运算符,必须将非类项放在运算符后面,运算符左边的操作数必须是类对象,右边的是其他数;有顺序要求,不能随便调。
Time = Time +1.1 //Time是类
但是写成 Time =1.1 +Time //就不行
==========================================
重载运算符:作为成员函数还是非成员函数
==========================================
再谈重载:一个矢量类
==========================================
类的自动转换和强制类型转换
类型转换包括:强制类型转换和自动类型转换;
要考虑兼容性,不能会报错;C++语言不支持自动转换不兼容的类型;
类的构造函数,可以将某种类型-->类的类型;
Stonewt MyCat;
MyCat =19.6; //如果构造函数加了explicit,则无法自动转换,explicit用于关闭自动转换特性。如果没有加explicit,则会进行自动转换,自动过程是使用构造函数Stonewt(double)创建一个临时的Stonewt对象,然后将19.6作为初始化值。采用逐成员赋值的方法将该临时对象的内容复制到myCat中。隐式转换。
Mycat =Stonewt(19.6); //如果有explicit,用这种格式也可转换;
Mycat =(Stonewt)19.6;
//注意,只接受一个参数的构造函数才能成为转换函数。如果构造函数有两个参数,就不能用于类型转换。
class Stonewt
{
private:
enum{Lbs_per_stn = 14};
int stone;
double pds_left;
double pounds;
public:
Stonewt(double lbs);
Stonewt(int stn, double lbs);
Stonewt();
~ Stonewt();
}
转换函数
将类转换成其他类型;
Stonewt wolfe(285.7);
double host = wolfe;
可以这样做,但是不能使用构造函数,构造函数只适合用于将其他类型转换成类的类型。
要使用特殊的C++运算符函数——转换函数。
转换函数也是类的成员函数,
特点:
转换函数必须是类方法;
转换函数不能指定返回类型;
转换函数不能有参数;
class Stonewt
{
private:
enum{Lbs_per_stn = 14};
int stone;
double pds_left;
double pounds;
public:
Stonewt(double lbs);
Stonewt(int stn, double lbs);
Stonewt();
~ Stonewt();
operator int() const; //转换函数
operator double() const; //转换函数
}
Stonewt::operator int() const
{
return int (pounds + 0.5);
}
Stonewt::operator double() const
{
return pounds;
}
转换函数和友元函数
==========================================
总结
类型转换
友元函数
运算符重载
C++_类入门2-使用类的更多相关文章
- C++_类入门3-嵌套类
可以将类B声明在另一个类中.在另一个类A中声明的类B被称为嵌套类(nested class). 类A的成员函数可以创建和使用嵌套类B的对象. 当且仅当声明为公有部分时,才能在类A的外面使用嵌套类.而且 ...
- C++_类入门1-对象和类的介绍
面向对象是(OOP)是特殊的.设计程序的概念性方法:包含以下特性: 抽象: 封装和数据隐藏: 多态: 继承: 代码的可重用性: 为了实现这些特性并且将这些特性组合在一起,C++所做的最重要的改进是提供 ...
- Python全栈开发记录_第九篇(面向对象(类)的学习)
有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...
- 09_Java面向对象_第9天(类、封装)_讲义
今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 A: 面向过程与面向对 ...
- 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录 ===========================获取全局上下文(getA ...
- Object类入门这一篇就够了!
第三阶段 JAVA常见对象的学习 第一章 常见对象--Object类 引言: 在讲解Object类之前,我们不得不简单的提一下什么是API,先贴一组百度百科的解释: API(Application P ...
- Java入门基础(类)
类 在Java中表示自定义的数据类型,一个class可以是若干基本类型的组合. public class Student { public String id;//学号 public String n ...
- 1127: 【入门】A类多?B类多?
1127: [入门]A类多?B类多? 时间限制: 1 Sec 内存限制: 16 MB 提交: 3537 解决: 2406 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 一个自然数转换 ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
随机推荐
- 简单的互斥同步方式——synchronized关键字详解
目录 1. 关于synchronized关键字 2. synchronized的原理和实现细节 2.1 synchronized可以用在那些地方 2.2 synchronized是如何实现线程互斥访问 ...
- 【总结整理】webGIS学习thinkGIS(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地
http://www.thinkgis.cn/topic/541a5319da8db186fd06e097 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号.在这一章,我将 ...
- (一)maven的安装
Maven下载 下载地址:http://maven.apache.org/download.cgi 下载完成后,得到一个压缩包
- AlphaPose ubuntu16 python2安装
#https://www.tensorflow.org/install/install_linux#ValidateYourInstallation #https://github.com/MVIG- ...
- 面试题: java多线程 背1
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- Oracle sql语句执行顺序(转)
from: http://blog.csdn.net/lailai186/article/details/12612263 sql语法的分析是从右到左 一.sql语句的执行步骤:1)语法分析,分析语句 ...
- 如何较为方便的在GMap.Net中实现车辆运行轨迹
一.简单的思路 要实现车辆运行轨迹,我们可能需要一个定时触发的机制用来更新Marker的位置,除了位置移动,我们可能还需要动态改变车辆的方向,如下图: 首先,位置移动是最简单的,关键是方向的动态改变如 ...
- sql server重建系统数据库
方法一:https://bbs.csdn.net/topics/100013082 方法二:http://blog.51cto.com/jimshu/1095780 *** 方法三:https://b ...
- MVC c# 调用sql的存储过程
var hid = new SqlParameter { ParameterName = "HistoryId", Value = history.Id, Direction = ...
- [译] 关于 SPA,你需要掌握的 4 层 (2)
此文已由作者张威授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 视图层 现在我们有了一个可执行且不依赖于框架的应用程序,React 已经准备投入使用. 视图层由 presen ...