首页 > 编程语言 >面向对象程序设计1.2 类之间的组合关系

面向对象程序设计1.2 类之间的组合关系

时间:2024-06-17 21:28:17浏览次数:9  
标签:count 1.2 Person int month 面向对象 Date 程序设计 day

一、复习一下

在1.1里我们定义了类Date,忘记的小伙伴可以看看下面的代码

class Date
{
private:
    int year;
    int month;
    int day;
    //数据成员,默认为私有

public:
    Date():year(2000),month(1),day(1){}//不带参数的构造函数

    Date(int year,int month,int day)//带参数的构造函数
    {
        this->year=year;
        this->month=month;
        this->day=day;
    }

    /*这里可以缺省参数
    Date(int year=2000,int month=1,int day=1)//带参数的构造函数
    {
        this->year=year;
        this->month=month;
        this->day=day;
    }*/

    Date(const Date&t)  //拷贝构造函数,浅拷贝,系统默认会有
    {
        year=t.year;
        month=t.month;
        day=t.day;
    }
    /*  
        Date data1=(2004,6,5)
        Data data2;
        data2=data1;(错误)
        Data data2=data1;(正确)
        等号需要运算符重载才可以使用。
    */

    ~Date() //析构函数
    {
        cout<<"Distract"<<endl;     //当调用析构函数的时候会输出distract。
    }
    void print()    //普通成员函数
    {
        cout<<year<<"\t"<<month<<"\t"<<day<<endl;
    }

};

二、新内容

同样的,我们定义一个Person类

class Person
{
    string name;
    int age;
    char gender;
    Date date;
    static int count;
public:
    Person(){count++;}
    Person(string name,int age,char gender,int y,int m,int d):date(y,m,d)
    {
        this->name=name;
        this->age=age;
        this->gender=gender;
        count++;
    }
    ~Person(){count--;}
    void print()
    {
        cout<<name<<"\t"<<age<<"\t"<<gender<<"\t"<<endl;
        date.print();
        cout<<count<<endl;
    }

};

int Person::count =0;

在数据成员里,我们发现多了两个东西,一个是Date date,一个是 static

类的组合

Date类是我们上面声明定义过的,所以我们这里可以定义一个Date类的对象

在构造函数里对date对象和私有对象进行初始化

静态成员变量

然后是static,静态成员变量,可以看作一个小范围的全局变量

然后我们去main函数里:

int main()
{
    Person p("Pig",1,'M',2001,1,1);
    Person d,e,f; 
    p.print();
    return 0;
}

这里可以看到我们创建了4个Person类的对象p、d、e、f,并对p进行了初始化。

所以这里每创建一个对象的时候,count都会在原有的基础上+1,会得到如下输出结果

其中第三行的那个4,就是 count的值(看Person类里的print)

再比如说,我们new一个对象,现在的main函数如下:

int main()
{
   Person d("QAQ",1,'F',2000,12,12),e,f;
    Person *p=new Person("Pig",1,'M',2001,1,1);
    p->print();
    delete p;
    d.print();
    return 0;
    
}

输出结果如下:

注意看第三行count值为4,倒数第四行count值为3,这就是delete的时候count--的结果。

注意看上面Person的代码,count的值为私有成员,为了访问count,我们可以用静态成员函数,比如我们可以在下面Public的地方加:

static void printCount()
{
    cout<<count<<endl;
}

这个时候我们就可以通过类名去访问count

int main()
{
    Person d("QAQ",1,'F',2000,12,12),e,f;
    Person *p=new Person("Pig",1,'M',2001,1,1);
    Person::printCount();
    delete p;
    Person::printCount();
    return 0;
}

就会得到如下结果:

友元函数

假设,我们定义了一个整型变量,并初始化 int a=10;

我们想输出a,直接cout<<a;就行了

如果这个时候我们又定义了一个Person x;

我们想像上面一样用cout<<x的形式来输出x的姓名、年龄、性别……

这个时候是不是就要运算符重载一下下(看不懂去看后面的文章)

ostream &operator<<(ostream &q,const Person &p)
{
    cout<<p.name<<"\t"<<p.age<<"\t"<<p.gender<<endl;
    p.date.print();
}

然后这个时候点击运行的手有点抖,感觉哪里不对

然后低头看看就发现了下面这样的报错

然后,恍然大悟!这些是私有成员,不能访问。

这个时候,友元函数就可以出来发光发热。

我们把上面这个函数在Person里friend一下下

