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

文章目录

  • 【 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,类型为 BoxBox Box2;        // 声明 Box2,类型为 Boxdouble 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,类型为 Boxdouble 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.mzph.cn/news/111526.shtml

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

相关文章

【离线/并查集】CF1213 G

想起来好久没写题解了&#xff0c;随便写一下把 感觉写多了div3后面的题就变得简单了&#xff0c;div3似乎没什么思维含量&#xff0c;甚至有时候能开出div3的2100.... 心血来潮写一下这个*1800的题解&#xff0c;思路一下就出了&#xff0c;但是一开始多了个log被卡了&#x…

工程化模式-进阶

幼年期&#xff1a;无模块化 成长期&#xff1a; IIFE是立即执行函数表 IIFE其实也就是匿名函数&#xff0c;归根结底都是函数 一种是申明式&#xff0c;一种是表达式。但是两种其实存在着不同&#xff0c;其中第二种中存在着变量提升 function fn1() var fn function ()v…

使用stream流根据对象属性对复杂list对象去重

日常开发中&#xff0c;我们可能会遇到这样一种情况&#xff0c;需要对数据库查询出来的数据进行一个二次处理&#xff0c;从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。 我们先介绍如何使用stream流根据对象属性对复杂list对象去重&#xff0…

1最新动态

已经入驻面包多了 地址&#xff1a;https://mbd.pub/o/author-a26am2hoZQ/work

【R】数据相关性的可视化

一千零一技|相关性分析及其可视化&#xff1a;copy&paste&#xff0c;搞定 .libPaths(c("/bioinfo/home/software/miniconda3/envs/R4.0/lib/R/library")) #data("mtcars") library("PerformanceAnalytics") # pdf("test.pdf") #…

惊艳!这些独特的搜索引擎你都知道吗?

随着互联网的普及和发展&#xff0c;搜索引擎已经成为我们日常获取信息的重要工具。然而&#xff0c;当我们想要寻找一些特定类型的信息时&#xff0c;普通的搜索引擎可能无法满足我们的需求。这时&#xff0c;一些特殊的搜索引擎便能派上用场本。 文将介绍几种常用的特殊搜索引…

EDID详解

文章目录 字节含义一些概念YCC位 文章目录 字节含义一些概念YCC位 字节含义 EDID通常由128个字节组成&#xff0c;这些字节提供了关于显示器的各种详细信息。以下是EDID中每个字节位表示的一般含义&#xff1a; Header&#xff08;头部&#xff09;: 字节0: Header&#xff…

全面预算管理软件

目前主流产品厂商是&#xff1a;Oracle&#xff08;产品hyperion海波龙&#xff09;&#xff0c;SAP&#xff08;BPC&#xff09;&#xff0c;IBM&#xff08;TM1&#xff09;Tagetik从意大利引入中国&#xff0c;元年做全面预算管理软件20年左右&#xff0c;元年C1全面预算管理…

前端开发规范总结

1、 前言 前端开发中&#xff0c;不同的开发者有不同的代码编写习惯&#xff0c;但实际项目中有的公司是需要协同开发的&#xff0c;想要高效的协同&#xff0c;规定一个大家都能接受的规范就尤为重要。 坚持好的代码风格规范&#xff0c;从你我做起。 2、代码规范的好处 …

hue实现对hiveserver2 的负载均衡

如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中&#xff0c;进入HDFS Service 进入Instances标签页面&#xff0c;点击Add Role Instances按钮&#xff0c;如下图所示 点击Continue按钮&#xff0c;如下图所示 返回Instances页面&#xff0c;选择HttpFS角色…

【MyBatis】mvc模式以及Mapper文件中的namespace以及ORM思想

目录 什么是MVC三层架构&#xff0c;初步了解&#xff1f; namespace的作用是什么&#xff1f; Mapper文件中的namespace&#xff1f; ORM思想&#xff08;对象关系映射思想&#xff09; 其中提供了一套映射规则和API 什么是MVC三层架构&#xff0c;初步了解&#xff1f; 三…

9.构造器与垃圾收集器 对象的前世今生

9.1 对象与变量的生存空间 栈与堆&#xff1a;生存空间 在Java中&#xff0c;程序员会在乎内存中的两种区域&#xff1a;对象的生存空间堆&#xff08;heap&#xff09;和方法调用及变量的生存空间&#xff08;stack&#xff09;。当Java虚拟机启动时&#xff0c;它会从底层的…

【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

django REST framework-使用与不使用的区别?

首先&#xff0c;来回顾一下传统的基于模板引擎的 django 开发工作流&#xff1a; 绑定 URL 和视图函数。当用户访问某个 URL 时&#xff0c;调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板&#xff0c;返回 HTTP 响应…

互联网摸鱼日报(2023-10-20)

互联网摸鱼日报(2023-10-20) 博客园新闻 OPPO让折叠机超越直板旗舰成为可能 特斯拉的“大空头”&#xff0c;是马斯克那张嘴 逃避内卷的年轻人&#xff0c;盯上了老年大学的音乐课 理想市值超蔚来1倍&#xff0c;一场属于增程式的胜利 补足折叠屏影像短板&#xff0c;OPPO…

软件工程与计算总结(十七)软件构造

一.概述 1.定义 软件构造是以编程为主的活动&#xff0c;类似于软件实现。但软件构造又不止编程这么简单&#xff0c;除了核心的编程任务之外&#xff0c;还设计详细设计&#xff08;数据结构与算法设计&#xff09;、单元测试、集成与集成测试以及其他活动~ 2.软件构造是设计…

redis,mq如何解决重复支付问题

重复支付问题可以通过以下方式解决&#xff1a; Redis解决重复支付问题&#xff1a;Redis可以使用它的原子性操作来避免重复支付问题。可以将每个订单的订单号作为一个key存储在Redis中&#xff0c;并设置一个过期时间。当客户付款时&#xff0c;先检查该订单号在Redis中是否存…

【Android】BRVAH多布局实现

前言 基于3.0.4版本的BRVAH框架实现的 实现方法 1.创建多个不同类型的布局&#xff08;步骤忽略&#xff09; 2.创建数据实体类 数据类要实现【MultiItemEntity】接口 class MyMultiItemEntity(//获取布局类型override var itemType: Int,var tractorRes: Int? null,va…

简单谈谈我参加数据分析省赛的感受与体会

数据分析省赛的感受与体会 概要考试前的感受与体会考试注意事项小结 概要 大数据分析省赛指的是在省级范围内举办的大数据分析竞赛活动。该竞赛旨在鼓励和推动大数据分析领域的技术创新和人才培养&#xff0c;促进大数据技术与应用的深度融合&#xff0c;切实解决实际问题。参…

win32-注册表-32位-64位-读写值-Qt-C++

文章目录 1.32访问64位和64位访问32位2.在Qt中qsetting的使用3.总结 1.32访问64位和64位访问32位 32位的应用程序想访问64位的注册表视图的标志是KEY_WOW64_64KEY&#xff0c;该标志的值是0x0100。64位的应用程序想访问32位的注册表视图的标志是KEY_WOW64_32KEY。以上两个标志…