C++类和对象介绍

目录

一、类的创建

二、访问权限 

三、struct与class 

四、类域 

五、类的大小


一、类的创建

         C++中【class】为定义类的关键字,【{}】中为类的主体,注意类定义结束时后⾯分号不能省略。一般来说,类规范由两部分组成:

  • 类的声明:数据成员的数据部分,成员函数的方法接口
  • 类的方法定义:实现类的成员函数

【注意】

        定义在类⾯的成员函数默认为inline

如果还有对内联函数不是很清楚的可以去看看这篇文章:C++内联函数简述——inline-CSDN博客 

//一个日期类
class Date
{
public://成员函数的方法接口//打印日期void print();//设置日期类(后面会使用构造函数替代)void set_date(int y, int m, int d);
private://数据成员的数据部分int year;int month;int day;
};

二、访问权限 

        C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的用户使⽤

                C++中由三种访问限定符:

  • public:成员在类外可以直接被访问
  • private:成员在类外不能直接被访问
  • protected:成员在类外不能直接被访问

【注意】        
  1.  访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束
  2. ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public

         简单来说,类的声明提供了类的蓝图,而方法定义提供了细节

三、struct与class 

         可能会有眼尖的小伙伴发现了,C++中的类与C语言中的结构体好像是一样的(去除成员函数)。实际上,C++对C语言中的结构体进行了升级,使得结构体具有了与类相同的特性。类与结构体唯一的区别就在于:

  • 结构体的默认访问类型是【public】,类的访问类型默认是【private】

         C++对C语言中的结构体进行了升级,使得结构体具有了与类相同的特性:

         结构体的默认访问类型是【public】,类的访问类型默认是【private】:

//struct定义类
struct Date1
{int year;int month;int day;//打印日期void print(){cout << year << "-" << month << "-" << day << endl;}
};
//class定义类
class Date2
{int year;int month;int day;//打印日期void print(){cout << year << "-" << month << "-" << day << endl;}
};
int main() 
{//struct//结构体的默认访问类型是【public】Date1 test1;test1.year = 1;test1.month = 1;test1.day = 1;test1.print();//class//类的访问类型默认是【private】Date2 test2;test2.year = 1;test2.month = 1;test2.day = 1;test2.print();return 0;
}

        虽然C++对结构体进行了升级,使得结构体具有了与类相同的特性,但是C++程序员通常使用类来实现类的描述,而把结构体限制为只为表示纯粹的数据对象

四、类域 

        C++中类的设计要尽可能的将公有成员函数和实现细节分开。将成员函数的定义与声明分开体现了C++中的封装思想,就是将成员函数定义(源文件)与声明(头文件)放在不同的文件中

         【test.h】头文件:

//一个日期类的声明
class Date
{
public://成员函数的方法接口//打印日期void print();//设置日期类(后面会使用构造函数替代)void set_date(int y, int m, int d);
private://数据成员的数据部分int year;int month;int day;
};

        【test.cpp】源文件: 

#include "test.h"
//实现 Date 类中的成员函数
//打印日期
void Date::print()
{cout << year << "-" << month << "-" << day << endl;
}
//设置日期
void Date::set_date(int y, int m, int d)
{year = y;month = m;day = d;
}
int main()
{Date test;test.set_date(1, 1, 1);test.print();
}

        类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤【 :: 】作⽤域操作符指明成员属于哪个类域

         错误示范:

#include "test.h"
//实现 Date 类中的成员函数
//打印日期
void print()
{cout << year << "-" << month << "-" << day << endl;
}
//设置日期
void set_date(int y, int m, int d)
{year = y;month = m;day = d;
}
int main()
{Date test;test.set_date(1, 1, 1);test.print();
}

        原因是编译器会把这些函数视为全局函数,像【year】、【month】、【day】这样的变量函数首先会在局部域中寻找,然后去全局域中寻找

        全局函数是不会进入到类域中去寻找变量的,只有指定类域函数才回去类域中去寻找

        这里我们要明确一点,类的声明是不会开辟内存空间,只有在使用类创建对象时才会开辟内存空间

//一个日期类的声明
class Date
{
public://打印日期void print();//设置日期类(后面会使用构造函数替代)void set_date(int y, int m, int d);
private://这里只是声明,不会开辟内存空间int year;int month;int day;
};int main()
{//Date类实例化出对象d1和d2//开辟Date类大小的内存空间Date d1;Date d2;return 0;
}

        因此像通过【类名】加【 :: 】作⽤域操作符去操作成员变量是不可以的

//一个日期类的声明
class Date
{
public://打印日期void print();//设置日期类(后面会使用构造函数替代)void set_date(int y, int m, int d);
private://这里只是声明,不会开辟内存空间int year;int month;int day;
};int main()
{//不存在成员变量的创建,会报错Date::year = 1;Date::month = 1;Date::day = 1;return 0;
}

