【C++】类与对象篇一

news2024/11/14 21:58:33

【C++】类与对象篇一

  • 一 .面向过程和面向对象初步认识
  • 二 .类的详解
      • 1.类的引入
      • 2.类的定义
      • 3.类的访问限定符及封装(面试题)
      • 4.类的作用域
      • 5.类的实例化
      • 6.类对象模型
  • 三 . 结构体内存对齐规则(面试题)
  • 四 . this指针
    • 1.this指针的特性
    • 2.this指针的(面试题)

一 .面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完

二 .类的详解

1.类的引入

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

2.类的定义

在这里插入图片描述
在这里插入图片描述

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

(1).class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
(2).类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数

类的两种定义方式:
(1). 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器 可能会 将其当成内联函数处理。
(2). 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:类外具体实现成员函数,函数名前需要加类名::一般情况下,更期望采用第二种方式。

3.类的访问限定符及封装(面试题)

(1) 访问限定符
【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. class的默认访问权限为private,struct为public(因为struct要兼容C)

【面试题】
问题:C++中struct和class的区别是什么?

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private
。注意:在继承和模板参数列表位置,struct和class也有区别,后序给介绍。

(2) 封装
【面试题】

面向对象的三大特性:封装、继承、多态。 在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。

4.类的作用域

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

class Person
{
public:
 void PrintPersonInfo();
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()

5.类的实例化

用类类型创建对象的过程,称为类的实例化
定义出一个类并没有分配实际的内存空间来存储,它实例化出的对象 占用实际的物理空间,存储类成员变量。

6.类对象模型

如何计算类对象的大小

只需要计算成员变量的大小(注意内存对齐),不需要计算成员函数的大小,无论定义多少对象,成员函数就只有一个是公用的. 编译器给了空类一个字节来唯一标识这个类的对象。

在这里插入图片描述
在这里插入图片描述

三 . 结构体内存对齐规则(面试题)

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

【面试题】
一.结构体怎么对齐? 为什么要进行内存对齐?
(1).如上:结构体内存对齐规则;
(2).

        1. 硬件要求‌:不同的硬件平台对于特定数据类型的访问有特定的内存对齐要求。
        2. ‌性能提升‌:内存对齐可以减少处理器访问内存时的额外开销。
        3. ‌存储空间优化‌:通过对齐数据,可以减少内存碎片的产生,提高内存的利用率。
        4.  ‌平台兼容性‌:内存对齐可以增加代码的可移植性和兼容性。

二.如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐?

‌在C++中,结构体可以按照指定的对齐参数进行对齐,但直接指定对齐字节数的方式并不直接支持。

三.什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景

‌大小端‌是指计算机存储数据时字节的顺序方式,分为大端模式(Big-endian)和小端模式(Little-endian)。
//小端存储方式:低地址存储低数据,高地址高数据

int main()//小端存储方式:低地址存储低数据,高地址高数据
{
	int a = 0x12345678;
	printf("%x ", a);
	char* p = (char*)&a;
	if (*p == 0x78)
	{
		printf("编译器为小端存储类型");
	}
	 if (*p == 0x12)
	{
		printf("编译器为大端存储类型");
	}
	return 0;
}

四 . this指针

C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数即this指针让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问

1.this指针的特性

  1. this指针的类型:类型 * const,即成员函数中,不能给this指针赋值
  2. 只能在成员函数的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参所以对象中不存储this指针

本质代码:

class Date
{
public:
	void Print(Date *const this)//不隐藏
	{
		cout << this -> a <<endl;//不隐藏
	}
private:
	int _a;
};
int main()
{
	Date d1;
	d1.Print(&d1);//不隐藏,对象地址作为实参传递给
this形参
	return 0;
}

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d9e5fcb58bee418aa107e8fb0daeda30.png

