【C++】类和对象(类的定义,类域,实例化,this指针)

news2024/9/28 21:12:39

目录

一. 类的定义

【对比c】结构体和类的区别

1. 称呼:变量 or 对象? 

2. 类型:

3. 访问限定:

4. c和c++结构体使用

5. 相同点: 

二. 类域

三. 实例化

1. 1对N

2. 计算大小只考虑成员变量

3. 到此一游

四. this指针

this的隐藏使用

注意:

this作用:

题目深刻理解this 


一. 类的定义

< c++中,类可以用class关键词实现,也可以用结构体struct实现 >

以下是class关键词的使用

如下代码, class为定义类的关键字,Stack为你取的类的名字,{ }内为类的主体

class Stack
{
	//成员变量
	int* array;
	size_t capacity;
	size_t top;


	//成员函数
	void Init(int capacity = 4)
	{

	}
};

注意一:也许会遇上如下初始化的时候,capacity(成员变量) = capacity(函数创建的临时变量)

区分方法:定义成员变量可以在变量前加标识符“_”

class Stack
{
	//成员变量
	//定义成员变量可以在变量前加标识符“_”
	int* _array;//如 int* _array 或者 array_ 
	size_t _capacity;//加标识符是为了方便区分如下函数Init的初始化谁是谁
	size_t _top;

	//成员函数
	void Init(int capacity = 4)
	{
		//一目了然,左边是成员变量,右边是函数接收传参的临时变量
		_capacity = capacity;
	}
};

注意二

【对比c】结构体和类的区别

以下是我们定义数据结构中“栈”用结构体两种形式的代码

//定义栈的结构体
typedef int STDataType;
typedef struct Stack
{
	STDataType* arr;
	int capacity;
	int top;
}ST;


//Stack类
class Stack
{
	//成员变量
	int* array;
	size_t capacity;
	size_t top;
}

1. 称呼:变量 or 对象? 

2. 类型:

  • 结构体的类型是 struct Stack(除非你取typedef 类型名称)
  • 类的类型直接就是 Stack

3. 访问限定:

扩展知识:c++访问限定符

共有(public) :类外也可以访问(如也可以在main中使用)

私有(private):只允许类内访问

  • 结构体默认公有(c++也可以对结构体进行自定义共有和私有)
  • 默认私有(没加访问限定符的时候
  • 类可以自定义 共有(public) 和 私有(private)

结构体

4. c和c++结构体使用

c++比c语言多了可以在结构体里写函数 ,且c++的结构体不用typedf也能直接省略struct做类名 

c++创建结构体

5. 相同点: 

调用对象/函数  .

调用指针 ->

   Stack.Init(); 
   ST.Init();

   Stack->arr;
   ST->arr;

二. 类域

.c++一共有四大域:函数局部域、全局域、命名空间域和类域。

而我们之前在类中定义的成员函数和成员变量,就属于类域

通俗说,不同类域相当于不同家族,不同家族里可以都叫“张伟”不会混,相同家族就有可能。

函数 声明定义分离 要 指定类域

声明与定义区分的根本是:是否有开辟空间

  • 声明:系统未给开辟空间
  • 定义:系统给开辟了空间

头文件定义后,在源文件使用要声明类

格式:     函数返回类型 类名:: 函数名(传参列表)

                              void  Stack:: Init (int n)

举例来说 如下就是标准的类的声明和定义分离

在Stack.cpp文件中指定我们要查找的函数Init(),前面带上指定的类域

Stack.h

复习一下:(缺省参数在声明和定义都在的时候只能给声明,不能给定义) 

//这是你头文件定义的类的基本结构
class Stack
{
public:
    void Init(int n = 4);//缺省参数在声明和定义都在的时候只能给声明,不能给定义
 
private:
    int* _a;
    int top;
    int _capacity;
};

 Stack.cpp

为了让编译器找到类中的函数,我们需要在前面加上 Stack:: 指定类域

#include"Stack.h"
 
//我们在类外面定义函数
void Stack::Init(int n )
{
    //...
}

三. 实例化

这是我之前写的博客内容

1. 1对N

一个类可以实例化多个对象

2. 计算大小只考虑成员变量

不包含成员函数

计算方式遵循内存对齐原则

内存对齐原则

3. 到此一游

当类中只有成员函数或者类为空类时,其所创建的对象大小为1字节,纯属占位作用

四. this指针

this的隐藏使用

代码引入

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	MyClass(int a = 0, float b = 0, char c = 0)//构造函数,用于初始化对象的成员变量,后续会给大家介绍
	{
		_a = a;
		_b = b;
		_c = c;
	}
	void Print()
	{
		cout << _a << endl;
		cout << _b << endl;
		cout << _c << endl;
	}
private:
	int _a;
	float _b;
	char _c;
};
 