五、类的大小

        使用类创建的每一个新对象都有自己的存储空间,用于存储其内部变量和类成员。但是同一个类的所有对象共享同一组成员函数,即每一个成员函数只有一个副本

        下面来计算一下【Date】类的大小:

//一个日期类
class Date
{
public://成员函数的方法接口//打印日期void print();//设置日期类(后面会使用构造函数替代)void set_date(int y, int m, int d);
private://数据成员的数据部分int year;int month;int day;
};
int main()
{cout << sizeof(Date) << endl;return 0;
}

        这里要注意一下,类的大小计算与结构体的大小计算一样,都要符合内存对齐规则

        内存对齐的规则:

  1. 第⼀个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处
  3. 对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值
  4. 类的总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍
  5. 如果嵌套了类的情况,嵌套的类对⻬到⾃⼰的最⼤对⻬数的整数倍处,类的整体⼤⼩
  6. 就是所有最⼤对⻬数(含嵌套类的对⻬数)的整数倍

        详细的计算可以看看这篇文章:C语言——自定义类型-CSDN博客

        那么这里就要考虑类中的成员函数是否也要计算大小?

        先说结论: 类中的成员函数在计算大小时,不参与其计算

       【Date】类中如果成员函数要参加类的大小计算话,首先一个【int】变量占4个字节,而成员函数的本质就是一个地址,我这里的环境是【32位】,因此一个地址占4个字节,那么根据内存对齐的规则来算【Date】类的总大小为:20字节

        结果: 

        从结果来看【Date】类的大小为:12字节。其原因就是成员函数在计算大小时,不参与其计算,同一个类的所有对象共享同一组成员函数,即每一个成员函数只有一个副本

         

        我们可以这样想,【Date】实例化【d1】和【d2】两个对象,【d1】和【d2】都有各⾃独⽴的成员变量存储各⾃的数据,但是【d1】和【d2】的成员函数指针却是⼀样的,如果⽤【Date】创建100个对象,那么成员函数指针就重复存储100次,太浪费了

        那以下这两类的大小是多少呢?

//类1
class A
{
public:void print(){cout << "hehe!" << endl;}
};//类2
class B
{};

        结果:

        这里可能会有同学疑惑,不说成员函数不参与大小计算吗?为什么第一个会是1呢?而第二个类,里面明明什么都没有,为什么也会是1呢?

        因为如果⼀个字节都不给,怎么表⽰对象存在过呢!我们的【&】运算符怎么取地址呢。所以 这⾥给1字节,纯粹是为了占位标识对象存在

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

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

相关文章

【自学笔记】推荐系统

文章目录 引入一些记号原理 协同过滤算法使用均值归一化 基于内容的推荐原理基于TensorFlow的代码 从大目录里推荐检索排名 引入 一些记号 记号含义其他 n n n总人数 m m m总样本数 k k k特征数 y i ( j ) y_{i}^{(j)} yi(j)​第 j j j个人对第 i i i个样本的评分 y i , j ∈ …

vue基础

1. vue是什么&#xff1f; Vue.js &#xff08;读音 /vju ː /, 类似于 view &#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 官…

简单学点位运算(Java)

1. 位运算符 Java中常用的位运算符如下&#xff1a; 2. 详解 &#xff08;1&#xff09;按位与 & 规则&#xff1a;同一位上全是 1 时&#xff0c;结果为 1&#xff0c;否则为 0。用途&#xff1a; 清零某些位&#xff1a;x & 0xF0可以保留高 4 位&#xff0c;清除…

637. 二叉树的层平均值【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 637. 二叉树的层平均值 一、题目描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 二、测试用例 示例 1&a…

111页PPT丨服装零售行业数字化时代的业务与IT转型规划

安踏的数字化转型项目在方法论、计划和组织方面展现出了明确的目标、系统的规划和有效的执行。以下是对这三个方面的详细分析&#xff1a; 方法论 安踏的数字化转型方法论主要围绕以下几个核心点展开&#xff1a; 服务于整体战略&#xff1a;数字化转型不是孤立的项目&#…

人工智能技术的应用前景与我们的应对策略

​ 大家好&#xff0c;我是程序员小羊&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在社会生活、产业转型以及科技进步中发挥着日益重要的作用。AI正逐步改变着我们的生活和工作方式&#xff0c;同时也带来了技术和伦理上的诸多挑战。本文…

基于Java Springboot论坛系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

Vue2教程001:初识Vue