  1. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递

2.this指针的(面试题)

【面试题】
1. this指针存在哪里?
在这里插入图片描述
2. this指针可以为空吗?
可以
在这里插入图片描述

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

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

相关文章

WOFOST的web应用

目录 运行可视化 参考链接 https://github.com/irripro/WOFOST_streamlit/tree/main 运行 运行主程序.py之后&#xff0c;得到一串命令 将该命令放到命令台中运行 然后会转到WOFOST的web端上 可视化 目前好像只支持欧洲区域的模拟运行

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

mysql 日期字段自动填写日期 及自动更新日期

INSERT 时 自动给日期字段 添加 当前日期时间&#xff1a; 在默认里选中&#xff1a; CURRENT_TIMESTAMP UPDATE 时 自动给日期字段 更新 当前日期时间&#xff1a; 勾选&#xff1a;根据当前时间戳更新

通过VIN车架号查询车辆登记日期

我们先来介绍下什么是vin码&#xff0c;以及vin码的构成结构解析&#xff0c;汽车VIN码&#xff0c;也叫车辆识别号码&#xff0c;通俗可以理解为汽车的身份证号码。 接口介绍 通过17位vin码&#xff0c;获取到车辆的发动机号&#xff0c;初登日期&#xff0c;车辆型号等信息。…

CI/CD之Jenkins用于Linux系统的部署方式汇总

目录 一、前言 二、CI/CD的定义与核心原则 CI/CD在现代软件开发中的重要性 CI/CD与Jenkins的关系 三、Jenkins部署方式汇总 1. 独立服务器部署 &#xff08;1&#xff09;离线安装 &#xff08;2&#xff09;在线安装 2. Docker容器部署 3. Kubernetes集群部署 4. 云…

聚焦自闭儿童:关注与理解

在探讨一个三岁自闭症孩子不会说话的情况时&#xff0c;我们首先需要理解自闭症这一复杂神经发育障碍的本质&#xff0c;以及它如何影响儿童的社交互动、沟通能力和行为模式。自闭症不仅仅是一个简单的“不会说话”的问题&#xff0c;而是一系列症状的综合体现&#xff0c;这些…

机器学习:随机森林决策树学习算法及代码实现

1、概念 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树来进行分类或回归预测。随机森林的核心原理是“集思广益”&#xff0c;即通过组合多个弱学习器&#xff08;决策树&#xff09;的预测结果来提高整体模型的准确性和健…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

tomcat服务器相关搭建

文章目录 web应用服务器tomcatTomcat功能及介绍配置tomcat服务器生成tomcat启动文件 nginx反向代理session共享服务器 web应用服务器tomcat Tomcat功能及介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和…

香橙派AIPro开发板安装PyQt5 aarch64

香橙派AIPro开发板安装PyQt5 参考 开发板信息 官网开发板信息 软件环境信息 1、安装依赖环境 sudo apt-get install cmake gcc g pip3 install --upgrade pip pip3 install wheel setuptools sudo apt-update sudo apt-get install qt5-default sudo apt-get install qtd…

为什么互联网上要设立防火墙?WAF又是什么?

防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…

python库(21):

1 TextBlob简介 TextBlob 是一个基于 Python 的文本处理库&#xff0c;能够让基础的自然语言处理任务变得异常简单。 它提供了一个简单直观的 API&#xff0c;让你能够轻松执行词性标注、名词短语提取、情感分析、文本分类和关键词提取等功能。 值得一提的是&#xff0c;Tex…

计算机网络计算题【408】——里昂视频

计算机网络【408】计算题 计算机网络概述【17题】【18题】甘特图【19题】甘特图【20题】【21题】 通信基础【14】求最大传输速率使用两个公式【27】【28】【29】差分曼彻斯特【30】[21]重点 p14 通信基础T31 流量控制与可靠传输机制T21 选择重传协议[GBN]:SR [22][24]***⭐【25…

linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

通用定时器,输入捕获

这个图片主要看评论 这个是定时器输入捕获的基本配置步骤&#xff0c;主要也是看评论 注意&#xff1a;输入捕获开了两个中断&#xff0c;一个是捕获中断&#xff0c;只要有上升沿或者下降边沿或者双边沿&#xff0c;&#xff08;主要看设置的捕获什么边沿&#xff09;&#x…

【Python 千题 —— 基础篇】图形的面积(圆形)

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个面向对象的程序,定义一个 Circle 类,该类有一个属性 radius(圆的半径),并具有一个方法 area() 来计算圆的面积。请根据以下要求实…

IM项目:进阶版即时通讯项目---文件存储和消息转发

文章目录 文件传输服务基本功能模块划分流程图实现逻辑代码实现 消息转发功能设计模块划分获取转发目标和消息处理代码实现 文件传输服务 基本功能 文件的上传文件的下载 模块划分 基于gflags进行参数和配置文件的解析基于spdlog进行日志输出基于etcd进行服务注册基于brpc进…

关于超长字符串/文本对应的数据从excel导入到PL/SQL中的尝试

问题&#xff1a; 1.字符串太长 2.str绑定之的结尾null缺失 将csv文件导入到PL/SQL表中存在的一些问题 1.本来我是需要将exceL上的几十条数据导入到PL/SQL数据库的一张表中&#xff0c;结果我花了许多时间 去导入。 想想一般情况下也就几十条数据&#xff0c;直接复制粘贴就…

并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理

当前&#xff1a;并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 计算机网络--面试知识总结一 计算机网络-----面试知识总结二 计算机网络--面试总结三&#xff08;Http与Https&#xff09; 计算机…