C++从入门到精通——类的作用域及类的实例化

类的作用域及类的实例化

  • 前言
  • 一、类的作用域
  • 二、类的实例化
    • 引例
    • 类是对对象进行描述的
      • 示例
    • 一个类可以实例化出多个对象
      • 示例
    • 示例


前言

类的作用域是指类中定义的变量和方法的可见性和可访问性范围。在类的内部,所有成员(包括属性和方法)都具有类作用域,意味着它们可以在类的任何方法中被访问。然而,类的外部无法直接访问这些成员,除非通过类的实例或类本身(对于静态成员)。类的成员可以被设置为公有(public)、私有(private)或受保护的(protected),以控制其在不同上下文中的可见性和可访问性。这种作用域的控制有助于封装和隐藏类的实现细节,同时提供清晰的接口供外部使用。

类的实例化是指创建一个类的具体对象的过程。这通常涉及分配内存空间给新创建的对象,并设置其初始属性值。在实例化过程中,会调用类的构造函数来初始化对象的状态。一旦对象被实例化,就可以通过该对象来访问类的属性和方法,从而实现对对象的操作。类的实例化是面向对象编程中非常重要的概念,它使得程序员能够创建多个具有相同属性和方法的对象,并通过这些对象来模拟现实世界中的实体和它们之间的关系。


一、类的作用域

类的作用域是指类中定义的成员变量(属性)和方法可被访问的范围。

  • 类的作用域可以分为三个级别,分别为:

    • 公有作用域(public):公有作用域的成员变量和方法可以在类的外部被访问和调用。公有作用域的成员可以被其他类继承和重写。
    • 私有作用域(private):私有作用域的成员变量和方法只能在类的内部被访问和调用,无法被外部类或子类直接访问。私有作用域的成员只能被本类中的其他方法使用。
    • 受保护作用域(protected):受保护作用域的成员变量和方法可以在类的内部和子类中被访问和调用。受保护作用域的成员不能被外部类直接访问。
  • 类定义了一个新的作用域(即上述提到的三个作用域)
    类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

using namespace std;
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}

通过合理地使用作用域,可以控制类中成员的访问权限,提高代码的封装性和安全性。同时,类的作用域也可以使代码更加模块化,便于理解和维护。

二、类的实例化

用类的类型创建对象的过程,称为类的实例化

引例

#include<iostream>
using namespace std;
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
int main()
{
	Person man;
	cout << sizeof(man) << endl;
	cout << sizeof(Person) << endl;
}

在这里插入图片描述

#include<iostream>
using namespace std;
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
int main()
{
	Person man;
	cout << sizeof(Person) << endl;
}

在这里插入图片描述

#include<iostream>
using namespace std;
class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " " << _gender << " " << _age << endl;
}
int main()
{
	cout << sizeof(Person) << endl;
}

在这里插入图片描述
通过这个我们可以发现许多问题

  • 为什么只算成员变量的空间而不算成员函数的空间

ps:类的存储空间的计算和结构体空间计算是一样的,不会计算结构体内存空间的可以看这篇文章——C语言从入门到实战——结构体与位段,也可以看我的下一篇文章

成员变量和成员函数在C++中是不同的概念,它们具有不同的存储方式和使用方式。

成员变量是对象的属性,用于存储对象的状态信息。它们在对象被创建时分配空间,并随着对象的销毁而释放空间。因此,我们在计算一个对象所占空间大小时,会考虑其中的成员变量。

成员函数是用来操作对象的行为,它们并不存储在对象内部,而是作为对象的一部分存在于对象所属的类中。成员函数的代码只有一份,被所有属于同一个类的对象共享。因此,计算对象所占空间时,并不考虑其中的成员函数。

此外,成员函数也不占用对象的存储空间,它们只是通过对象来进行调用。因此,成员函数并不会对对象的大小产生直接影响。

  • 为什么直接计算没有实例化的类的空间大小是存在的
    在计算机内存中,每个类的定义都占据一定的内存空间,即使没有实例化该类的对象。这是因为类定义中包含了类的成员变量、成员函数以及其他元数据信息,这些信息需要在内存中存储以供程序在运行时使用。
    类的成员变量在内存中按照定义顺序进行存储,每个成员变量占据一定的内存空间。成员函数的代码也需要在内存中存储,以便可以被调用执行。其他元数据信息如类名、类的继承关系、访问控制等也需要在内存中存储。
    即使没有实例化类的对象,也可以通过类名来访问静态成员变量和函数。这些静态成员变量和函数在内存中是独立存在的,因此需要占据一定的内存空间。
    所以,尽管没有实例化类的对象,但类的定义本身仍然需要占据一定的内存空间。这样可以确保程序在运行时可以正确访问和使用类的成员变量和函数。

