C++类和对象(1) - 详解

news/2025/10/28 20:16:42/文章来源:https://www.cnblogs.com/gccbuaa/p/19172649

C++类和对象(1)

  • 1.类的定义
  • 2.访问限定符
  • 3.类域
  • 4.对象的大小
  • 5.this指针

如果我想把人这个对象封装起来。
经过C语言的学习,我们可以使用结构体,里面可以定义人的种种数据。
但是如果这个人的一些数据是涉及隐私的,不想让用户知道的,该怎么办呢?
这就是今天我们学习的类与结构体的核心区别。

1.类的定义

如果是结构体,我们这样定义。

struct Date
{
int _year;
int _month;
int _day;
};

如果是类,我们这样定义。

class Date {
public:
void Init(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}//成员函数
void Print() {
cout << _year << "/" << _month << '/' << _day << endl;
}
private:
int _year;
int _month;
int _day;//成员变量
};

class为类的关键字,后面是类名,{}中是类的主体。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。
因为有了在成员变量前面加了private:所以我们在除了类中的所有地方都不能直接访问这个类的成员函数。
成员函数默认为inline

2.访问限定符

分为三个:public,private,protected
在现阶段的学习中我们可以暂且认为private与protected作用一样。
class定义成员时没有被访问限定符修饰时默认为private

3.类域

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

class Date {
public:
void Init(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
void Print();
private:
int _year;
int _month;
int _day;
};
void Date::Print() {
cout << _year << "/" << _month << '/' << _day << endl;
}

4.对象的大小

在C语言学习时,我们学习了如何判断结构体的大小与内存对齐规则。
C++也规定实例化的对象要符合内存对齐的规则。

  • 第一个成员在于结构体偏移量为0的地址处
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
  • 对齐数 =(编译器默认的一个对齐数)与(该成员大小)的较小值
  • vs中默认对齐数是8
  • 最大对齐数 =(所有变量类型最大者)与(默认对齐数)取较小
  • 结构体总大小为最大对齐数的整数倍

注意
对象中不存储成员函数,因为函数被编译后是一段指令,它们无法存储在对象中。这些指令存储在单独的区域(代码段)。

#include<iostream>using namespace std;// 计算⼀下A/B/C实例化的对象是多⼤? class A{public:void Print(){cout << _ch << endl;}private:char _ch;int _i;};class B{public:void Print(){//...}};class C{};int main(){A a;B b;C c;cout << sizeof(a) << endl;cout << sizeof(b) << endl;cout << sizeof(c) << endl;return 0;}

在这里插入图片描述

为什么b和c的大小是1呢?完全是因为要代表这个对象存在,不得不分配一个字节来说明其存在。

5.this指针

以上面的Date类为例,当我们创建了两个对象的d1.d2并调用成员函数时,该函数是如何知道应该访问d1还是d2呢?
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。比如Date类的Init的真实原型:
void Init ( Date* const this, int year, int month, int day )

