通常的,关于一个类,包含了下面几个方面:

1  声明类成员和接口;2 定义类接口函数(方法)3通过接口调用类

下面先给出第一条:声明类成员和接口

 # ifndef MYTIME0_H_
# define MYTIME0_H_ class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m = );
void AddMin(int m);
void AddHr(int h);
void Reset(int h = , int m = );
Time Sum(const Time &t) const;
void Show() const; };
# endif

关于该类声明:

1  主要到类成员放在private中,类接口放在public中(private中的成员不允许通过外部对其访问)。很多时候,采用这样的方式使得逻辑更清晰

2  public声明中,有Time()函数,函数名Time和类名相同,说明这是构造函数,用于完成类初始化定义(在创建类对象之前,会首先调用构造函数初始化对象,然后才能生成对象)

3  public中,有两个Time()函数,他们均为构造函数,且使用了函数重载的功能(函数名相同,特征标不同),实际创建对象调用时会采取最佳匹配准则。

4  注意第15行代码,在类声明中,就允许产生该类定义的形参(这里是引用变量t),注意到,这里的函数的返回类型是Time类(创建类的初衷就是让类变的可以和基本类型一样操作自如,因此可以认为这里和int等没有区别)

疑惑:

A  搞清1,2,19行的代码究竟起到什么作用???

B 15,16行的代码,const为什么放在函数名的后面,有什么作用???

下面先给出第二条:定义类接口函数

 # include "iostream"
# include "mytime0.h" Time::Time()
{
hours = minutes = ;
} Time::Time(int h, int m)
{
hours = h;
minutes = m;
} void Time::AddMin(int m)
{
minutes += m;
hours = minutes / ;
minutes = minutes % ;
} void Time::AddHr(int h)
{
hours = hours + h;
} void Time::Reset(int h, int m)
{
hours = h;
minutes = m;
} Time Time::Sum(const Time &t)const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / ;
sum.minutes = sum.minutes % ;
return sum;
} void Time::Show()const
{
using std::cout;
using std::endl;
std::cout << hours << "hours," << minutes << "minutes" << endl;
}

关于该类接口函数定义:

1 注意第二行,要将.h头文件包含进去,虽然这个cpp文件同样是头文件

2 注意在定义接口函数的时候,涉及到类作用域的问题,即我们所定义的接口函数,都是类中的函数,因此需要用类作用域限定接口函数,::为作用域运算符。(作用域保证了一个域内的东西和另一个域中同名的东西不会冲突)

3 两个Time()构造函数是没有函数返回类型的

4  注意,函数 返回类型 是写在 类名 前面的!!!

5  33-39行代码,请仔细分析:注意开头的两个Time,第一个表示函数的返回类型,第二个限定类作用域,参数采用引用变量可以占用更少的内存,因此在使用类这种复杂的数据结构的时候,通常会使用引用变量。

6  39行返回了一个Time类型的数据,要注意return返回的机制:返回结束返回之前,局部变量和临时对象会被销毁,(return 变量)则创建了变量的副本,返回副本值。所以这里不能返回Time&,即time引用。

7  类接口函数中,可以使用类成员变量。

小结:

不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量会被销毁,引用将指向不存在的数据。

下面先给出第三条:通过接口调用类

 # include "iostream"
# include"mytime0.h" int main()
{
using std::cout;
using std::endl;
Time planning;
Time coding(, );
Time fixing(, );
Time total; cout << "planninf time =";
planning.Show();
cout << endl; cout << "coding time =";
coding.Show();
cout << endl; cout << "fixing time =";
fixing.Show();
cout << endl; total = coding.Sum(fixing);
cout << "total time =";
total.Show();
cout << endl; system("pause");
return ; }

关于该类调用:

1  开头仍然要包含类声明头文件

2  第8行代码声明planning对象时,构造函数使用第一个Time函数,9,10行声明时,采用第二个Time函数。

3  当我们看到coding.Show()这样的一行代码时,想到的应该是:首先,之前通过最优匹配的构造函数,初始化了coding对象的成员(这一步很关键),然后,show()方法可在其函数内部调用初始化好了的coding成员。

