C++类和对象你真的听懂了吗?来,看完这篇保姆级类和对象教程,保证你在学校杀疯——上篇

C++面向对象总结——类和对象 引言 一直以来,对于编程都是零零散散的在学,本篇对于C++的学习做一个系统全面的回顾总结。 在这里也反思一下,在学校信心满满自以为什么都懂,实践下来,才发现编程的学习需要系统的构架和扎实的底蕴。 一,C++中的类和对象 1️⃣类的定义 定义一个类,本质上是定义一个数据类型的蓝图。它定义了类的对象包括了什么(成员变量或者说是属性),以及可以在这个对象上执行哪些操作(成员函数或者说是方法)。 C... 阅读详情

 “长风破浪会有时,直挂云帆济沧海”

 🚀作者:编程路上一只狗

🚀博客主页:编程路上一只狗

🚀归属专栏:C++学习这里还会更新c++其余的学习教程哦,会随着学习不断地深入而更新的

🚀想叨叨几句:我是大一计科专业的学生,优快云新人一枚,我会记录自己的学习日常,并且帮助大家查漏补缺,点点关注不迷路哦,多多支持,在学习的道路上大家共同进步!如果有地方出现错误或者不足,还望在评论区留言或者私信,我们一起交流进步!respect,向你致敬。

目录

一、类与对象(上)

2.类的引入

3.类的定义

3.1类的定义语法

3.2类的两种定义方式

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

4.1访问限定符

4.2经典面试问题

4.3封装

5.类的作用域

6.类的实例化

 7.类对象模型

7.1计算类的大小

7.2结构体内存对齐规则

8.this指针

8.1this指针的引出

8.2this指针的特性

二.未完待续


一、类与对象(上)

在学习类和对象之前我么们要知道

C语言是 面向过程的, 关注的是 过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

怎么理解呢,我给大家举个例子:

外卖系统

面向过程:下单、接单、送餐的三个过程。

面向对象:客户、商家、骑手,并且关注的是这三个对象 之间的关系

2.类的引入

在c语言的学习中,我们已经学了结构体,但是在c语言的规定中结构体只能定义变量,但是C++中在结构体中不仅可以定义变量,也可以定义函数。

struct Student
{
 void InitStudentInfo(const char* name, const char* gender, int age)
 {
 strcpy(_name, name);
 strcpy(_gender, gender);
 _age = age;
 }
 
 void PrintStudentInfo()
 {
 cout<<_name<<" "<<_gender<<" "<<_age<<endl;
 }
 
 char _name[20];
 char _gender[3];
 int _age;
};

 那么在C++中类就有两种定义方式其中一种就是struct,但是在c++中我们更习惯用class定义类。

3.类的定义

3.1类的定义语法

class className
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号
class 为 定义类的 关键字(不可更改), ClassName 为类的名字(随意更改), {} 中为类的主体,注意 类定义结束时后面 分号 。
类中的元素称为 类的成员: 类中的 数据 称为 类的属性 或者 成员变量 ; 类中的 函数 称为 类的方法 或者 成员函数

3.2类的两种定义方式

1.声明和定义全部放在类中

struct Student
{
 void InitStudentInfo(const char* name, const char* gender, int age)
 {
 strcpy(_name, name);
 strcpy(_gender, gender);
 _age = age;
 }
 
 void PrintStudentInfo()
 {
 cout<<_name<<" "<<_gender<<" "<<_age<<endl;
 }
 //以上两个函数就是声明和定义放在一起
 char _name[20];
 char _gender[3];
 int _age;
};

2.声明和定义分离(声明.h定义.cpp)

 以下为了方便演示就在类外面定义的,大家了解就行,注意要加上类的作用域Student::

struct Student
{
 void InitStudentInfo(const char* name, const char* gender, int age);
 void PrintStudentInfo();
 //以上两个函数就是声明
 char _name[20];
 char _gender[3];
 int _age;
};
void Student::InitStudentInfo(const char* name, const char* gender, int age)
 {
 strcpy(_name, name);
 strcpy(_gender, gender);
 _age = age;
 }
void Student::PrintStudentInfo()
{
 cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}

以上两种方式各有好处,但是一般在项目工程中我们一般采用第二种。 

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

4.1访问限定符

