【C++】类和对象(上)

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

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题

C++是基于面向对象的,关注的是对象,将意见事情拆分为不同的对象,靠对象之间的交互完成。

这么说可能还是不太理解,简而言之,C语言在解决问题的过程中,每一步都需要我们自己来实现,而C++是将每一个功能封装一个类,类与类之间进行交互

2.类的引入

C语言结构体中只能定义变量,而在C++中,结构体内不仅可以定义变量还可以定义函数。C++是兼容C语言的,结构体的用法可以继续使用,同时结构体也升级为类

 虽然struct也可以定义类,但是C++中更习惯用class来定义类,struct定义的类,类内的成员都是public的,类外可以任意访问,但是class中有访问修饰符修饰,类外可以不能访问类中的成员

3.类的定义

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

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

类的两种定义方式:

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

class Stack
{
public:void Init(){top = capacity = 0;a = nullptr;}void push(int x){if (top == capacity){int newCapacity = capacity == 0 ? 4 : capacity * 2;a = (int*)realloc(a, sizeof(int) * newCapacity);}a[top++] = x;}void print(){for (int i = 0; i < top; i++){cout << a[i] << " ";}cout << endl;}int Top(){return a[top - 1];}
private:int top;int capacity;int* a;
};

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

一般情况采用第二种方式

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

class Date
{public:void Init(int year){year=year;//这里的year是成语变量还是函数形参}
public:int year;
};

 一般建议像下面这样写,将函数参数和成员变量的名字区别开

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

4.类的访问限定符及封装

4.1访问限定符

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

访问限定符:public(公共的)、protected(保护)、private(私有)

【访问限定符说明】

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

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

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

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

5.class的默认访问权限为private ,struct为public

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

【面试题】

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

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

4.2封装

【面试题】

面向对象的三大特性

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

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装本质上是一种管理,让用户更方便使用类

5.类的作用域

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

6.类的实例化

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

1.类是对对象进行描述的,是一个模板,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它,只有实例化了才会分配内存空间,实例化出的对象才能存储数据,占用物理空间

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

3.类实例化出的对象就像现实中使用建筑设计图造出的房子,类就像是设计图

7.类对象模型

对象的大小&对象的存储方式

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?

如果一个类的对象既包括成员变量由包括成员函数,每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每一个对象中都会保存一份代码,相同的代码保存多次,浪费空间。所以类对象应该只保存成员变量,成员函数存放在公共的代码段

结论:一个类的大小,实际就是该类中“成员变量”之和,当然要注意内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

8.this指针

8.1this指针的引出

C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户时透明的,即用户不需要来传递,编译器自动完成

this在实参和形参的位置不能显示写,但是在类里面可以显示用

8.2this指针的特性

1.this指针的类型:

2.只能在"成员函数"的内部使用

3.this指针本质上时“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针

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

【面试题】

1.this指针存在哪里?

this是一个形参,一般是存在栈帧中,但是vs下面一般会用ecx

2.this指针可以为空吗?

由下面的例子可以得到结论,this指针可以为空,只要不解引用就不会报错

 为什么都是空指针调用函数,结果却不一样?

