当前位置: 首页 > article >正文

【C++】C++类

文章目录

  • 面向对象程序设计思想
  • 类概述
  • 类的声明与定义
  • 类的实现
  • 对象的声明

面向对象程序设计思想

面向对象是一种符合人类思维习惯的程序设计思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。
在程序中使用对象映射现实中的事物,利用对象之间的关系描述事物之间的联系,这种思想就是面向对象。

面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以了。
面向对象不同于面向过程,它是把构成问题的事物按照一定规则划分为多个独立的对象,然后通过调用对象的方法解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合即可实现应用程序所需的功能,这样当应用程序功能发生变动时,只需要修改个别对象就可以了,使代码更容易维护。

面向对象程序设计思想有三大特征:封装、继承和多态。

1.封装
封装是面向对象程序设计思想最重要的特征。封装就是隐藏,它将数据和数据处理过程封装成一个独立性很强的模块,避免外界直接访问对象属性而造成耦合度过高以及过度依赖。
封装是面向对象的核心思想,将对象的属性和行为封装起来,行为对外提供接口,不需要让外界知道具体的实现细节。例如,用户使用电脑,只需要通过外部接口连接鼠标、键盘等设备操作电脑就可以了,无须知道电脑内部的构成以及电脑是如何工作的。

2.继承
继承主要描述的是类与类之间的关系,通过继承无须重新编写原有类,就能对原有类的功能进行扩展。
例如,有一个交通工具类,该类描述了交通工具的特性和功能,而小汽车类不仅包含交通工具的特性和功能,还应该增加小汽车特有的功能,这时可以让小汽车类继承交通工具类,在小汽车类中单独添加小汽车特有的属性和方法就可以了。继承不仅增强了代码复用性,提高了开发效率,而且也为程序的维护提供了便利。
在软件开发中,继承使软件具有开放性、可扩充性,这是数据组织和分类行之有效的方法,它简化了类和对象的创建工作量,增强了代码的可重用性。

3.多态
多态是指事物的多种表现形态。
例如,上课铃声响起后,各科老师准备去不同的班级上课,上体育课的学生在操场站好了队等体育老师发布口令,上文化课的学生听到铃声后回到各自的班级,这就是多态。
在面向对象程序设计思想中,多态就是不同的对象对同一信息产生不同的行为。多态是面向对象技术中的一个难点,很多初学者都难以理解。面向对象的多态特性使得开发更科学、更符合人类的思维习惯,更有效地提高软件开发效率,缩短开发周期,提高软件可靠性。

类概述

面向对象中的对象需要通过定义类来声明。“对象”是一种形象的说法,在程序中是通过定义类来实现对象的。
C++类不同于汉语中的类、分类、类型,它是一个特殊的概念,可以对同一类型事物进行抽象处理,它也可以是一个层次结构中的不同层次节点。例如,将客观世界看成一个Object类,动物是客观世界中的一小部分,定义为Animal类;狗是一种哺乳动物,是动物的一类,定义为Dog类;鱼也是一种动物,定义为Fish类。类的层次关系如下图所示。
在这里插入图片描述类是一种新的数据类型,它和结构体有些相似,是由不同的数据类型组成的集合体,但类比结构体增加了操作数据的行为,这个行为就是函数。

类的声明与定义

类是对象的抽象,是一种自定义数据类型,它用于描述一组对象的共同属性和行为。
类是用户自己指定的类型。如果在程序中要用到类这种类型,则必须自己根据需要进行声明,或者使用别人设计好的类。
类的声明格式如下:

class 类名 
{ 
权限控制符: 
    成员; 
}; 

关于类定义格式的具体介绍如下:

  • class是定义类的关键字。
  • 类名是类的标识符,其命名遵循标识符的命名规范。
  • 类名后面的一对大括号,用于包含类的成员,类的所有成员要在这一对大括号中声明。类中可以定义成员变量(也称为属性)和成员函数(也称为方法),成员变量用于描述对象的属性,成员函数用于描述对象的行为。
  • 声明类的成员时,通常需要使用权限控制符限定成员的访问规则,权限控制符包括public、protected和private,这三种权限控制符的权限依次递减。
  • 大括号的后面的一个分号“;”用于表示类定义的结束。

权限控制符介绍
public(公有类型):被public修饰的成员也称为公有成员。公有成员是类的外部接口,可以被所属类的成员函数、类对象、派生类对象、友元函数、友元类访问。
protected(保护类型):被protected修饰的成员称为保护成员,其访问权限介于私有和公有之间,可以被所属类的成员函数、派生类对象、友元类和友元函数访问。
private(私有类型):被private修饰的成员称为私有成员,只能被所属类的成员函数、友元函数、友元类访问。

类中数据成员的类型可以是任意的,如整型、浮点型、字符型、数组、指针和引用等,也可以是对象。一个类的对象可以作为另一个类的成员,但是一个类的成员不可以是自身类的对象,而自身类的指针或引用又是可以作为该类的成员的。

注意
在定义类结构体和结构体时,花括号后面要有分号。
下面根据上述格式定义一个学生类,该类描述的学生属性包括姓名、性别和年龄等,行为包括学习、考试等,具体定义代码如下所示:

class Student // 定义学生类Student
{
public:           // 公有权限
    void study(); // 声明表示学习的成员函数
    void exam();  // 声明表示考试的成员函数
private:          // 私有权限
    string _name; // 声明表示姓名的成员变量
    int _age;     // 声明表示年龄的成员变量
};

上述代码定义了一个简单的学生类Student,该类中有_name、_age两个成员变量,它们是类的私有成员;除了成员变量,该类还定义了study()和exam()两个成员函数,它们是类的公有成员。通常情况下,类的成员函数在类中声明,在类外实现。