int main()
{
	MyClass m = { 1,5.5,'w' };
	m.Print();
}

如上print函数没有参数,为什么能准确传参?

实际上,这里的Print函数的参数的第一个位置,存在一个隐含的this指针

该函数调用当中的this指针指向的是对象m,自动访问其地址

注意:

形参和实参传参列表(this指针会自动在参数第一个位置生成)不可直接使用this,仅可在类的成员函数中使用。 

this作用:

1. 当我们需要使成员函数返回该对象的地址,就可以return this;
2. 当函数内的局部变量与类的成员变量名发生冲突时,就可以在类成员前加上this->,便于区分。

题目深刻理解this 

1. 以下代码的运行结果是? 

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	void Print()
	{
		cout << "hehe" << endl;
	}
private:
	int _a;
};
 
int main()
{
	MyClass* a = nullptr;
	a->Print();
}

题目简单说,就是创建类指针a,并调用函数Print

答案正常运行,打印“hehe”。

解析:虽然使用了“->”,但是并没有对空指针a进行解引用,本质是将a传递给了形参this指针

没有解引用→没有访问成员变量,只打印了“hehe”,所以不会发生问题,程序正常运行。

2. 以下代码的运行结果是? 

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	void Print()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
 
int main()
{
	MyClass* a = nullptr;
	a->Print();
}

答案运行崩溃。

 解析:函数内部访问成员变量_a,_a本质是由this指针解引用访问到的

出现空指针解引用的问题,运行崩溃。

希望对你有帮助

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

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

相关文章

一、前后端分离及drf的概念

1.1什么是前后端分离 程序角度 前后端不分离&#xff1a;一个程序&#xff08;如django),接收请求处理HTML模版用户返回 前后端分离&#xff1a;两个程序 --前端&#xff1a;vue.js/react.js/angular.js --后端&#xff1a;Django drf(django rest framework) 2.专业角度 --…

3.消息机制总结——总结

Handler 机制的底层逻辑就是利用 epoll eventfdAndroid2.3开始 Google把Handler的阻塞/唤醒方案从Object#wait()/notify(),改为Linux epoll实现&#xff0c;why&#xff1f;原因在于&#xff0c;native也引入了消息管理机制&#xff0c;用于提供个C/C开发者使用&#xff0c;而…

nicegui组件button用法深度解读,源代码IDE运行和调试通过

传奇开心果微博文系列 前言一、button 组件基本用法1. 最基本用法示例2. 创建带图标按钮 二、button按钮组件样式定制1. 按钮的尺寸调整2. 改变颜色示例3. 按钮的自定义字体大小4. 圆角形状示例5. 自定义边框6. 添加阴影7. 复合按钮8. 浮动按钮9. 可扩展浮动操作按钮QFAB10. 按…

使用k8s部署java前后端服务

一、项目架构 前端、后端、数据库 1&#xff09;前端 静态的资源&#xff1a;img css html js文件 js&#xff1a;axios、ajax 2&#xff09;后端 提供数据&#xff1a;根据web前端发送的请求&#xff0c;从数据库中获取数据 请求都是无状态的&#xff0c;如何保持会话 …

依赖注入之set注入

set注入 set注入&#xff0c;基于set王法实现的&#xff0c;底层通过反射机制调用属性对应的set方法&#xff0c;然后给属性赋值&#xff0c;这种方法要求属性必须对外提供set方法 1. 想让Spring调用对应的set方法&#xff0c;需要配置property标签 2. name属性怎么指定值:s…