 成员函数存放在公共的代码段中,所以成员函数是通过名字去找它的地址,这里的p没有被解引用,将p传递给print成员函数形参的隐藏参数this指针,左图没有解引用,所以没有报错,但是右图对this指针进行解引用所以会报错

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

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

相关文章

慕课网Go-4.package、单元测试、并发编程

package 1_1_User.go package usertype User struct {Name string }1_1_UserGet.go package userfunc GetCourse(c User) string {return c.Name }1_1_UserMain.go package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名&#xff0c;防止同名…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

【python脚本】python实现xml文件的图片标签可视化

【python脚本】python实现xml文件的图片标签可视化 批量实现文件夹下xml文件可视化展现结果。 import xml.dom.minidom import cv2 import os import xml.etree.ElementTree as ET""" 该脚本用于目标框可视化 IMAGE_INPUT_PATH&#xff1a;输入图片路径 XML_I…

Wi-Fi 6技术详解

1. 介绍 Wi-Fi 6&#xff0c;也称为802.11ax&#xff0c;是Wi-Fi技术的最新标准。它是对之前标准Wi-Fi 5&#xff08;802.11ac&#xff09;的升级和改进&#xff0c;旨在提供更高的速度、更大的容量、更好的性能和更高的可靠性。Wi-Fi 6技术的引入为无线网络带来了革命性的变化…

机柜PDU的选购也有大学问——与机柜PDU相关的那些事儿

在各行各业数据中心机房供配电建设过程中&#xff0c;机柜专用PDU电源插座看似是一个较为简单的用电设备&#xff0c;事实上又不那么简单。机柜PDU&#xff0c;是为安装在机柜内部的IT设备提供电源分配、管理的末端配电设备&#xff0c;在不同的工作场合对于PDU的规格要求也是不…

解决H5在iOS中视频播放自动全屏问题

在iOS端的Web控件上使用video标签播放视频时&#xff0c;视频会自动全屏播放。 解决方案 ios端video标签必须加webkit-playsinline、playsinline属性。 android端部分视频也会存在自动全屏问题&#xff0c;添加webkit-playsinline属性。 在HTML修改video标签 <video sr…

寻找峰值——力扣162

文章目录 题目描述法一 寻找最大值法二 二分法 题目描述 法一 寻找最大值 int findPeakElement(vector<int>& nums){return max_element(nums.begin(), nums.end()) - nums.begin();}法二 二分法 int findPeakElement(vector<int>& nums) {int l 0, r n…

目标检测中 anchor base和anchor free

目标检测中两种不同anchor的生成 趋势&#xff1a;anchor free越来越受到实时性检测的青睐&#xff0c;&#xff0c;&#xff0c;

二分图匹配算法

二分图匹配算法是一种用于解决二分图最大匹配问题的算法。 二分图&#xff1a; 在圖論中&#xff0c;二部圖&#xff08;bipartite graph&#xff09;是一類特殊的圖&#xff0c;又稱為、偶图、雙分圖。二分圖的頂點可以分成兩個互斥的独立集 U 和 V 的圖&#xff0c;使得所有…

机器人科普--AGILOX 叉车

机器人科普--AGILOX 叉车 1 概述2 导航3 驱动轮组4 叉举参考 1 概述 AGILOX 叉车&#xff0c;不需要画地图路径&#xff0c;很厉害。 2 导航 中间路径自由导航&#xff0c;末端规划出轨迹路线&#xff0c;并使用优良的控制器做轨迹追踪。 AGILOX &#xff5c; 10 Min setu…

ubuntn 18.04安装SourceInsight3.5(已验证)

Source Insight作为一款看代码神器在大型c、c项目中必不可少&#xff0c;但是Source Insight软件并不支持Linux操作系统&#xff0c;只支持Windows操作系统。 想要在linux系统上安装window软件就需要借助wine&#xff0c;wine 是一个能够在多种 POSIX-compliant 操作系…

Spring依赖注入

文章目录 前言1.依赖注入简介2. setter注入3. 构造器注入4. 自动装配 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0…

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c bbc

&#xfeff; 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、R…

TCP拥塞控制详解 | 1. 概述

网络传输问题本质上是对网络资源的共享和复用问题&#xff0c;因此拥塞控制是网络工程领域的核心问题之一&#xff0c;并且随着互联网和数据中心流量的爆炸式增长&#xff0c;相关算法和机制出现了很多创新&#xff0c;本系列是免费电子书《TCP Congestion Control: A Systems …

vue3搭建Arco design UI框架

技术&#xff1a;Vue3.2.40 UI框架&#xff1a;Arco design 2.44.7 需要安装:yarn 1.22.19 和npm 8.19.4 1.第一步安装本地全局arco脚手架 管理员运行CMD npm i -g arco-cli安装成功后如下&#xff1a; 2.第二步在需要存放项目的文件夹拉取项目 我这里把项目存放在 D:\W…

BCD编码方案

1.BCD码的原理 BCD码&#xff08;Binary-Coded Decimal&#xff09;是一种用二进制数来编码十进制数字的方式。BCD码使用4位二进制数来表示一个十进制数的每一位。 2.8421码映射 8421码是BCD码的一种实例化。 01234567890000000100100011010001010110011110001001 因此132…

计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)

文章目录 一&#xff1a;静态路由和动态路由二&#xff1a;静态路由的配置路由信息的方式演示三&#xff1a;默认路由四&#xff1a;公网IP和私网IP和NAT技术的基本理解 一&#xff1a;静态路由和动态路由 在说静态路由和动态路由前&#xff0c;我们需要来了解一下&#xff0…

【Windows】磁盘快捷修复

【Windows】磁盘快捷修复 1、背景2、关于Chkdsk3、示例 1、背景 前段时间使用U盘拷贝文件过程中&#xff0c;突然发现U盘无法读取了&#xff0c;U盘里面存储的数据也无法获取。 然后使用windows系统的chkdsk命令进行修复。 chkdsk全称&#xff1a;checkdisk&#xff0c;即磁盘…

【 Redis】的乱码问题

问题描述&#xff1a; 使用RedisTemplate存储的数据&#xff0c;在 redis-cli 客户端查看时&#xff0c;key 和 value 都会携带类似\xac\xad\这样的字符串。 原因&#xff1a; 由于默认使用了 jdk 的序列化方式。以下是支持的序列化方式 项目一般都会有缓存&#xff0c;常常…

go练习 day01

DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…