【C++面向对象】1. 类、对象

news2024/11/20 9:47:56

文章目录

  • 【 1. 类 & 对象的定义 】
    • 1.1 类的定义
    • 1.2 对象的定义
  • 【 2. 类的成员 】
    • 2.1 数据成员
    • 2.2 成员函数
      • 类的内部定义成员函数
      • 类的外部定义成员函数
      • 成员函数的访问
      • 实例
  • 【 3. 类的访问修饰符 】
    • 3.1 public 公有成员
    • 3.2 private 私有成员
    • 3.3 protected 保护成员
    • 3.4 继承中的访问修饰符特点

  • C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。 是 C++面向对象 的核心特性,通常被称为用户定义的类型。
  • 类用于指定对象的形式,它包含了 数据表示法 和用于处理数据的 方法。类中的数据和方法称为类的 成员。函数在一个类中被称为类的成员。

【 1. 类 & 对象的定义 】

1.1 类的定义

  • 定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
  • 类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中,类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:
class Box
{
   public:
      double length;   // 盒子的长度
      double breadth;  // 盒子的宽度
      double height;   // 盒子的高度
};
  • 关键字 public 确定了类成员的访问属性。 在类对象作用域内,public 公共成员在类的外部是可访问的 。您也可以指定类的成员为 private 或 protected,这个我们稍后会进行讲解。

1.2 对象的定义

  • 类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Box 的两个对象,对象 Box1 和 Box2 都有它们各自的数据成员:
Box Box1;          // 声明 Box1,类型为 Box
Box Box2;          // 声明 Box2,类型为 Box

【 2. 类的成员 】

2.1 数据成员

  • 类的对象的公共数据成员可以使用直接成员访问运算符即小数点 . 来访问。私有的成员和受保护的成员不能使用直接成员访问运算符 . 来直接访问。
  • 实例:
#include <iostream>

using namespace std;

class Box
{
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
};

int main( )
{
   Box Box1;        // 声明 Box1,类型为 Box
   Box Box2;        // 声明 Box2,类型为 Box
   double volume = 0.0;     // 用于存储体积

   // box 1 详述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;

   // box 2 详述
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;

   // box 1 的体积
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的体积:" << volume <<endl;

   // box 2 的体积
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Box2 的体积:" << volume <<endl;
   return 0;
}

在这里插入图片描述

2.2 成员函数

  • 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。
  • 类的成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。

类的内部定义成员函数

  • 在类定义中定义的成员函数默认把函数声明为 内联 的 ,可以不使用 inline 标识符
  • 实例,在 Box类 的内部定义 getVolume() 函数:
class Box
{
   public:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度

      double getVolume(void)
      {
         return length * breadth * height;
      }
};

类的外部定义成员函数

  • 在类的外部使用 范围解析运算符 :: 定义成员函数,在 :: 运算符之前必须使用类名。
  • 实例:在 Box类 的外部定义 getVolume() 函数
double Box::getVolume(void)
{
    return length * breadth * height;
}

成员函数的访问

  • 调用成员函数是在对象上使用点运算符(.),这样它就能操作与该对象相关的数据,
  • 实例
Box myBox;          // 创建一个对象

myBox.getVolume();  // 调用该对象的成员函数

实例

#include <iostream>

using namespace std;

class Box
{
   public:
      double length;         // 长度
      double breadth;        // 宽度
      double height;         // 高度

      // 成员函数声明
      double getVolume(void);
      void setLength( double len );
      void setBreadth( double bre );
      void setHeight( double hei )
      {
    		height = hei;
	  }
};

// 成员函数定义
double Box::getVolume(void)
{
    return length * breadth * height;
}

void Box::setLength( double len )
{
    length = len;
}

void Box::setBreadth( double bre )
{
    breadth = bre;
}


// 程序的主函数
int main( )
{
   Box Box1;                // 声明 Box1,类型为 Box
   double volume = 0.0;     // 用于存储体积

   // box 1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);

   // box 1 的体积
   volume = Box1.getVolume();
   cout << "Box1 的体积:" << volume <<endl;

   return 0;
}

在这里插入图片描述

【 3. 类的访问修饰符 】

  • 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的 访问限制 是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
  • 一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的 默认访问修饰符是 private
  • 实例
class Base {

   public:

  // 公有成员

   protected:

  // 受保护成员

   private:

  // 私有成员

};

3.1 public 公有成员

  • 公有成员在程序中类的外部是可访问的。我们可以不使用任何成员函数来 直接设置和获取公有变量的值。
  • 实例:
#include <iostream>

using namespace std;

