类与对象(上-2)

news/2025/2/5 22:01:02/

类与对象(上-2)

  • 6、类的实例化
  • 7、计算类空间的大小
  • 8、this指针

6、类的实例化

Test.cpp

//用类类型创建对象的过程,称为类的实例化。
//类是对对象进行描述的,是一个 模型 一样的东西,来限定了类有哪些成员,定义一个类但并没有分配实际的内存空间来存储它。
//例如:设计出一个大楼的建筑模型,来指导大楼的实际建设。int mian()
{Person p1;  //类的实例化Person p2;Person p3;return 0;
}

F.h

#pragma once
#include <iostream>
using namespace std;class Person
{
public:void PrintPersonInfo();  //函数的申明private:char _name[20];      //变量的申明  (如何区分变量的申明和定义){申明:没有给变量开空间; 定义:给变量开了空间。}char _gender[3];     //这儿的成员变量处于类内,没有开空间。当用类来实例化对象时,才开辟的空间。int _age;
};

F.cpp

#include "Person.h"//这里需要指定PrintPersonInfo是属于Person这个类域的 
void Person::PrintPersonInfo() //函数的定义
{cout << _name << " " << _gender << " " << _age << endl;
}

7、计算类空间的大小

//{虽然没有给类开辟空间,但是可以计算类占据空间的大小}
//(1)类的空间大小计算与结构体相似,都遵循内存对其原则。
//(2)只计算类内的成员变量,而成员函数不需要考虑(因为成员函数不存储在实例化对象内,而是存储在公共代码区)
//(3)特殊的类:(没有成员变量的类对象,大小为:1byte;占位不存储实际数据,标识对象存在)。#include <iostream>
using namespace std;class A
{
public:void PrintA(){cout << _a << endl;}void FuncA(){cout << "FuncA()" << endl;}//private:char _a;
};int main()
{//类的存储模式:成员变量存储在实例化对象内,成员函数存储在公共代码区。
//实例化的每个对象的成员变量是不同的变量,具有独立的空间;而从各个对象的成员函数角度分析,调用的成员函数是同一个。
//所以如果将成员函数每次都保存在对象内,会造成空间浪费。A aa1;A aa2;aa1._a = 1;aa2._a = 2;aa1.PrintA(); //编译链接时,就根据函数名去公共代码区找到函数的地址 {call函数地址}。aa2.PrintA();A* ptr = nullptr;ptr->FuncA();  //运行结果是:程序正常运行打印;因为对象的成员函数FuncA保存在公共代码区,不需要对ptr进行解引用(没有动空指针),不会出错。return 0;
}

8、this指针

#include <iostream>
using namespace std;class Data
{
public://实参和形参位置不能显示传递和接收this指针,但是可以在成员函数内部使用this指针void Init(int year, int month, int day) //默认在参数的最前面加上: Data* const this (this本身不可修改,但是this指向的内容可以修改){this->_year = year;this->_month = month;_day = day;}void Print() //默认加参数: Data* const this{cout << this->_year << "-" << _month << "-" << _day << endl;}private:int _year;  //类的成员变量命名在首字母前面加 _int _month;int _day;
};int main()
{Data d1;      //虽然类的成员变量是私有的,无法在外面直接修改。但是可以通过调用成员函数去修改d1.Init(2022, 7, 17);Data d2;d2.Init(2022, 7, 18); //默认在参数的最前面加:&d2d1.Print(); //默认加参数:&d1d2.Print();return 0;
}//this指针存储在栈区,this指针是形参。存在某些优化的情况下,this指针存储在寄存器。

练习题目:

#include <iostream>
using namespace std;class A
{
public:void PrintA(){cout << this << endl;cout << _a << endl;}void Print(){cout << this << endl;cout << "Print()" << endl;}private:int _a;
};int main()
{A* p = nullptr;//p->Print();  //运行正常:程序正常运行打印;因为对象的成员函数FuncA保存在公共代码区,不需要对p进行解引用(没有动空指针),不会出错。p->PrintA();   //运行崩溃:PrintA非法访问了空指针return 0;
}

http://www.ppmy.cn/news/991820.html

相关文章

一文搞懂mysql(安装、基础命令、存储文件)

1、安装 除此之外&#xff0c;windows在安装前需要额外补加两个东西 dxwebsetup.exe、 vcredist_x64.exe 这俩随便一搜就能找到 在安装前者时要注意取消勾选bing工具栏 mysql下载链接 2、初始化 管理员身份打开cmd >> "path_to_mysql/bin/msqld.exe" --initi…

二叉树中的深搜

一)计算布尔二叉树的值 2331. 计算布尔二叉树的值 - 力扣&#xff08;LeetCode&#xff09; 1)计算布尔二叉树需要从叶子节点向上进行计算&#xff0c;从下向上进行计算 2)完整二叉树是同时拥有左孩子和右孩子&#xff0c;或者是完全没有右孩子 3)当我只是盯着根节点来看的时候…

.Net Core上传组件_.Net Core图片上传组件_Uploader7.0

一、.Net Core上传组件Uploader7.0简介 1.当前版本v7.0&#xff0c;前端框架丰富升级 2.前端jquery框架封装,cover.js, 腾讯云cos-js-sdk-v5.min.js 3.后端&#xff0c;支持Asp.Net 和 Asp.Net Core 矿建 4.数据传输模式支持&#xff1a;WebScoket 、Ajax、Form 模式上传到…

浏览器访问nginx转发打开oss上的html页面默认是下载,修改为预览

使用阿里云盒OSS上传了html页面&#xff0c;在nginx里配置跳转访问该页面时&#xff0c;在浏览器里直接默认下载了该页面&#xff0c;现在想实现预览功能&#xff0c;只需在nginx里的location里修改消息头的Content-Disposition为inline即可 注意要隐藏头信息proxy_hide_header…

【Linux】网络基础

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统网络编程 文章目录 一、协议初识和网络协议分层&#xff08;TCP/IP四层模型&#xff09;认识协议TCP/IP五层&#xff08;或四层&#xff09;模型 二、认识MAC地址和IP地址认识MAC地址认识IP地址认…

罗布乐思Roblox学习笔记

罗布乐思 文章目录 罗布乐思基本操作CFrameGUIModule script呼吸灯商店imageChangetag标签知识答题showTips 基本操作 缩放按shift 等比例缩放 ctrl 双向缩放 复制对象 ctrlD &#xff08;如果选择多个对象&#xff0c;按住ctrl&#xff09; F 聚焦 Workspace ​ Terrain…

使用Express部署Vue项目

使用Express部署Vue项目 目录 1. 背景 2. 配置Vue CLI 1.1 安装nodejs 1.2 创建vue-cli 1.3 创建vue项目 1.4 构建vue项目3. 配置Express 2.1 安装express 2.2 创建项目4. 使用express部署vue项目 1&#xff0c;背景 我们想要做一个前后端分离的课程项目&#xff0c;前端…

数据库选型

影响数据库选择的因素 数据量&#xff1a;是否海量数据&#xff0c;单表数据量太大会考验数据库的性能数据结构&#xff1a;结构化 (每条记录的结构都一样) 还是非结构化的 (不同记录的结构可以不一样)是否宽表&#xff1a;一条记录是 10 个域&#xff0c;还是成百上千个域数据…