zoukankan      html  css  js  c++  java
  • c++入门之类——进一步剖析

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

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

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

     1 # ifndef MYTIME0_H_
     2 # define MYTIME0_H_
     3 
     4 class Time
     5 {
     6 private:
     7     int hours;
     8     int minutes;
     9 public:
    10     Time();
    11     Time(int h, int m = 0);
    12     void AddMin(int m);
    13     void AddHr(int h);
    14     void Reset(int h = 0, int m = 0);
    15     Time Sum(const Time &t) const;
    16     void Show() const;
    17 
    18 };
    19 # 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为什么放在函数名的后面,有什么作用???

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

     1 # include "iostream"
     2 # include "mytime0.h"
     3 
     4 Time::Time()
     5 {
     6     hours = minutes = 0;
     7 }
     8 
     9 Time::Time(int h, int m)
    10 {
    11     hours = h;
    12     minutes = m;
    13 }
    14 
    15 void Time::AddMin(int m)
    16 {
    17     minutes += m;
    18     hours = minutes / 60;
    19     minutes = minutes % 60;
    20 }
    21 
    22 void Time::AddHr(int h)
    23 {
    24     hours = hours + h;
    25 }
    26 
    27 void Time::Reset(int h, int m)
    28 {
    29     hours = h;
    30     minutes = m;
    31 }
    32 
    33 Time Time::Sum(const Time &t)const
    34 {
    35     Time sum;
    36     sum.minutes = minutes + t.minutes;
    37     sum.hours = hours + t.hours + sum.minutes / 60;
    38     sum.minutes = sum.minutes % 60;
    39     return sum;
    40 }
    41 
    42 void Time::Show()const
    43 {
    44     using std::cout;
    45     using std::endl;
    46     std::cout << hours << "hours," << minutes << "minutes" << endl;
    47 }

    关于该类接口函数定义:

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

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

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

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

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

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

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

    小结:

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

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

     1 # include "iostream"
     2 # include"mytime0.h"
     3 
     4 int main()
     5 {
     6     using std::cout;
     7     using std::endl;
     8     Time planning;
     9     Time coding(2, 40);
    10     Time fixing(5, 55);
    11     Time total;
    12 
    13     cout << "planninf time =";
    14     planning.Show();
    15     cout << endl;
    16 
    17     cout << "coding time =";
    18     coding.Show();
    19     cout << endl;
    20 
    21     cout << "fixing time =";
    22     fixing.Show();
    23     cout << endl;
    24 
    25     total = coding.Sum(fixing);
    26     cout << "total time =";
    27     total.Show();
    28     cout << endl;
    29 
    30     system("pause");
    31     return 0;
    32 
    33 }

    关于该类调用:

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

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

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

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

  • 相关阅读:
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
    jq 一个强悍的json格式化查看工具
    浅析Docker容器的应用场景
    HDU 4432 Sum of divisors (水题,进制转换)
    HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
    CodeForces 589B Layer Cake (暴力)
    CodeForces 589J Cleaner Robot (DFS,或BFS)
    CodeForces 589I Lottery (暴力,水题)
    CodeForces 589D Boulevard (数学,相遇)
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/9905977.html
Copyright © 2011-2022 走看看