C++ 实现封装的方式: 用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其 接口提供给外部的用户使用 。
访问限定符说明:
1. public 修饰的成员在类外可以直接被访问
2. protected 和 private 修饰的成员在类外不能直接被访问 ( 此处 protected 和 private 是类似的 )
3. 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class 的默认访问权限为 private , struct 为 public( 因为 struct 要兼容 C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

4.2经典面试问题

【面试题】
问题: C++ 中 struct 和 class 的区别是什么?
解答: C++ 需要兼容 C 语言,所以 C++ 中 struct 可以当成结构体去使用。另外 C++ 中 struct 还可以用来定义类。
和 class 是定义类是一样的,区别是 struct 的成员默认访问方式是 public , class 是 struct 的成员默认访问方式
是 private 。

4.3封装

面向对象的三大特性: 封装、继承、多态 。
在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

5.类的作用域

类定义了一个新的作用域 ,类的所有成员都在类的作用域中 。 在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
struct Student
{
 void InitStudentInfo(const char* name, const char* gender, int age);
 void PrintStudentInfo();
 char _name[20];
 char _gender[3];
 int _age;
};
void Student::InitStudentInfo(const char* name, const char* gender, int age)//类的作用域
 {
 strcpy(_name, name);
 strcpy(_gender, gender);
 _age = age;
 }
void Student::PrintStudentInfo()//使用了类的作用域
{
 cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}

6.类的实例化

用类类型创建对象的过程,称为类的实例化
1.类只是一个模型,如果不实例化,那么就没有实际分配内存空间来储存它
2.一个类呢是可以实例话出多个对象的,实例化的对象才会真正的分配到物理空间,储存类成员变量
3.打个比方将实例化对象比作大桥,那么类就像是设计图纸(并没有实体建筑的存在),靠着图纸才能造出一个个桥梁

 

 7.类对象模型

7.1计算类的大小

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
在类中只保存成员变量大小,而函数是放在代码公共区域的。
我们可以通过下面的不同类的大小来分析
// 类中既有成员变量,又有成员函数
class A1 {
public:
 void f1(){}
private:
 int _a;
};
// 类中仅有成员函数
class A2 {
public:
 void f2() {}
};
// 类中什么都没有---空类
class A3
{};
sizeof(A1) : _4_  sizeof(A2) : _1_ sizeof(A3) : _1_
有的同学可能就会有疑问,你不是说 只保存成员变量大小吗,为啥A2和A3是1
这就是因为虽然A2和A3没有任何成员变量,但是他们需要有一个空间,来证明他们是存在的,如果没有任何空间分配给他们的话,那岂不是不存在这个类了。所以空类要分到 一个字节的空间

7.2结构体内存对齐规则

我们在学习c语言的时候已经学习了结构体的内存对齐规则, 类的大小计算规则和结构体是一样的
1. 第一个成员在与结构体偏移量为 0 的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS 中默认的对齐数为 8
3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

8.this指针

8.1this指针的引出

我们先用日期类来举一个例子:

class Date
{ 
public :
 void Display ()
 {
 cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
 
 void SetDate(int year , int month , int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
private :
 int _year ; // 年
 int _month ; // 月
 int _day ; // 日
};
int main()
{
 Date d1, d2;
 d1.SetDate(2018,5,1);
 d2.SetDate(2018,7,1);
 d1.Display();
 d2.Display();
 return 0;
 }
对于上述类,有这样的一个问题:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?
C++中通过引入this指针解决该问题 ,即: C++ 编译器给每个 “ 非静态的成员函数 “ 增加了一个隐藏的指针参 数,让该指针指向当前对象 ( 函数运行时调用该函数的对象 ) ,在函数体中所有成员变量的操作,都是通过该 指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成 。
也就是说编译器会增加一个 隐藏的参数

这里要注意哦

1.this指针是隐含的 ,是编译器编译的时候加的,但是我们并不能在显示和调用的时候自己添加

2.可以在成员函数中成员可以使用this指针(自己显示的加出来)

8.2this指针的特性

1. this 指针的类型:类类型 * const
2. 只能在 “ 成员函数 ” 的内部使用
3. this指针本质上其实是一个成员函数的形参 ,是对象调用成员函数时,将对象地址作为实参传递给 this
形参。所以 对象中不存储this指针 。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

二.未完待续

此次类和对象将会分三个文章写,上篇中篇和下篇,如果喜欢的小伙伴们可以关注一下我哦,后续我将会分享更多学习内容,如果有什么疑问可以在评论区留言或者私信我,我看见就会回复哦!

华为OD机试题解:新学校选址问题(C++题解) 奇数个数据:中位数就是排序后位于中间的那个值。偶数个数据:中位数是中间两个数中较小的那个值。这道题目通过求中位数解决了一个优化问题:如何确定学校的位置,使得所有学生家到学校的距离和最小。我们通过对输入数据进行排序,并选择合适的中位数作为最佳选址点,完成了解题目标。中位数问题是算法竞赛中的一个常见考点,理解其背后的数学原理对解决类似问题非常有帮助。希望通过这篇文章,大家能对该类问题的解法有更深的理解。如果你有任何疑问或建议,欢迎在评论区交流! 阅读详情

相关推荐

全面管理学校职工信息的C++系统设计

在信息技术日益进步的当下,学校职工人员管理的自动化已成为提升工作效率和质量的关键。本章节旨在概述开发一个学校职工人员管理系统的基本需求与开发流程,为接下来深入探讨具体技术实现奠定基础。类是C++中定义对象的蓝图,包含了数据成员(属性)和成员函数(行为)。// 定义一个简单的类public:// 类的构造函数// 类的成员函数private:// 数据成员int _age;// 数据成员// 创建Person类的对象// 调用对象的成员函数return 0;

weixin_35696112的博客 1086

C++类和对象,一篇文章让你搞清楚!

简单的说,我们平常定义的变量就是对象,而变量的类型就称为类,只不过该类是内置类型的,对象也是最简单的一种。并且,我们中的许多人都会在没有意识到的情况下经常的使用类和对象。int a = 2;";可以这样理解:a就是int类的一个对象,p就是char*类的一个对象。

Codenange的博客 726

Security Onion的部署(超详细)

本文介绍了开源入侵检测系统securityonion的部署

qq_72583325的博客 6070

C++中类与对象的讲解(通俗易懂)

  概念 描述 类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 类访问修饰符 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。 构造函数 &amp; 析构函数 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删...

雨日微风 4万+

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 361

C++类和对象 新手学习问题小结(一)

c++类与对象(1)F&A Q1:定义或说明对象时,系统会自动调用构造函数为创建的对象初始化。如果类中没有定义任何构造函数时,就无法给定义的对象初始化。 这句话是错误的。如果没有定义任何构造函数的时候,系统会调用默认构造函数。 这里我的疑问是:什么是默认构造函数呢?查到了下面的解释: http://blog.youkuaiyun.com/gengshenghong/article/detail

Miibotree 3965

基于微博API与Scrapy-Redis的城市情绪地图数据爬取实战

本文详细介绍了如何利用Python爬虫技术从微博平台获取用户发布内容,用于构建城市情绪地图的毕业设计项目。文章涵盖了微博API的调用、Scrapy-Redis分布式爬虫架构、数据清洗与存储、反爬虫策略应对以及情绪分析预处理等关键技术,提供了完整的代码实现和实战经验。python复制下载# items.py"""清洗文本数据"""if text:# 移除HTML标签# 移除多余空白字符"""解析微博日期格式"""

2201_76125261的博客 446

C++ 类与对象知识点总结

主要内容 类的定义 类的访问限定符及封装 类的作用域 类的实例化 类的对象大小的计算,存储方式 结构体内存对齐规则 类成员函数的this指针 类的6个默认成员函数 构造函数 析构函数 拷贝构造函数 赋值操作符重载 默认拷贝构造与赋值运算符重载的问题 const成员函数 取地址及const取地址操作符重载 类的定义 class className { // 类体:由成员函数和成员变量...

小白的Coding之旅 402

anaconda navigator 卡在loading application界面一直没有反应解决办法

在打开anaconda navigator 程序的时候,遇到了2个问题。第一个问题:打开的时候弹出提示:There is an instance of Anaconda Navigator already running.第二个问题:程序一直卡在loading application界面一直没有反应。以下是我的解决办法,有效果。

猿小白的博客 4386

Android Activity面试题最全解析(5万字长文)

Intent是Android中用于启动活动、服务或广播的一种消息对象。它包含了一系列键值对数据,用于描述操作的目的以及需要传递的信息。IntentString:字符串intfloatlong:基本数据类型Parcelable:实现了Parcelable接口的对象:实现了接口的对象示例代码如下:Java深色版本1// 创建Intent并传递数据");67// 启动新的Activity是一个XML标签,用于定义ActivityService或可以响应的Intent类型。它包含了。

大模型大数据攻城狮的专栏 804

【C++从入门到入土】第三篇:类和对象提高

系列文章目录 【C++从入门到入土】第一篇:从C到C++. 【C++从入门到入土】第二篇:类和对象基础. 文章目录系列文章目录前言一、C++对象模型和this指针静态成员this指针二、友元三、成员对象和封闭类初始化列表总结 前言 前面我们接触了类和对象基础,接下来让我们更深入了解它。 一、C++对象模型和this指针 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外

qq_52145272的博客 423

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 946

C++类和对象你真的听懂了吗?来,看完这篇保姆级类和对象教程,保证你在学校杀疯

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字(不可更改),ClassName为类的名字(随意更改),{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数3.2类的两种定义方式1.声明和定义全部放在类中_age = age;//以上两个函数就是声明和定义放在一起int _age;2.声明和定义分离(声明.h定义.cpp)

2401_84976607的博客 490

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 218

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++类和对象你真的听懂了吗?来,看完这篇保姆级类和对象教程,保证你在学校杀疯(1)

1.声明和定义全部放在类中。

2401_84976585的博客 378

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++类和对象你真的听懂了吗?来,看完这篇保姆级类和对象教程,保证你在学校杀疯(2)

void Student::InitStudentInfo(const char* name, const char* gender, int age)//类的作用域。void Student::PrintStudentInfo()//使用了类的作用域。//以上两个函数就是声明和定义放在一起。// 类中既有成员变量,又有成员函数。int _month;int _year;int _day;// 类中什么都没有—空类。//以上两个函数就是声明。// 类中仅有成员函数。

2401_84976607的博客 414

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visual studio 2022 下载配置jsoncpp保姆级教程

Visual studio 2022版本配置jsoncpp保姆级教程,一步一步带你做

m0_52143936的博客 6473

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

类---this指针

喜欢编写一些小程序的科班菜鸟,但是由于准备考研,博客不能及时更新了,不好意思! 1234

关于类和对象

Java是纯面向对象语言,要求所有代码都必须放在类中,创建对象必须通过“new + 构造方法”。// 1. 定义学生类(类名首字母大写,规范) public class Student { // 实例属性(每个对象独有):访问修饰符 private 保证封装性 private String studentId;// 学号 private String name;// 姓名 private int score;

2401_89241892的博客 998

c++类和对象——宿舍谁最高

学校选拔篮球队员,每间宿舍最多有4个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类Student,有身高height,体重weight等。宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。首先输入一个整型数n (1<=n<=1000000),表示n位同学。

gangkerX的博客 731

C++萌新来看,一篇文让你让你彻底搞定类(超详细)!

学习C++,类是我们永远绕不开的话题,有关类的知识点实在是太多了,所以废话不多说,直接进入正题吧,性子急,就不整那些花里胡哨没有用的了。 一、什么是类? 1.类的概念 有关类的官方定义可以通过百度百科查看,但是我觉得官方的话总是比较抽象的,就像类本身一样。我用通俗的语言说一下自己对类的理解,类就是把数据和函数进行抽象,然后进行封装起来,对外部只提供一个接口去使用。外部的调用者看不到里面发生了什么。举个例子:我们可以把狗抽象成类,狗有头,有爪子,有耳朵,这些相当于类的数据成员,然后狗会跑,跳,吠,吃东西,这些

KOOKNUT的博客 3118

day8 8 java中的类与对象

文章目录8、java中的类与对象8.1 引用类型——类(对比C++)8.1.1 定义形式差异8.1.2 类的属性8.1.3 this指针8.1.4 对象的创建8.1.5 匿名对象8.1.6 对象的销毁、及析构函数1.对象的销毁2 析构函数(finalize) 8、java中的类与对象 面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面...

LH is programming hard 497

C++面向对象核心篇:类与对象从入门到精通详细总结

本篇博客采取循序渐进的“替身流”与“建房”比喻,从底层内存视角彻底打通了C++类与对象的全景核心逻辑。文章深入拆解了对象仅存变量的内存布局与隐含的 this 指针导航机制;通过六大默认成员函数的推导,直击无穷递归黑洞与深浅拷贝引发的 Double Free 毁灭现场;最后完美合龙了初始化列表的“承重墙”铁律,并收录了类型转换、静态成员、友元、内部类以及编译器优化的底层黑科技与大厂高频面试真题解析。

kumaxi的博客 763

继承(CPP)

继承(CPP)

2302_80190394的博客 1668

C++面向对象编程习题详解:从类设计到STL实战的完整指南

面向对象编程(OOP)是一种程序设计范式,其核心思想是通过封装、继承和多态来组织代码,以提高软件的可重用性、灵活性和可维护性。在C++中,OOP的实现依赖于类与对象、虚函数、模板等关键机制。掌握这些机制对于构建复杂、可扩展的软件系统至关重要,其技术价值在于能够更清晰地模拟现实世界,并管理大型项目的复杂性。在实际应用中,OOP广泛应用于图形界面、游戏开发、企业级后端服务等场景。本文聚焦于C++面向对象程序设计的实践难点,通过深度解析类与对象、继承与多态、运算符重载以及模板与STL等核心概念,并结合【深拷贝与浅

weixin_31309419的博客 338
上一篇: 初识C++(二)内联函数、atuo、以及范围for的使用
下一篇: C++类和对象保姆级教程—中上篇
CodeApe_
博客等级 码龄5年 138粉丝 5原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeApe_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值