C++:类 的简单介绍(一)

 

目录

类的引用:

 类的定义:

类的两种定义方式:

成员变量命名规则的建议: 

类的访问限定符及封装:

访问限定符 

【访问限定符说明】

封装 

class与struct的区别:

类的作用域:

类的实例化: 

  如何计算类的大小

类的内存对齐:

在VS编译器中类的存储原理:


类的引用:

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现, 会发现struct中也可以定义函数。

typedef int DataType;
struct Stack
{
 
 void Init(size_t capacity)
 {

   _array = (DataType*)malloc(sizeof(DataType) * capacity);
   if (nullptr == _array)
  {
   perror("malloc申请空间失败");
   return;
   }
   _capacity = capacity;
   _size = 0;
 
}

 void Push(const DataType& data)
 {
 // 扩容
   _array[_size] = data;
   ++_size;
 }

 DataType Top()
 {
   return _array[_size - 1];
 }

 void Destroy()
 {
   if (_array)
  {
   free(_array);
   _array = nullptr;
   _capacity = 0;
   _size = 0;

   }

 }

 DataType* _array;
 size_t _capacity;
 size_t _size;

};
int main()
{
 Stack s;
 s.Init(10);
 s.Push(1);
 s.Push(2);
 s.Push(3);
 cout << s.Top() << endl;
 s.Destroy();
 return 0;
}

不过,上面的结构体在C++语言中,通常将class 代替 struct  。 

 类的定义:

//类:
class className
{
  类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号


//其实和结构体的定义差不多


//结构体:
struct tag
{
 member-list;
}variable-list;

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分 号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者 成员函数。 

类的两种定义方式:

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理 

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

 

成员变量命名规则的建议: 

我们看看这个函数,是不是很僵硬?
class Date
{

public:
 
void Init(int year)
 {

 //这里的year到底是成员变量,还是函数形参?
 
 year = year;

 }

private:
  int year;
};

所以一般都建议这样
class Date
{
public:
 
 void Init(int year)
 {
   _year = year;
 }

private:
 
  int _year;
};


或者这样

class Date
{
public:
 
 void Init(int year)
 {
   mYear = year;
 }
private:
  int mYear;
};

 其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行。

类的访问限定符及封装:

访问限定符 

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

【访问限定符说明】

1. public修饰的成员在类外可以直接被访问

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C),这也是struct和class的区别之一

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别 

封装 

面向对象的三大特性:封装、继承、多态 

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。 封装本质上是一种管理,让用户更方便使用类。 

class与struct的区别:

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来 定义类,和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类 默认访问权限是private。

类的作用域:

类定义了一个新的作用域,类的所有成员都在类的作用域中。

在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。 

class Person
{

public:
 
 void PrintPersonInfo();

private:
 
 char _name[20];
 
 char _gender[3];
 
 int  _age;

};

// 这里需要指定PrintPersonInfo是属于Person这个类域

void Person::PrintPersonInfo()
{

 cout << _name << " "<< _gender << " " << _age << endl;

}

类的实例化: 

用类类型创建对象的过程,称为类的实例化,类的实例化和Java有些相似。 

  如何计算类的大小

一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 

同时常见的类有三种类型: 

// 类中既有成员变量,又有成员函数
class A1 {
public:
    void f1(){}
private:
    int _a;
};

// 类中仅有成员函数
class A2 {
public:
   void f2() {}
};

// 类中什么都没有---空类
class A3
{};

sizeof(A1) : ___4___ sizeof(A2) : __1____ sizeof(A3) : ___1___ 

 从上述代码可以得出:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

注意没有成员变量的类对象大小1个字节占位,标识对象实例化时,定义出来存在过

类的内存对齐:

其实和结构体的内存对齐一样  结构体的简单介绍(3)——结构体的内存对齐-CSDN博客

1. 第一个成员在与结构体偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8

3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 

在VS编译器中类的存储原理:

 众所周知,只有在定义了一个变量,空间才会开辟,在没有定义变量之前内存中是不会产生存储空间的。

而在类中,类中的成员变量其实并不是变量的定义,而是一种变量的声明,因此在类中的成员变量并不会产生空间,只有在定义整个类时才会产生出空间。

反倒是成员函数,在VS编译器中,成员函数其实是处在一个公共的区域中,每当需要调用时都会进入这个空间来使用函数。

 

 


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

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

相关文章

JVM-字节码文件的组成

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中。 运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等等内容都会放在这块区域中。…

机器学习_集成学习之Boosting(提升较弱的模型,以降低弱模型的偏差)

文章目录 介绍AdaBoost算法梯度提升算法(GBDT)极端梯度提升(XGBoost)Bagging 算法与 Boosting 算法的不同之处 介绍 Boosting 的意思就是提升&#xff0c;这是一种通过训练弱学习模型的“肌肉”将其提升为强学习模型的算法。要想在机器学习竞赛中追求卓越&#xff0c;Boosting…

Go语言安装及开发环境配置

目录 官网 国内 Linux(CentOS & Ubuntu)安装 环境变量设置 命令行下开发 开发模式执行 编译 IDE下开发 插件安装 安装依赖工具 运行 常见问题 1、dial tcp 172.217.160.113:443: i/o timeout 2、VS Code不能完美显示zsh问题 官网 访问Golang官网的下载链接&a…