类是对对象进行描述的

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。

类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。

谜语:“年纪不大,胡子一把,主人来了,就喊妈妈”

谜底:山羊

示例

可以在C++中定义一个类,但是不分配实际的内存空间来存储它。例如:

class MyClass {
  public:
    int myInt;
    void myMethod() {
      // do something
    }
};

int main() {
    // 在这里定义一个MyClass对象,但没有分配内存空间存储它
    // 只是声明对象的存在,但不会分配内存空间
    MyClass myObject;

    // 通过访问成员变量和调用成员方法,可以使用对象的属性和行为
    myObject.myInt = 10;
    myObject.myMethod();

    return 0;
}

在这个例子中,我们定义了一个名为MyClass的类,并声明了一个MyClass类型的变量myObject,但并没有实际分配内存空间来存储它。在main()函数中,通过访问myObject的成员变量myInt和调用成员方法myMethod(),可以使用对象的属性和行为。然而,由于没有分配内存空间,这些操作只是模拟了对象的行为,实际上并没有真正的对象存在。

一个类可以实例化出多个对象

一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

int main()
{
	Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”
	return 0;
}

Person类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

示例

如下的例子是一个汽车类,每个汽车对象都可以有不同的颜色、品牌和型号。你可以创建多个汽车对象,每个对象都代表不同的车辆。

#include <iostream>
#include <string>

class Car {
public:
    std::string brand;
    std::string model;
    std::string color;
};

int main() {
    Car car1;
    car1.brand = "Toyota";
    car1.model = "Camry";
    car1.color = "Blue";

    Car car2;
    car2.brand = "Honda";
    car2.model = "Civic";
    car2.color = "Red";

    // 输出 car1 的属性
    std::cout << "Car 1:" << std::endl;
    std::cout << "Brand: " << car1.brand << std::endl;
    std::cout << "Model: " << car1.model << std::endl;
    std::cout << "Color: " << car1.color << std::endl;

    // 输出 car2 的属性
    std::cout << "Car 2:" << std::endl;
    std::cout << "Brand: " << car2.brand << std::endl;
    std::cout << "Model: " << car2.model << std::endl;
    std::cout << "Color: " << car2.color << std::endl;

    return 0;
}

这个例子中,我们定义了一个Car类,具有品牌(brand)、型号(model)和颜色(color)属性。我们创建了两个不同的Car对象car1car2,并为它们的属性赋值。然后,我们通过输出语句打印出每个汽车对象的属性。这样,我们可以实例化出多个不同的汽车对象。

示例

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
在这里插入图片描述
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速理解JS中的原型和原型链

快速理解JS中的原型和原型链 在我们学习JS的过程中&#xff0c;我们总会接触到一些词&#xff1a;“原型”&#xff0c;“原型链”。那么今天我就来带大家来学习学习原型和原型链的知识吧&#xff01; 在开始之前&#xff0c;我们明确一下我们接下来想要学习的目标&#xff1a…

【机器学习】K-means聚类算法:原理、应用与优化

一、引言 1、简述聚类分析的重要性及其在机器学习中的应用 聚类分析&#xff0c;作为机器学习领域中的一种无监督学习方法&#xff0c;在数据探索与知识发现过程中扮演着举足轻重的角色。它能够在没有先验知识或标签信息的情况下&#xff0c;通过挖掘数据中的内在结构和规律&a…

使用Springfox Swagger实现API自动生成单元测试

目录 第一步&#xff1a;在pom.xml中添加依赖 第二步&#xff1a;加入以下代码&#xff0c;并作出适当修改 第三步&#xff1a;在application.yaml中添加 第四步&#xff1a;添加注解 第五步&#xff1a;运行成功之后&#xff0c;访问相应网址 另外&#xff1a;还可以导出…

ES学习日记(七)-------Kibana安装和简易使用

前言 首先明确一点&#xff0c;Kibana是一个软件&#xff0c;不是插件。 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic stack 成员之一&#xff0c;设计用于和Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索&#xff0c;…

python文件打包找不到文件路径

引用&#xff1a;【将Python代码打包成exe可执行文件】 https://www.bilibili.com/video/BV1P24y1o7FY/?p4&share_sourcecopy_web&vd_sourced5811f31a0635dfc69a182c7bf1adb8b 在代码中&#xff0c;我们想读取文件a&#xff0c;一般使用如下方法。 import osdir os…