friend ostream &operator<<(ostream &q,const Person &p);

意思就是说,上面写的这个函数,是Person的朋友。好朋友要倾囊相助。

于是,这个函数就可以访问到了Person里的私有成员。

我们改一些main函数,然后来运行一下:

//main
int main()
{
    const Person p("Pig",1,'M',2001,1,1);
    cout<<p<<endl;
    return 0;
}

三、写点啥练练手

定义一个类Point

私有成员:x,y

构造函数:有参数,给数据成员赋初值(0,0)

成员函数自己写

定义一个矩形类Rectangle,

私有成员:Point p1,p2,p3,p4用来表示矩形的四个顶点

构造函数:有参数,给数据成员赋初值

printArea()函数返回矩形面积。

printHeight()函数返回矩形的高

printWidth()函数返回矩形的宽。

标签:count,1.2,Person,int,month,面向对象,Date,程序设计,day
From: https://blog.csdn.net/t_ingting/article/details/139752814

相关文章

  • (11.3)iic串口读写EEPROM实验:程序设计
    一、实验任务二、架构框图其中:i2c驱动模块: bit_ctrl:0代表发送8位字节地址;1代表发送16位字节地址(本实验采用)i2c_addr[15:0]:16位字节地址,当bit_ctrl为0时只有低8位是有效的i2c_data_w[7:0]:向EEPROM写入的8位数据i2c_exec:拉高代表当前进行......
  • 【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object
    ......
  • 【并发程序设计】总篇集 Linux下 C语言 实现并发程序
    11_Concurrent_Programing文章目录11_Concurrent_Programing1.进程概念进程内容进程类型进程状态2.进程常用命令进程信息命令top命令进程信息表进程优先级命令nice命令renice命令后台进程命令3.子进程创建子进程fork函数结束进程exit函数_exit函数回收子进......
  • C语言程序设计(第四版)第十章主要内容
    本章主要讲述了<字符串>一、字符串字面量1.字符串字面量,有时也称为字符串常量,它是由一对双引号括起来的一个字符序列。2."a"是字符串字面量,而'a'是字符常量。3.字符串实际就是由若干有效字符构成且以'\0'作为结束的一个字符序列。二、字符串的存储1.字符串结束标志'\0'也......
  • 北京理工大学第十七届程序设计竞赛决赛
    A.赛前须知输出ACACACACAC即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongintmain(){std::ios::sync_with_stdio(0);std::cin.tie(0);strings="ACACACACAC";for(inti=0;i<s.size();i++)cout<<......
  • (pdf)Head First JavaScript程序设计 ([美]Eric T. Freeman,[美]Elisabeth Robson 著;袁国
    书:pan.baidu.com/s/199LHxxIlMixw3gYSY8tyPw?pwd=ywxg提取码:ywxg数据类型与变量:JavaScript支持多种数据类型,包括数字、字符串、布尔值、对象、数组等。变量用于存储这些类型的值。函数:函数是JavaScript中执行特定任务的可重用代码块。它们可以接受参数并返回结果。条件语句:使......
  • C++面向对象三大特性
    C++三大特性包括了封装、继承、多态。封装:封装是将数据属性和操作这些数据的函数(方法)捆绑在一起的过程。它隐藏了实现细节,只暴露出一个可以被外界访问的接口。封装允许开发者将对象的实现细节保护起来,只提供必要的操作界面,从而减少错误和提高代码的可维护性。继承:继承是一种......
  • FL Studio21.2.2破解版注册机包含破解2024许可证
    FLStudio,即FruityLoopsStudio,自推出以来,在音乐制作领域已赢得了广泛的声誉。这款软件不仅为专业音乐制作人提供了强大的工具集,也为初学者提供了一个直观、易上手的学习平台。它集成了音频录制、编辑、混音、编曲、虚拟乐器演奏和效果处理等多种功能,几乎涵盖了音乐制作的所有......
  • 面向对象 这一文拿捏了 ⭐ (建议收藏)
    面向对象中级部分已整理完成,建议收藏......
  • (高清pdf集合)图灵程序设计丛书:大规模数据处理入门与实战(套装全10册)【图灵出品!一套囊括S
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqso数据处理基础:介绍数据处理的基本概念、流程和应用场景,帮助读者建立对数据处理的整体认识。SQL语言与应用:详细讲解SQL的语法和用法,包括数据查询、数据操作和数据定义等,以及在实际应用中的最佳实践。Python数据挖......