class Line
{
   public:
      double length;
      void setLength( double len );
      double getLength( void );
};

// 成员函数定义
double Line::getLength(void)
{
    return length ;
}

void Line::setLength( double len )
{
    length = len;
}

// 程序的主函数
int main( )
{
   Line line;

   // 设置长度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;

   // 不使用成员函数设置长度
   line.length = 10.0; // OK: 因为 length 是公有的
   cout << "Length of line : " << line.length <<endl;
   return 0;
}

在这里插入图片描述

3.2 private 私有成员

  • 私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。

  • 默认情况下(没有使用任何访问修饰符时),类的所有成员都是私有的。如下所示:width 是 私有的。

class Box
{
   double width;
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};
  • 实际操作中,我们 一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数。
#include <iostream>

using namespace std;

class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );

   private:
      double width;
};

// 成员函数定义
double Box::getWidth(void)
{
    return width ;
}

void Box::setWidth( double wid )
{
    width = wid;
}

// 程序的主函数
int main( )
{
   Box box;

   // 不使用成员函数设置长度
   box.length = 10.0; // OK: 因为 length 是公有的
   cout << "Length of box : " << box.length <<endl;

   // 不使用成员函数设置宽度
   // box.width = 10.0; // Error: 因为 width 是私有的
   box.setWidth(10.0);  // 使用成员函数设置宽度
   cout << "Width of box : " << box.getWidth() <<endl;

   return 0;
}

在这里插入图片描述

3.3 protected 保护成员

  • 保护成员变量或函数与私有成员十分相似,但有一点不同,即 public 保护成员在派生类(即子类)中是可访问的
  • 实例:从父类 Box 派生了一个子类 smallBox, width 成员可被派生类 smallBox 的任何成员函数访问。
#include <iostream>
using namespace std;

class Box
{
   protected:
      double width;
};

class SmallBox:Box // SmallBox 是派生类
{
   public:
      void setSmallWidth( double wid );
      double getSmallWidth( void );
};

// 子类的成员函数
double SmallBox::getSmallWidth(void)
{
    return width ;
}

void SmallBox::setSmallWidth( double wid )
{
    width = wid;
}

// 程序的主函数
int main( )
{
   SmallBox box;

   // 使用成员函数设置宽度
   box.setSmallWidth(5.0);
   cout << "Width of box : "<< box.getSmallWidth() << endl;

   return 0;
}

在这里插入图片描述

3.4 继承中的访问修饰符特点

  • 共有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
基类 成员的访问属性派生 成员的访问属性
public继承public → public
private → private
protected → protected
private 继承public → private
private → private
protected → private
protected 继承public → protected
private → private
protected → protected
  • 但无论哪种继承方式,有两点都没有改变:
    • private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
    • protected 成员可以被派生类访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Excel】WPS单元格快速转换表格字母大小写

使用WPS Office打开表格&#xff0c;选择需要处理的单元格或单元格区域。 依次点击「会员专享」选项卡 —>「智能工具箱」。 再点击「格式」—>「大小写」&#xff0c;选择一种大小写转换方式即可。

测试开发之自动化篇 —— 使用Selenium IDE录制脚本!

今天&#xff0c;我们开始介绍基于开源Selenium工具的Web网站自动化测试。 Selenium包含了3大组件&#xff0c;分别为&#xff1a;1. Selenium IDE 基于Chrome和Firefox扩展的集成开发环境&#xff0c;可以录制、回放和导出不同语言的测试脚本。 2. WebDriver 包括一组为不同…

AI智能视频监控系统解锁新场景:大型音乐节活动视频监控方案

随着近日音乐节的大火&#xff0c;越来越多的人喜欢参加音乐节进行放松娱乐。音乐节通常都会聚集大量人群&#xff0c;为了确保参与者的安全&#xff0c;在音乐节期间设置智能视频监控系统可以帮助管理人员及时发现和应对任何潜在危险或紧急情况&#xff0c;可以保障参与者的生…

重磅升级!官网全新改版上线啦~

新布局、新风格 新体验、新服务 棱镜七彩新版官网 正式上线啦&#xff01; 各版块功能全新升级 为广大用户提供更优质的服务体验&#xff01; 重构版块信息&#xff0c;用户需求一键直达 新官网结构大焕新&#xff0c;升级后的官网根据用户需求进行了更合理的设置与规划…

IJCAI2023【基于双曲空间探索的非独立同分布联邦学习】

1、介绍汇报的主题及汇报者 2、粗略介绍面临的挑战及出发点 3、介绍一下预备知识 4、解决方案 5、总览 6、实验设置 7、实验 8、结论