Spring Boot Mockito (三)

Spring Boot Mockito (三) 这篇文章主要是讲解Spring boot 与 Mockito 集成测试。 前期项目配置及依赖可以查看 Spring Boot Mockito (二) - DataJpaTest Spring Boot Mockito (一) - WebMvcTest Tag("Integration") SpringBootTest // TestMethodOrder(MethodOr…

安科瑞直流电表在光伏储能行业中的应用-安科瑞黄安南

双碳”背景下&#xff0c;储能产业站上市场风口&#xff0c;全球储能市场需求迅猛爆发。作为储能产业链的中游环节&#xff0c;系统集成商上承设备提供商&#xff0c;下接储能系统业主&#xff0c;已经成为储能行业最受关注的“焦点”。对于储能系统集成商来说&#xff0c;技术…

【研发日记】白话解读UDS协议(一)——19 04读取快照服务

文章目录 前言 19服务 04子服务 19 04协议 快照存储设计 快照发送设计 功能验证 分析和应用 总结 前言 近期在一个嵌入式软件开发项目中&#xff0c;要按照UDS标准开发相关功能&#xff0c;期间在翻阅UDS标准时&#xff0c;周围同事都说很多地方晦涩难懂。所以利用晚上…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

【前端】CSS(引入方式+选择器+常用元素属性+盒模型+弹性布局)

文章目录 CSS一、什么是CSS二、语法规范三、引入方式1.内部样式表2.行内样式表3.外部样式 四、选择器1.选择器的种类1.基础选择器&#xff1a;单个选择器构成的1.标签选择器2.类选择器3.id 选择器4.通配符选择器 2.复合选择器1.后代选择器2.子选择器3.并集选择器4.伪类选择器 五…

一文教你配置 Tomcat 9.0.19 + Java 12.0.2,并启用 SSL——以 Windows Server 2019 平台为例

Tomcat 的运行依赖 JAVA 环境&#xff01;安装的时候会让你选择 JDK 所在路径。 Linux 下的安装教程已更新&#xff1a; 操作系统&#xff1a;Windows Server 2019 Datacenter JAVA 版本&#xff1a;12.0.2 Tomcat 版本&#xff1a;9.0.19 GeoServer 版本&#xff1a;2.23.2 …

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

LeetCode-51. N 皇后【数组 回溯】

LeetCode-51. N 皇后【数组 回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯&#xff0c; 回溯三部曲。验证是否合法只需要检查:1.正上方&#xff1b;2. 左上方&#xff1b;3.右上方。因为是从上到下&#xff0c;从左到右遍历的&#xff0c;下方不可能有皇后。解题思路…

计算机网络基础(一)

目录 一.互联网和因特网 二.因特网的发展历程 三.因特网的功能 3.1边缘部分 3.1.1&#xff1a;客户服务器方式&#xff08;C/S方式&#xff09; 3.1.2&#xff1a;对等方式 3.2.核心部分 3.2.1&#xff1a;电路交换 3.2.2.报文交换 3.2.3&#xff1a;分组交换 四.计…

Python | Leetcode Python题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; class Solution:def maxArea(self, height: List[int]) -> int:l, r 0, len(height) - 1ans 0while l < r:area min(height[l], height[r]) * (r - l)ans max(ans, area)if height[l] < height[r]:l 1else:r - 1return ans

基于Python的自然语言的话题文本分类(V2.0),附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Java 哈希表

一、哈希表的由来 我们的java程序通过访问数据库来获取数据&#xff0c;但是当我们对数据库所查询的信息进行大量分析后得知&#xff0c;我们要查询的数据满足二八定律&#xff0c;一般数据库的数据基本存储在磁盘当中。这使得每次查询数据将变得无比缓慢。为此我们可以将经常…

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

多模态系列-综述Video Understanding with Large Language Models: A Survey

本文是LLM系列文章,针对《Video Understanding with Large Language Models: A Survey》的翻译。 论文链接:https://arxiv.org/pdf/2312.17432v2.pdf 代码链接:https://github.com/yunlong10/Awesome-LLMs-for-Video-Understanding 大型语言模型下的视频理解研究综述 摘要…

替换空格(替换特定字符)

&#x1f600;前言 在字符串处理中&#xff0c;经常会遇到需要替换特定字符的情况。本文将介绍一道经典的字符串替换问题&#xff1a;将字符串中的空格替换成 “%20”。我们将探讨一种高效的解决方法&#xff0c;通过倒序遍历字符串来实现原地替换&#xff0c;避免额外空间的开…