3  注意第25行代码:隐式调用了conding对象自己的成员,显示将fixing对象作为参数传递进去(承接3的描述)。

c++入门之类——进一步剖析的更多相关文章

  1. 从零开始入门 K8s | 深入剖析 Linux 容器

    作者 | 唐华敏(华敏)  阿里云容器平台技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 15 讲. 关注"阿里巴巴云原生"公众号,回复关键词 ...

  2. boost.asio源码剖析(一) ---- 前 言

    * 前言 源码之前,了无秘密.                                                       ——侯捷 Boost库是一个可移植.提供源代码的C++库,作 ...

  3. 类和对象:面向对象编程 - 零基础入门学习Python037

    类和对象:面向对象编程 让编程改变世界 Change the world by program 经过上节课的热身,相信大家对类和对象已经有了初步的认识,但似乎还是懵懵懂懂:好像面向对象编程很厉害,但不 ...

  4. c++入门之运算符重载

    c++函数重载:可以将一个函数名用于不同功能的函数.从而处理不同的对象.对于运算符,同样也有这样的用途,即对同一个标志符的运算符,可以运用到不同的功能中去. 首先引入:运算符重载,在C语言中甚至都有运 ...

  5. 解决Tomcat10.0.12源码编译问题进而剖析其优秀分层设计架构

    概述 Tomcat.Jetty.Undertow这几个都是非常有名实现Servlet规范的应用服务器,Tomcat本身也是业界上非常优秀的中间件,简单可将Tomcat看成是一个Http服务器+Serv ...

  6. 实战 PureMVC

    最近看PureMVC,在IBM开发者社区发现此文,对PureMVC的讲解清晰简洁,看了可快速入门.另外,<腾讯桌球>游戏的开发者吴秦,也曾进一步剖析PureMVC,可结合看加深理解. 引言 ...

  7. C#本质论第四版-1,抄书才能看下去,不然两三眼就看完了,一摞书都成了摆设。抄下了记忆更深刻

    C#本质论第四版-1,抄书才能看下去,不然两三眼就看完了,一摞书都成了摆设.抄下了记忆更深刻 本书面向的读者 写作本书时,我面临的一个挑战是如何持续吸引高级开发人员眼球的同时,不因使用assembly ...

  8. 从ApacheTomcat架构谈面试到源码编译环境v10.0.12

    概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...

  9. 非寻常方式学习ApacheTomcat架构及10.0.12源码编译

    概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...

随机推荐

  1. mssql sqlserver 下文分享一种新颖的字符串截取方法

    原文地址:http://www.maomao365.com/?p=7307 摘要:    以前分割字符串时,都使用类似split函数的方式处理,下文分享一种对有规律的字符串的分隔方式,    即:1. ...

  2. 在CentOS上配置SAMBA共享目录(转载)

    在CentOS上配置SAMBA共享目录 From: https://blog.csdn.net/qiumei1101381170/article/details/53265341 2016年11月21 ...

  3. 4. svg学习笔记-文档结构元素和样式的使用

    svg除了绘图元素之外还有一部分是专门用于文档结构的,这类元素有<g>,<use>,<defs>,<symbol>等 <g>元素 如果我们仅 ...

  4. Python3中操作字符串str必须记住的几个方法

    几个Python的字符串常用内建函数 1.方法:Python3 isdigit()方法 描述:Python isdigit() 方法检测字符串是否只由数字组成. 语法:str.isdigit() 参数 ...

  5. python——函数之生成器

    1 生成器函数的含义    生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法.相较迭代器而言,生成器简单使用. 2 生成器的创建方式 2.1 ...

  6. Scrapy 框架 CrawlSpider 全站数据爬取

    CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...

  7. SQL Alias(别名)

    通过使用 SQL,可以为列名称和表名称指定别名(Alias). SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS a ...

  8. Python中使用class(),面向对象有什么优势 转自知乎

    https://www.zhihu.com/question/19729316 首先我是辣鸡,然后这个问题的确有点意思 首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个 ...

  9. Mybatis之插件拦截

    参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默 ...

  10. 003_python学习之 字符串前'r'的用法

    在打开文件的时候open(r'c:\....') 加r和不加''r是有区别的 'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子 ...