代码检查的方式有哪几种?

代码检查是软件开发过程中的关键环节&#xff0c;可以帮助发现和纠正潜在的错误和问题。以下是几种常见的代码检查方式&#xff1a; 1. 人工代码检查&#xff1a; 这是最基本和常见的方式&#xff0c;由开发人员手动检查代码。这种方式依赖于开发人员的经验和专业知识&#xf…

Linux远程管理协议

&#xff08;RFB、RDP、Telnet和SSH&#xff09;是Linux的远程管理协议。提到远程管理&#xff0c;通常指的是远程管理服务器&#xff0c;而非个人计算机。个人计算机可以随时拿来用&#xff0c;服务器通常放置在机房中&#xff0c;用户无法直接接触到服务器硬件&#xff0c;只…

JavaScript 操作浏览器和HTML文档/JavaScript 操作对象

JavaScript 操作浏览器和HTML文档 框架 浏览器对象模型&#xff08;BOM&#xff09; windownavigatorscreenlocation 文档对象模型&#xff08;DOM&#xff09; document 操作对象间的关系 window对象是浏览器的顶层对象&#xff0c;它包含了浏览器窗口的各种属性和方法。w…

数据库表设计及优化初步——项目中的数据库表究竟怎么设计?如何提高查询效率?

前言 我们都知道数据库设计有以下三大范式&#xff0c;但实际应用中真的是按照这三大范式来设计吗&#xff1f; 本篇博客尝试阐述项目中数据库表的设计&#xff0c;以及查询优化的方法。 第一范式&#xff1a; 原子&#xff0c;列信息不可再分&#xff1b; 第二范式&#…

培训机构招生电子传单制作教程:突出核心竞争力的方法

随着科技的不断发展&#xff0c;现在的招生宣传也变得越来越电子化。其中&#xff0c;电子传单就是一种非常有效的宣传方式。下面就让我们来学习如何制作具有吸引力的培训机构招生电子传单。 首先&#xff0c;我们需要进入乔拓云后台&#xff0c;并登录。在登录后&#xff0c;我…

Python武器库开发-基础篇(四)

基础篇(四) Open 文件 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象。 在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对象&#xff0c;即…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的&#xff0c;在设计的时候&#xff0c;只要能做到比较好的抽象&#xff0c;这两部的实现…

RHCE---shell 基本知识

文章目录 目录 文章目录 前言 一.shell 概述 如何编写shell脚本 脚本开头 脚本内容 执行脚本 bash shell 基本功能 echo打印命令 printf 命令 history历史命令 命令别名 总结 前言 在UNIX和类UNIX操作系统中&#xff0c;Shell是一个非常重要的组件&#xff0c;为用户提供…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

大数据学习(13)-join优化详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料 文章目录 工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料一、前言二、Profinet了解及资料收集1. 资料2. PROFINET到底是什么&#xff1f;3. 网络模型4. 应用场景 三、接下来 一、前言 …

最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(二)Keycloak与SpringBoot的集成

上一篇已经介绍了keycloak的下载与使用: Keycloak的下载与使用 本文章和大家分享keycloak怎么去集成springboot项目&#xff0c;以及怎么去做接口权限的校验。 PS&#xff1a;根据红帽的公告&#xff0c;目前在springboot 3.x版本已经不支持keycloak适配器&#xff0c;所以本章…

44岁的「老板」想变年轻

作者 | 辰纹 来源 | 洞见新研社 从村办集体企业余杭县红星五金厂起家&#xff0c;到生产贴牌油烟机&#xff0c;再到注册“老板”商标&#xff0c;改制有限公司&#xff0c;老板电器已经走过了44个春秋。 在这44年中&#xff0c;老板电器是首家登陆资本市场的高端厨电企业&am…

Java总结的question

Java 数据类型 Q1:基本类型和包装类型的区别&#xff1f; 用途&#xff1a;在对象属性中一般用包装类型&#xff0c;包装类型可用于泛型&#xff0c;基本类型不可以存储方式&#xff1a;包装类型一般放在堆&#xff0c;基本数据类型的局部变量一般放在栈中的局部变量表&…

页表置换算法之最佳置换算法(OPT),先进先出置换算法(FIFO),最近最久未使用置换算法(LRU),时钟置换算法(CLOCK)

请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中&#xff0c;当所访问的信息不在内存时&#xff0c;由操作系统负责将所需信息从外存调入内存&#xff0c;然后继续执行程序。若内存空间不够&#xff0c;由操作系统负责将内存中暂时用不到的信息换出到外存。页…