  • 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this->_year = year;
  • C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

所以其实void Init( int year, int month, int day)就等价于
void Init(Date* const this, int year, int month, int day)

接下来是两道经典例题

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

A.编译报错 B.运行崩溃 C.正常运行
注意:
当指针指向的内容是对象时,用它调用类中变量和函数的本质(类似p->Print())是将自己传给this指针。并非真正的解引用。
当我们调试转到反汇编时:
在这里插入图片描述
所以p->Print();实际上并没有发生解引用这一步,自然不会报错。
所以选C

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

A.编译报错 B.运行崩溃 C.正常运行
在这里插入图片描述
在Print函数中,_a就是this->_a,而p指针是空指针,所以this也是空指针,所以会运行错误。

如有错误,欢迎打在评论区。
主页还有更多优质内容OvO

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

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

相关文章

人工智能之编程基础 Python 入门:第二章 Python 的编辑器 VS Code

人工智能之编程基础 Python 入门:第二章 Python 的编辑器 VS Code人工智能之编程基础 Python 入门 第二章 Python 的编辑器 VS Code@目录人工智能之编程基础 Python 入门前言一、VS Code安装二、配置PythonVS Code 汉…

2019 福建省队集训录

退役前最后的贡献\(\scr{Day}\ 1\) T1 (sort)Source:$\bf{solution}$$\bf{code}$T2 (sort)Source:$\bf{solution}$$\bf{code}$T3 (sort)Source:$\bf{solution}$$\bf{code}$

AIX multibos bootlist

Check bash bootlist -m normal -o hdisk0 blv=hd5 pathid=0 lspv hdisk0 00cc4bc0964f315a rootvg active hdisk1 00cc4bc028d6260c altinst_root…

记录一次nginx能通但是请求一直不了的问题

今天在公司碰到这样一个问题:开发后在测试环境进行部署,部署后有个调用其他部门的接口,需要通过nginx来代理请求转发到另一个部门。运维把nginx配置完成后,本地和开发测试都正常,但是通过测试环境访问一直是不同的…

【嵌入式】PWM DAC的滤波器设计

PWM DAC PWM概念本身很简单,具体可以参考各网上资料。PWM:脉冲宽度调制(英语:Pulse-width modulation,缩写:PWM),简称脉宽调制,是用脉冲来输出模拟信号的一种技术,一般变换后脉冲的周期固定,但脉冲的工作周…

被称作遗憾之物 爬满了脊骨 又把控了痛楚 被称作无用之物 修筑了唯一的通路

test30 前两题都 0pts,nbm(? 2-A 飞船制造 (spaceship.cpp) 怎么有傻子没开 c++11 写了 rank 然后 re 惹 /fad 考虑依次枚举 \(s=i+j+k\),计算出 \(s\) 一定的方案数就能确定唯一的 \(s\),方案数计算好像只能考虑…

neovim在windwos11下snack.nvim的问题

问题复现 首先确定有 find 命令,在执行之后,会出现下面的问题: Command failed: - cmd: `find . -type f -not -path */.git/* -not -path */.*`几乎百分百。 查找原因 查阅之后得知,问题为调用了linux风格的find命…

完整教程:Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

禁用 IPython 历史记录 history.sqlite

Windows 在 %UserProfile%\.ipython\profile_default\ 文件夹中或 Linux 在 ~/.ipython/profile_default/ 目录中(默认配置文件名为profile_default),新建ipython_config.json文件,填入以下内容即可禁用 IPython 历…

Luogu P7914 [CSP-S 2021] 括号序列 题解 [ 蓝 ] [ 区间 DP ] [ 前缀和优化 ] [ 调试技巧 ]

括号序列:无聊,感觉做过类似的拼接类区间 DP 就直接秒了。 注意到这个超级括号序列定义很复杂,除了两边没有 \(\texttt{*}\) 没有啥很好的性质。于是直接考虑暴力区间 DP:定义 \(dp_{l, r}\) 表示 \(l\sim r\) 的合…

扩展BaseMapper类 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《程序员修炼之道:从小工到专家》前五分之二观后感

读完《程序员修炼之道:从小工到专家》前五分之二的内容,我对“程序员如何成长”有了更清晰的认知。书中开篇便强调“职业主义”,打破了我对“码农”的刻板印象——程序员不应只是被动执行需求的工具人,而应像匠人般…

矩阵快速幂章节笔记(这里主要介绍的是我的错题)

矩阵加速的递推 1.1维k阶 f(n)=f(n-1)+f(n-2)+f(n-i)可以添加系数 那么矩阵的第一列就是系数了,其它用未知数,然后计算。注意start数组,就是开始的数组是倒着来的,请看代码(斐波那契) 2.k维1阶 dp[i][j]=dp[i-…

实验二 现代C++编程初体验

任务一: 代码:#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); //…

P5322 [BJOI2019] 排兵布阵

P5322 [BJOI2019] 排兵布阵 题解题目传送门 博客传送门 我们浏览一遍测试点,发现了一个 \(s=1\) 的特殊性质。先考虑这一性质。 \(s=1\)特殊性质 如果我们当前第 \(i\) 座城市的兵力数量足够时,添加兵力显然不优。而…

题解:P9292 [ROI 2018] Robomarathon

题目传送门 题目大意: 有 \(N\) 名机器人选手参加马拉松,选手编号为 \(1 \dots N\),分道编号也为 \(1 \dots N\)。选手 \(i\) 占据分道 \(i\),跑完全程需要 \(a_i\) 秒。设 \(S \subseteq \{1, 2, \dots, N\}\) 表…

[题解]P5322 [BJOI2019] 排兵布阵

P5322 [BJOI2019] 排兵布阵 我们可以预处理出第 \(i\) 个城堡分配 \(j\) 的兵力能获得多少的得分,记为 \(w[i][j]\)。 则每一个 \(w[i]\) 都是一个泛化物品,即价值(\(w[i][j]\))随着分配体积(\(j\))变化的物品。…

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包​ Nacos 2.0.3-1.ky10.sw_64.rpm​ 是专为 ​申威(SW)架构​ 处理器,并运行 ​中标麒麟操作系统 Kylin V10(64位)​​ 的服务器环境定…

ZKY精选冲刺省选国赛仿真训练题

求和 QOJ - 9902 解题思路 代码实现点击查看代码Bridges AtCoder - arc143_d 解题思路 代码实现点击查看代码龙门考古 UniversalOJ - 840 解题思路 代码实现点击查看代码Discrete Centrifugal Jumps CodeForces - 1407…