文章目录 1、初识Vue1.1、Vue2前言1.2、创建Vue实例1.3、插值表达式1.4 Vue响应式特性 1、初识Vue 1.1、Vue2前言 Vue是什么&#xff1f; 概念&#xff1a;Vue是一个用于构建用户界面的渐进式框架。 Vue的两种使用方式&#xff1a; Vue核心包开发 场景&#xff1a;局部模块…

113页PPT制造业研发工艺协同及制造一体化

研发工艺协同及制造一体化解决方案是制造业数字化转型的重要组成部分&#xff0c;它涵盖了从产品设计到生产的全过程&#xff0c;旨在提高生产效率、降低成本、提升产品质量&#xff0c;并增强企业的市场竞争力。以下是对该解决方案的详细阐述&#xff1a; 一、方案概述 研发…

红外遥控信号解码

红外遥控信号解码 之前就已经做过红外遥控的解码了&#xff0c;但是一直没有做记录&#xff0c;最近的项目又使用到了红外遥控&#xff0c;索性就把他捡起来记录一下&#xff0c;对于信号的解码&#xff0c;我一般的习惯都是先用逻辑分析仪抓取一下信号波形&#xff0c;然后对…

Spring:纯注解开发模式-Ioc对bean的管理

我们知道&#xff08;请见 注解开发定义bean&#xff09;&#xff0c;可以使用注解来配置bean,但是依然有用到配置文件&#xff0c;在配置文件中对包进行了扫描&#xff0c;Spring在3.0版已经支持纯注解开发 Spring3.0开启了纯注解开发模式&#xff0c;使用Java类替代配置文件…

赛元免费开发板申请

在作者网上冲浪的时候&#xff0c;突然发现了一个国内的良心企业&#xff0c;虽然现在不是很有名&#xff0c;但是他现在是有一个样品申请的活动&#xff0c;他就是国内的Redfine新定义&#xff0c;他申请的板子是用的赛元MCU&#xff0c;作者本着有板子就要申请的原则&#xf…

【编译】多图解释 什么是短语、直接短语、句柄、素短语、可归约串

一、什么是短语二、什么是“直接”短语&#xff1f;三、什么是句柄&#xff1f;四、什么是素短语&#xff1f;五、什么是最左素短语可归约串就是“最左素短语” 首先&#xff0c;这些概念 都是相对于【句型】的&#xff0c;都是相对于【句型】的&#xff0c;都是相对于【句型】…

基础IO2

文章目录 磁盘结构磁盘存储结构磁盘的逻辑结构引入文件系统理解文件系统inode 映射 data blocks文件名与inode的关系dentry树文件描述符与进程之间的关系 深刻理解软硬链接软链接硬链接 动静态库静态库1. 手动制作静态库2.调用静态库(1)安装到系统(2)自己指定查找路径(3)自己创…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

ZD Soft Screen Recorder:电脑录屏软件

前言 ZD Soft Screen Recorder 是一款屏幕录制软件 安装环境 [名称]&#xff1a;ZD Soft Screen Recorder [版本]&#xff1a;11.7.2 [大小]&#xff1a;6.8MB [语言]&#xff1a;英文 [环境]&#xff1a;pc 链接: 百度网盘 请输入提取码 提取码: ua23 软件界面 1、双击…

某杀软环境下的添加账户

某杀软环境下的添加账户 我们在某个杀软环境下&#xff0c;正常添加账户一般是会被直接拦截的 白&#xff0b;黑 在这个环境下&#xff0c;白&#xff0b;黑是最实用的绕过方式&#xff0c;我们可以通过调用winapi来创建账户&#xff0c;这些代码再存储到dll里面&#xff0c…

《Spring 基础之 IoC 与 DI 入门指南》

一、IoC 与 DI 概念引入 Spring 的 IoC&#xff08;控制反转&#xff09;和 DI&#xff08;依赖注入&#xff09;在 Java 开发中扮演着至关重要的角色&#xff0c;是提升代码质量和可维护性的关键技术。 &#xff08;一&#xff09;IoC 的含义及作用 IoC 全称为 Inversion of…

【C++】set,map,multiset,multimap的介绍和使用

set、map、multiset、multimap set、multiset的介绍和使用1、关联式容器2、键值对3、树形结构的关联式容器4、setset的介绍set的定义set的使用 5、multisetmultiset的介绍multiset的使用 map、multimap的介绍和使用1、map的介绍map的定义insert插入函数map的迭代器find查找函数…

Midjourney基础命令和提示词

1 基础命令 1.1 /imagine prompt 生成图片的核心命令&#xff0c;prompt 后输入描述。 /imagine prompt: A majestic dragon flying over a misty mountain, cinematic lighting, 4K resolution 高级提示 1.1.1 基本参数 图片比例 --ar 图片比例 混乱 Aspect Ratios --…