Python tkinter (6) —— Listbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 目录…

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制&#xff0c;修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…

SpringBoot不同的@Mapping使用

文章目录 一、介绍二、使用 一、介绍 一般Mapping类注解在Spring框架中用于将HTTP请求映射到对应的处理器方法。它们各自对应于不同类型的HTTP方法&#xff0c;主要用于RESTful Web服务中。以下是每个注解的作用&#xff1a; GetMapping: 用于映射HTTP GET请求到处理器方法。通…

操作符讲解

目录 二进制和进制转换 原码、反码、补码 移位操作符 位操作符 一道面试题&#xff1a; 练习1&#xff1a; 思考题&#xff1a; 练习2&#xff1a; 逗号表达式 函数调用操作符() 结构成员访问操作符 结构体 操作符的属性&#xff1a;优先级、结合性 优先级&#x…

༺༽༾ཊ—Unity之-03-建造者模式—ཏ༿༼༻

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

IndexedDB入门

https://www.cnblogs.com/zhangzuwei/p/16574791.html 注意 1.删除表&#xff0c;创建表只能在数据库版本升级里面进行。 2.keypath: key 要和表字段对应&#xff0c;而且格式要一样&#xff0c;不然不运行不报错。 3.使用 autoIncrement: true 代替 keypath: key&#xff…

C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)

给定 n 对正整数 ai,bi &#xff0c;对于每对数&#xff0c;求出一组 xi,yi &#xff0c;使其满足 aixibiyigcd(ai,bi) 。 输入格式 第一行包含整数 n 。 接下来 n 行&#xff0c;每行包含两个整数 ai,bi 。 输出格式 输出共 n 行&#xff0c;对于每组 ai,bi &#xff0c;求…

实验5:冒泡法排序

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 3、实验要求&#xff1a; 4、程序流程图&#xff1a; 5、实验源程序&#xff1a; 6、实验要求分项截图及结果分析&#xff1a; 1、实验目的&#xff1a; 通过冒泡法排序程序设计&#xff0c;掌握将多重循环程序设…

技术书评和笔记【01】脑机接口-电路与系统 【2020版】

前言: 荷兰作者,Amir Zjajo博士,毕业于荷兰代尔夫特理工大学,方向 面向移动健康的低功耗混合型号电路与系统,以及,面向认知的神经形态电路。 ,脑机接口 - 电路与系统一书,系统介绍了,脑机接口电路与系统的实现技术,尤其,提到了量产和设计的问题,难能可贵,摘录如…

浪潮信息集中式存储仪电云云操作系统兼容性良好 通过澎湃技术认证

日前&#xff0c;浪潮信息集中式存储与仪电云i-stack云操作系统软件完成澎湃技术认证。在兼容性测试认证中&#xff0c;双方均表现出良好的兼容性能&#xff0c;同时系统运行可靠稳定&#xff0c;功能及性能表现俱佳。 浪潮信息澎湃技术认证是浪潮信息基于自身多元、创新的通用…

实际项目中的SpringAOP实现日志打印

目录 一、AOP实现日志 1.1 需求分析&#xff1a; 1.2 定义切面类和切点&#xff1a; 扩展&#xff1a;finally中的代码块一定会执行吗&#xff1f; 扩展 总结 1.3 定义环绕通知 1.4 handleBefore 的具体实现 1.4.1 获取url 1.4.2 获取接口描述信息 1.4.3 后续获取 1.5…

二叉树|116.填充每个节点的下一个右侧节点指针 117. 填充每个节点的下一个右侧节点指针 II

116.填充每个节点的下一个右侧节点指针 题目&#xff1a; 给定一个完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next …

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…

如何在AirPods Pro中使用降噪功能?这里提供几个方法

本文介绍了如何在AirPods Pro上使用降噪功能&#xff0c;如何关闭它&#xff0c;以及该功能的工作原理。 注意&#xff1a;AirPods Pro和AirPods Max支持噪音消除。你的设备必须运行iOS 13.2或iPadOS 13.2或更高版本才能使用降噪功能。 如何在AirPods Pro上打开降噪功能 Air…

CSS color探索

CSS 颜色探索 在 CSS 的世界里&#xff0c;颜色为网页元素赋予了丰富的视觉效果。通过预定义的颜色名称、RGB、HEX、HSL&#xff0c;以及支持透明度的 RGBA 和 HSLA&#xff0c;我们可以创造出各种吸引人的设计。接下来&#xff0c;我们将通过示例代码来深入了解这些颜色应用。…

重构改善既有代码的设计-学习(六):处理继承关系

1、函数上移&#xff08;Pull Up Method&#xff09; 无论何时&#xff0c;只要系统内出现重复&#xff0c;你就会面临“修改其中一个却未能修改另一个”的风险。通常&#xff0c;找出重复也有一定的难度。 所以&#xff0c;某个函数在各个子类中的函数体都相同&#xff08;它们…

MYSQL中group by分组查询的用法详解(where和having的区别)!

文章目录 前言一、数据准备二、使用实例1.如何显示每个部门的平均工资和最高工资2.显示每个部门的每种岗位的平均工资和最低工资3.显示平均工资低于2000的部门和它的平均工资4.having 和 where 的区别5.SQL查询中各个关键字的执行先后顺序 前言 在前面的文章中&#xff0c;我们…