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,并为它们的属性赋值。然后,我们通过输出语句打印出每个汽车对象的属性。这样,我们可以实例化出多个不同的汽车对象。

示例

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


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

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

相关文章

GIT版本管理使用示例

一、创建好远程代码仓库后&#xff0c;复制远程仓库的地址 二、新建一个文件夹&#xff0c;在文件夹里打开Git Bash Here 三、输入git clone 远程仓库地址&#xff0c;仓库就初始化完成了 四、新建一个文本文件&#xff0c;假设这是我们开发的代码 五、打开文本&#xff0c;假设…

小秦网站部署上线

叮&#xff5e;您有一份消息&#xff0c;请注意查收&#xff01; 小秦个人网站终于上线了&#xff1a; 网站主要有&#xff1a;免费听歌、看小姐姐、AI女友、留言板等功能&#xff0c;建议收藏、收藏、再收藏、重要事情说三遍&#xff01;&#xff01;&#xff01; 网站&#x…

java实现运行脚本文件

在最近的项目中&#xff0c;有一个需求是前端传给我一个脚本文件&#xff0c;然后我需要运行脚本文件后将结果进行返回&#xff0c;那接下来就让我们看看是怎么做的吧&#xff01; public R runScripts(Integer id) {ScriptsInfo scriptsInfo this.baseMapper.selectById(id);…

工业4g路由器联网后迅速掉线是什么原因?

工业4G路由器连接上网后迅速掉线可能是由多种因素造成的。以下是一些建议的检查和解决步骤&#xff1a; 1、信号问题&#xff1a; 信号强度&#xff1a;检查工业路由器信号强度指示灯&#xff0c;如果信号弱&#xff0c;尝试移动路由器位置或添加外部天线来增强信号。 网络拥…

求m和n的最大公约数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int remainder 1;int m 0;int n 0;int middle 0;//提示用户&#xff1b;printf("请输入整数m和n的值&#xff…

基于 OpenHarmony compress 三方件使用说明

关于 提供了一个轻量级的图像压缩库。将允许您将大照片压缩成小 尺寸的照片&#xff0c;图像质量损失或可以忽略不计 compress 的依赖添加 为你的应用添加 compress-debug.har。将 compress-debug.har 复制到 entry\libs 目录下即可&#xff08;由于 build.gradle 中已经依赖…

TopOn x Google Admob 自动创建广告源功能上线,支持一键添加广告单元 | TopOn产品速递

合作官宣 TopOn 正式成为亚太地区首家支持自动创建Admob bidding广告源的聚合平台。目前&#xff0c;在TopOn后台添加Admob广告平台&#xff0c;您只需要重新授权Google账号&#xff0c;即可开通自动创建功能。此前&#xff0c;TopOn 已在24年2月6日官方聚合支持Google biddin…

飞书文档如何在不同账号间迁移

今天由于个人需要新建了一个飞书账号&#xff0c;遇到个需求就是需要把老帐号里面的文档迁移到新的账号里面。在网上搜了一通&#xff0c;发现关于此的内容似乎不多&#xff0c;只好自己动手解决&#xff0c;记录一下过程以便分享&#xff0c;主要有以下几个步骤。 1. 添加新账…

python打印杨辉三角形

杨辉三角形&#xff0c;这个在国外被叫做帕斯卡三角形&#xff0c;中华文明为何立于世界之颠&#xff0c;这个就是最好的证明&#xff0c;古人的杨辉至少是这个帕斯卡的鼻祖辈&#xff0c;比帕某早了393年发现&#xff0c;那时候可没有知识产权概率&#xff0c;不然就是妥妥的侵…

JavaEE 初阶篇-深入了解线程池(线程池创建、线程池如何处理任务)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 线程池概述 1.1 线程池的优点 1.2 不使用线程池的问题 1.3 线程池的工作原理图 1.4 如何创建线程池&#xff1f; 2.0 通过 ThreadPoolExecutor 类自定义创建线程…

撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发&#xff0c;一直保持以下撸代码的习惯。 1.做好代码版本管理 有些人&#xff0c;喜欢一个程序干到底&#xff0c;直到实现全部的产品功能&#xff0c;我以前做51单片机的项目就是这样。 如果功能比较多的产品&#xff0c;我不建议这样做&#xff0…

如何搭建APP分发平台分发平台搭建教程

搭建一个APP分发平台可以帮助开发者更好地分发和管理他们的应用程序。下面是一个简要的教程&#xff0c;介绍如何搭建一个APP分发平台。 1.确定需求和功能&#xff1a;首先&#xff0c;确定你的APP分发平台的需求和功能。考虑以下几个方面&#xff1a; 用户注册和登录&#xff…

Anritsu MS9740B与MS9740A 光谱分析仪 的区别?

MS9740B与MS9740A的主要区别在于测量处理时间的缩短和对高速信号处理技术的应用。MS9740B在保持原有功能和性能的同时&#xff0c;将测量处理时间缩短了一半。这一点通过提高生产效率和减少测量及检查时间来实现&#xff0c;从而提高了光有源设备制造商的生产力。此外&#xff…

mid转MP3怎么转?一分钟搞定~

MIDI&#xff08;Musical Instrument Digital Interface&#xff09;文件格式的诞生可以追溯到上世纪80年代&#xff0c;音频技术迅速崛起。为了让不同音乐设备之间能够互相通信&#xff0c;MIDI格式成为了音乐的标准。它不同于常见的音频文件格式&#xff0c;不包含实际的声音…

浮点数在内存中的存储【详解】

浮点数在内存中的存储 浮点数存储规则小数点后数值的二进制转换float和double存储图示优化存储方案E不全为0或不全为1E全为0E全为1 浮点数存储规则 大家都知道整型数据是以补码的方式存放在内存中。以下几个概念是需要知道的&#xff1a; 原码&#xff0c;补码&#xff0c;反…

汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的&#xff0c;庆幸一直在做着有意义的事。   今天的内容&#xff0c;是为汇编语言课程更新一个实验项目。      本方案修改自王爽编《汇编语言》第&#xff14;版P172“实验7寻址方式在结构化数据访问中的应用” …

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能&#xff08;Generative AI&#xff09;正以前所未有的速度改变着各行各业的运作模式。其中&#xff0c;游戏产业作为科技应用的前沿阵地&#xff0c;正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业&#xff0c;以及这一变革背后的深远影响。…

一、Docker部署GitLab(详细步骤)

Docker部署GitLab&#xff08;详细步骤&#xff09; 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …

邮件服务器:Postfix

文章目录 邮件服务器的功能与工作原理电子邮件的问题Mail server与DNS 之间的关系邮件传输所需要的组件(MTA、MUA、MDA)以及相关协议用户收信时服务器端所提供的相关协议&#xff1a;MRA电子邮件的数据内容 使用Postfix与Dovecot部署邮件系统部署基础的电子邮件系统配置Postfix…

政校企三方牵手打造新质生产力,共建城市供应链安全检测中心

​4月3日 十堰市经开区政府 x 开源网安 战略合作签约仪式 圆满完成 4月3日&#xff0c;开源网安与十堰市经济技术开发区政府、湖北工业职业技术学院、十堰市经开建投签约仪式在十堰国际会展中心圆满完成。本次签约后&#xff0c;签约方将共建十堰市智能网联汽车网络安全测试…