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

“迎圣诞,拿大奖” 活动赛题 Web-SQLi

1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习;

qq_34106499的博客 674

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

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

雨日微风 4万+

OAI数据集申请下载全攻略:从个人NDA账号注册到数据包下载的保姆级避坑指南

本文提供OAI数据集申请下载的完整指南,涵盖从个人NDA账号注册到数据包下载的全流程。重点解析login.gov验证陷阱、浏览器兼容性问题、NDA权限申请技巧及nda-tools高效使用方法,帮助医学影像研究者避开常见技术障碍,快速获取全球骨关节炎研究数据库OAI的宝贵数据资源。

weixin_28698059的博客 753

FastDDS之共享内存

transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

u010378559的博客 3088

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

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

Miibotree 3965

边云协同智能进化:大模型与小模型的动态训练与高效部署策略

本文深入探讨了边云协同架构下大模型与小模型的动态训练与高效部署策略。通过物流分拣、医疗影像等实战案例,展示了如何利用边云协作框架实现AI模型的智能进化,显著提升处理效率与准确性。重点解析了动态任务分配、增量学习和知识蒸馏等关键技术,为分布式训练场景提供优化方案。

work3的博客 191

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

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

小白的Coding之旅 402

Classic AUTOSAR精讲专栏目录

欢迎大家来到钢琴上的汽车软件创建的《Classic AUTOSAR精讲系列专栏》,期待在这里能够与大家一起进步,分享成功,分享喜悦!下面蓝色的文章标题都是传送门,点击直接跳转到对应文章。

酒无忧的博客 3914

cesium 气象云(体积云)

本文介绍了基于Cesium的气象云渲染技术方案,其核心是通过GPU加速的光线投射算法实现气象云的三维可视化。方案采用分层架构设计:GPU计算层由顶点着色器和片段着色器组成,负责光线投射计算、3D纹理采样和颜色映射;CPU控制层处理数据预处理、纹理创建和参数配置。关键技术包括:顶点着色器计算相机位置和光线方向,片段着色器实现光线步进采样、颜色映射和半透明混合。该方案高效解决了气象数据与地理场景的融合问题,支持云图、温度场等复杂三维气象数据的实时渲染,具有高真实感和良好性能。

God's asylum的博客 1205

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

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

qq_52145272的博客 423

llama.cpp 参数调优大全(4060 最优配置)

本文针对NVIDIA RTX 4060(8GB显存)显卡,提供了llama.cpp参数调优的实战指南。核心策略是采用小模型(7B/8B)配合Q4_K_M量化,通过合理设置GPU层数(-ngl 28)、上下文长度(-c 2048)和批量大小(-b 512)来平衡性能和显存占用。重点推荐启用flash-attn加速和mlock内存锁定,并给出标准、高性能和保守三种配置方案。调优优先级为:GPU利用率>吞吐量>显存>线程数,同时警示避免常见错误如过大上下文或GPU层数设置。最终推荐4060最佳配置为7B Q4_

刘一说的IT专栏 3407

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

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

2401_84976607的博客 490

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

2401_84976585的博客 378

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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、付费专栏及课程。

余额充值