当前位置: 首页 > news >正文

类与对象(上),咕咕咕

1.类的定义

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

struct也可以定义类,struct中也可以定义函数。

定义在类中的成员默认为inline。

2.访问限定符

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

public修饰的成员在类外可以直接被访问,protected和private修饰的成员在类外不能直接被访问。

访问权限作用域从该访问限定符出现的位置开始知道下一个访问限定符或者}出现为止。

class定义成员没有被访问限定符修饰默认private,struct默认为public.

一般成员变量都会被限制为private/protected,需要给别人使用的成员函数为public

3.类域

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

类域影响编译的查找规则,当前域找不到成员就到类域中找。

#include<iostream>
using namespace std;
class stack
{
public:
void init(int n=1);
private:
int* array;
size_t capacity;
size_t top;
};
void stack::init(int n)
{
array=(int*)malloc(sizeof(int)*n);
if(nullptr==array)
{
perror("malloc申请");
return;
}
capacity=n;
top=0;
}

4.实例化

用类类型在物理内存中创建对象的过程,称为类实例化对象。类是对象的一种抽象描述,没有分配空间,用类实例化对象,才会分配空间。一个类可以实例化多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。

类实例化出的每个对象,都有独立的数据空间,对象中包含成员变量,成员函数并不包含。

函数编译后是一段指令,对象无法存储,这些指令存在于(代码段)。函数指针是一个地址,调用函数被编译成汇编指令[call 地址],编译器在编译链接时找到函数的地址,不是在运行时找,只有动态多态是在运行时找,那么就要存储函数地址。

内存对齐规则:

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

其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。(对齐数:编译器默认对齐数与该成员大小的较小值)。VS中默认对齐数是8。

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

嵌套结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍(包含嵌套结构体的对齐数)。

class gugu
{
public:
int a;
};
int main()
{
gugu a;
}

没有成员变量的类对象大小是1,为了占位标识对象。

5.this指针

类的成员函数没有关于不同对象的区分,那么d1,d2两个对象调用函数时,函数需要区分访问哪个对象,就要this(隐含的)来解决。

init函数实际上是void init(class* const this,int data),类的成员函数访问成员变量,本质都是通过this访问,this->data=data。

C++规定不能在实参和形参的位置显式的写this指针(编译时编译器会处理),可以在函数体内使用。

class A
{
public:
void Print()
{
cout<<"A:Print()"<<endl;
}
private:
int a;
};A* p=nullptr;
P->Print();
//正常运行
(*p).Print();
//正常运行成员函数存于代码段,不存于对象中,只是调用函数不用解引用空指针
class A
{
public:
void Print()
{
cout<<"A::Print()"<<endl;
cout<<a<<endl;
}
private:
int a;
};A*p=nullptr;
p->Print();
//运行崩溃,访问了空指针中的成员a,解引用了

this指针存在于栈和寄存器,只是函数临时调用参数,不需要持久存储,this指针的值就是对象的地址,对象在存this逻辑矛盾。

http://www.xdnf.cn/news/1217413.html

相关文章:

  • ECMAScript2024(ES15)新特性
  • SpringAI 1.0.0发布:打造企业级智能聊天应用
  • AI 安监系统:为工业园安全保驾护航
  • 【Debian】4-‌1 Gitea简介以及与其他git方案差异
  • Windows 10 WSLUbuntu 22.04 安装并迁移到 F 盘
  • 2018 年 NOI 最后一题题解
  • 【预判一手面试问题:排序】
  • 2023 年 NOI 最后一题题解
  • n8n为什么建议在数组的每个item中添加json键?
  • Docker部署Nacos
  • LeetCode 53 - 最大子数组和
  • Android Emoji 全面解析:从使用到自定义
  • 《嵌入式C语言笔记(十六):字符串搜索、动态内存与函数指针精要》
  • 企业微信API接口发消息实战:从0到1的技术突破之旅
  • MySQL索引和事务笔记
  • 2419.按位与最大的最长子数组
  • JAVAEE--4.多线程案例
  • Mac配置iterm2
  • 【动态规划 | 多状态问题】动态规划求解多状态问题
  • 信贷风控笔记8-解读商业银行资本管理办法笔记
  • Day 4-1: 机器学习算法全面总结
  • Vue路由钩子完全指南
  • 论文阅读|ArxiV 2024|Mamba进一步研究|VSSD
  • Python Pandas.concat函数解析与实战教程
  • 【力扣热题100】哈希——字母异位词分组
  • 20250730在荣品的PRO-RK3566开发板的Android13下调通敦泰的FT8206触控芯片【I2C的挂载】
  • colima 修改镜像源为国内源
  • 02 基于sklearn的机械学习-KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)、决策树(信息增益、基尼指数)、随机森林
  • MacTex+Vscode数学建模排版
  • VUE -- 基础知识讲解(二)