类的实现

要使用这个类的成员函数,还要对其定义具体的操作。下面介绍如何定义类的成员函数。

(1)将类的成员函数定义在类体内。

#include <iostream>
using namespace std;

class Rectangle
{
public:
    int width;
    int height;

    // 内联函数,将成员函数定义在类体内
    int area() const
    {
        return width * height;
    }
};

int main()
{
    Rectangle rect;
    rect.width = 5;
    rect.height = 10;
    cout << "Area of rectangle: " << rect.area() << endl;
    return 0;
}

(2)将类体内的成员函数的实现放在类体外。
如果将类的成员定义在类体外,则需要用到作用域运算符“::”,在类体内和类体外效果是一样的。

#include <iostream>
using namespace std;

class Rectangle
{
public:
    int width;
    int height;

    int area() const; // 声明成员函数
};

// 在类体外定义成员函数
int Rectangle::area() const
{
    return width * height;
}

int main()
{
    Rectangle rect;
    rect.width = 5;
    rect.height = 10;
    cout << "Area of rectangle: " << rect.area() << endl;
    return 0;
}

在类外实现成员函数,必须在返回值之后、函数名之前加上所属的类作用域,即“类名::”,表示函数属于哪个类。
如果函数名前没有类名和作用域限定符“::”,则函数不是类的成员函数,而是一个普通的函数。

上面两种方式都是将代码存储在同一个文件内。
使用C++语言还可以实现将函数的声明和函数的实现放在不同的文件内,一般将函数的声明放在头文件内,将函数的实现放在实现文件内。
同样,可以将类的定义放在头文件内,将类成员函数的实现放在实现文件内。存放类的头文件和实现文件的文件名最好和类名相同或相似。
下面是一个示例:
Rectangle.h(头文件):

#ifndef RECTANGLE_H
#define RECTANGLE_H

class Rectangle
{
public:
    int width;
    int height;

    int area() const; // 声明成员函数
};

#endif

Rectangle.cpp(源文件):

#include "Rectangle.h"

int Rectangle::area() const
{
    return width * height;
}

main.cpp:

#include <iostream>
#include "Rectangle.h"
using namespace std;

int main()
{
    Rectangle rect;
    rect.width = 5;
    rect.height = 10;
    cout << "Area of rectangle: " << rect.area() << endl;
    return 0;
}

关于类的实现有如下两点说明。
(1)类的数据成员需要初始化,还要为成员函数添加实现代码。类的数据成员不可以在类的声明中初始化。
(2)空类是C++语言中最简单的类,其声明形式如下:

class MyEmptyClass {
    // 空类,没有成员
};

空类只是起到占位的作用,在需要的时候再定义类的成员及实现。

对象的声明

类和对象的关系,如同建筑设计图纸与建筑物的关系,类是对象的模板,对象是类的实体。
在定义了一个新类后,就可以通过类名来声明对象了。声明形式如下:

类名 对象名称表;

类名是定义好的新类的标识符;对象名称表中包括一个或多个对象的名称,如果声明的是多个对象,则使用逗号运算符分隔对象名称。
例如,声明一个对象如下:

CPerson p;

声明多个对象如下:

CPerson p1,p2,p3;

声明完对象后就可以引用对象了,引用对象有两种方式,其中一种是成员引用方式,另一种是对象指针方式。

(1)成员引用方式。

对象名称.成员名称

这里的“.”是一个运算符,该运算符的功能是表示对象的成员。
成员函数引用的形式如下:

对象名称.成员名称(参数表)

例如:

CPerson p;
p.m_iIndex;

(2)对象指针方式。
对象声明形式中的对象名称表,除了包括使用逗号运算符分隔的多个对象名称,还可以包括对象名称数组、对象名称指针和引用形式的对象名称。
例如,声明一个对象指针如下:

CPerson *p;

但要想使用对象的成员,则需要使用“->”运算符,它是表示成员的运算符,与“.”运算符的含义相同。“->”用于表示对象指针所指向的成员,对象指针就是指向对象的指针。例如:

CPerson *p;
p->m_iIndex;

下面的对象数据成员的两种表示形式是等价的:

 对象指针名称->数据成员

 (*对象指针名称).数据成员

同样,下面的成员函数的两种表示形式也是等价的:

 对象指针名称->成员名称(参数表)

 (*对象指针名称).成员名称(参数表)

例如:

CPerson *p;
(*p).m_iIndex; // 对类中的成员进行引用
p->m_iIndex;   // 对类中的成员进行引用

http://www.kler.cn/a/595782.html

相关文章:

  • 【ES】Elasticsearch学习
  • Java设计模式之命令模式
  • Swoole HTTP 服务中 同步、异步 和 协程 三种模式的对比
  • 【linux】服务器限制客户端ssh访问
  • 课程5. 迁移学习
  • 【计算机网络】网络简介
  • 决策树调参技巧
  • 【STM32实物】基于STM32的太阳能充电宝设计
  • stm32 2.0.1
  • 六十天前端强化训练之第二十五天之组件生命周期大师级详解(Vue3 Composition API 版)
  • Webpack 中动态导入(Dynamic Import)的几种典型用法
  • <项目> 主从Reactor模型的高并发服务器
  • UI前端与数字孪生:打造智慧城市的双引擎
  • Android Compose 切换按钮深度剖析:从源码到实践(六)
  • 《概率论与数理统计》期末复习笔记_上
  • ocp考试有判断题吗?多少分及格?
  • 回归任务训练--MNIST全连接神经网络(Mnist_NN)
  • 构建教育类小程序:核心功能详解
  • SpringBoot @Scheduled注解详解
  • 浏览器工作原理深度解析(阶段二):HTML 解析与 DOM 树构建