【含文档】基于Springboot+微信小程序 的高中信息技术课程在线测试系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 当游客…

解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

CentOS系统yum出现Could not retrieve mirrorlist问题

问题 yum search wget当使用yum命令来搜索或安装软件时&#xff0c;如果出现Could not retrieve mirrorlist&#xff0c;即无法检索镜像列表。出现的问题截图如下&#xff1a; 解决方法&#xff1a; 跳转到root用户 su - rootcd到/etc/yum.repos.d/目录下 cd /etc/yum.rep…

异步框架 fastapi -- 简单介绍

文章目录 fastapi 介绍restful接口设计简单应用Swagger风格的接口文档 fastapi 介绍 fastapi官方文档 fastapi 是现代化、高性能、基于python标准类型注释的异步web框架&#xff1b;基于python构建web APIs&#xff0c;性能可比go语言&#xff1b;高效编码&#xff0c;更少的…

大数据的挑战是小文件

小文件可能会给存储平台及其支持的应用程序带来大问题。在 Google 上搜索 “small files performance” 会产生 2M 的结果。这篇博文将更深入地研究小文件问题&#xff0c;深入研究其根源并总结解决方案。 问题陈述 出于本讨论的目的&#xff0c;小文件通常被视为小于 64 KB …

攻防世界---->happyctf

做题笔记。 下载 查壳。 32ida打开。 先运行一下&#xff1a; C写的。 追踪 good job 具体跟踪分析&#xff1a; 说白了&#xff0c;就是一个用于判断 flag key的。 往上走&#xff1a; 跟进。 打开 od吧。 锁定地址 追踪看看。&#xff08;此题&#xff0c;ida不能动态 od可以…

Hugging Face从命令行到桌面:Chat-macOS让AI互动更简单,关键还免费!

你是否曾经觉得,命令行操作虽然强大,但总是有些难以上手?或者,你是否希望和AI互动可以像日常使用macOS应用一样直观?那你一定要试试Chat-macOS,它让你从命令行走向桌面,体验更轻松的AI互动方式。 1. 什么是Chat-macOS? Chat-macOS是一个桌面应用程序,它能够将Hug…

Windows安全日志7关键事件ID分析

背景 Windows日志里的事件分析有助于在系统出现异常时分析出异常原因&#xff0c;利于针对问题做出系统的修复和预防。今天阿祥就整理出Windows常见的事件&#xff0c;分析这些事件的具体原因&#xff0c;希望对系统运维工程师们有一定的帮助&#xff01; 具体事件ID 1、事件ID…

MySQL—触发器详解

基本介绍 触发器是与表有关的数据库对象&#xff0c;在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。 触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录、数据校验等操作。 使用别名 NEW 和 OLD 来引用触发器中发生变化的记…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…

[论文阅读] ChartInstruct: Instruction Tuning for Chart Comprehension and Reasoning

原文链接&#xff1a;http://arxiv.org/abs/2403.09028 源码链接&#xff1a;https://github.com/vis-nlp/ChartInstruct 启发&#xff1a;本文构建的instruction-tuning数据集以及使用该数据集对模型进行微调的过程都值得学习。 Abstract 研究对象&#xff1a;图表 研究…

yakit使用教程(一,下载并进行基础配置)

一&#xff0c;yakit简介 YAKIT&#xff08;Yet Another Knife for IT Security&#xff09;是一款网络安全单兵工具&#xff0c;专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具&#xff0c;例如密码破解工具、网络扫描器、漏洞利用工具等&#xff0c;帮…

空间复杂度动态顺序表

目录 1>>闲话 2>>空间复杂度 3>>顺序表&#xff01;&#xff01;&#xff08;有点难度&#xff09; 3.1>>静态顺序表 3.2>>动态顺序表 3.2.1>>初始化动态顺序表 3.2.2>>实现尾插 4>>结语 1>>闲话 感谢大家对小…

【YOLO目标检测反光衣数据集】共2388张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;2388 标注数量(txt文件个数)&#xff1a;2388 标注类别数&#xff1a;2 标注类别名称&#xff1a;reflective_clothes、other_clothes 数据集下载&#xff1a;反光衣数据集 图片示例 数据…