【C++】初识类和对象

Stata实战:5步搞定PSM倾向得分匹配(附完整代码与常见报错解决) 本文详细介绍了使用Stata进行PSM(倾向得分匹配)的5步实战流程,包括数据预处理、模型构建、匹配算法选择、匹配质量诊断和结果解释。提供完整代码示例和常见报错解决方案,帮助研究者高效完成实证分析,提升匹配成功率。 阅读详情

面向过程和面向对象初步认识

  • C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
    面向过程
    面向过程

  • C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
    成。
    面向对象

先了解这种概念就好,不是一两句话就能理解的。

类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:
之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,
会发现struct中也可以定义函数

typedef int DataType;
struct Stack
{
	void Init(size_t capacity)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (nullptr == _array)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(const DataType& data)
	{
		// 扩容
		_array[_size] = data;
		++_size;
	}
	DataType Top()
	{
		return _array[_size - 1];
	}
	void Destroy()
	{
		if (_array)
		{
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}
	DataType* _array;
	size_t _capacity;
	size_t _size;
};
int main()
{
	Stack s;
	s.Init(10);
	s.Push(1);
	s.Push(2);
	s.Push(3);
	cout << s.Top() << endl;
	s.Destroy();
	return 0;
}

而在C++中类更喜欢用class替代struct

类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

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

类的两种定义方式:

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
    联函数处理。
  • 定义和实现都在类内实现
    类中定义
  1. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
  • 定义实现分离
    类外实现
    推荐第二种,定义实现分离,可读性强。

成员变量名建议在变量名前后加_,不然某些场景的可读性较差。

class Date
{
public:
	Date(int year = 2024, int month = 4, int day = 19)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};

类的访问限定符及封装

访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,**通过访问权限选择性的将其接口提供给外部的用户使用。**这样既能确保核心部分(一般为成员变量)不被外界直接修改,又能提供功能接口给外部用户使用。
访问限定符
访问限定符说明:

  1. public(公有)修饰的成员在类外可以直接被访问。
  2. protected(保护)和private(私有)修饰的成员在类外不能直接被访问(此处protected和private是类似的)。
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)。

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

封装

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。 比如:对于电脑这样一个复杂的设备,提供给用
户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日
常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
封装演示
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如
何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子**,将内部实现细节隐藏起来**,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来
隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。(与命名空间类似)

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
 cout << _name << " "<< _gender << " " << _age << endl;
}

类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
    有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个
    类,来描述具体学生信息
    。
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。

类实例化出对象就像现实中使用建筑设计图建造出大house,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
实例化

Person类就是一张设计图纸,而实例化的man(对象)才是大house,只有实例化出对象,才可能去使用类里定义的成员变量或成员函数。
类对象实例化

类对象模型

引出类对象的大小

C语言里结构体的大小利用内存对齐规则便能计算出来。那C++中计算类对象的大小呢?

结构体内存对齐规则:

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

C++的类与C语言结构体最大的区别就是类中可以实现函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
要想搞清楚这个问题,我们先了解一下C/C++中程序区域内存的划分。
内存区域划分
C/C++程序内存分配的⼏个区域:

  1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时
    这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内
    存容量有限。 栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配⽅
    式类似于链表。
  3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的⼆进制代码。

类对象存储方式

上面我们将类对象比作是一栋别墅,对象包含了成员变量和成员函数,成员变量理应来说就是家庭成员,是一个个独立的个体,而成员函数理应是别墅里面的游泳池或篮球场,作为公共设施为家庭成员(成员变量)提供服务。那么实际是如何呢?

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};

int main()
{
	A a;
	cout << sizeof(a) << endl;
	return 0;
}

类对象大小
可以看到类A中只有一个类型为int的成员变量_a,和一个PrintA函数,计算发现a对象的大小为4,刚好为int的大小,基本符合我们的猜想。

结合C/C++中程序区域内存的划分,可知内存中是有存放函数的公共代码段的。

实际存放方式为:只保存成员变量,成员函数存放在公共的代码段。(成员函数不在对象内)
在这里插入图片描述
通过以下例子说明

// 类中既有成员变量,又有成员函数
class A1 {
public:
	void f1() {}
private:
	int _a;
};
// 类中仅有成员函数
class A2 {
public:
	void f2() {}
};
// 类中什么都没有---空类
class A3
{};

int main()
{
	A1 a1;
	A2 a2;
	A3 a3;
	cout << sizeof(a1) << endl;
	cout << sizeof(a2) << endl;
	cout << sizeof(a3) << endl;
	return 0;
}

在这里插入图片描述

结论:
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

this指针

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;
};

int main()
{
	Date d1, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2022, 1, 12);
	d1.Print();
	d2.Print();
	return 0;
}

对于上述的日期类,有这样的一个问题:
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函
数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
实际传参

this指针
我们显示去写this,发现确实有这个参数,并且指向的就是调用对象的成员变量和成员函数。但有必要去显示的写吗?这种重复死板的操作交给编译器去完成就好了,我们了解即可。
this实际传参

this指针的特性

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

小测试:

class A
{
public:
	void PrintA()
	{

		cout << _a << endl;
	}
	void Show()
	{

		cout << "Show()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Show();       //第一句代码
	//p->PrintA();     //第二句代码
}

想想上面两句代码分别运行时会有什么效果,是正常还是崩溃呢?

  1. 第一句代码
    A类的指针p是一个空指针,空指针解引用按之前来说不是妥妥崩吗?但这里却是正常运行。
    这里调用Show函数并不会去解引用p,因为成员函数是不在类里面的啊,成员函数可是在代码段的,这就不会导致空指针解引用导致报错了。
    空指针问题
    从汇编的角度也可以看到调用Show就是一个函数调用,也就是这里的call指令,它是直接定位函数在哪个类里面的函数,然后直接call它的地址(也就是函数调用),并不涉及指针p解引用的操作。

  2. 第二句代码
    该句代码会崩溃,但并不是在函数调用这一块,函数调用与第一句代码一样。崩是崩在PrintA函数里面对成员变量_a进行访问,这就会涉及到指针的解引用,就会导致出错。

Ollama安装教程 Ollama 是一个开源的大语言模型(LLM)部署工具,专为在本地机器部署和运行大模型而设计,通过简单的命令就可以在本地快速运行大模型(如DeepSeek、Llama、Gemma、QWQ等)。非常适合开发者、研究人员以及对数据安全和隐私有较高要求的企业和用户 阅读详情

相关推荐

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 402

C++初识类和对象

一文带你初步认识面向对象、类和对象

cp 2473

PyTorch复现PSMNet踩坑全记录:从环境配置到KITTI数据集训练

本文详细记录了使用PyTorch复现CVPR经典立体匹配模型PSMNet的全过程,从环境配置到KITTI数据集训练,特别针对2023年主流软硬件环境中的常见问题提供解决方案。文章重点介绍了PSMNet的金字塔池化模块和堆叠沙漏结构,帮助研究者和工程师快速实现工业级深度估计,节省大量试错时间。

weixin_30897233的博客 328

C++入门:初识类和对象

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

暴躁小吕的博客 7790

Yolo11改进:Block改进|MixDehazeNet,用于图像去雾网络的混合结构块|即插即用|附代码

https://arxiv.org/pdf/2305.17654 图像去雾是低级视觉领域中的一项典型任务。先前的研究验证了大型卷积核和注意力机制在去雾中的有效性。然而,存在两个缺点:引入大型卷积核时容易忽略图像的多尺度特性,而注意力模块的标准串联方式没有充分考虑雾分布的不均匀性。在本文中,我们提出了一种名为混合结构图像去雾网络(MixDehazeNet)的新型框架,该框架解决了上述两个问题。具体而言,它主要由两部分组成:多尺度并行大型卷积核模块和增强并行注意力模块。与单个大型卷积核相比,多尺度的并行大型卷积

m0_47867638的博客 1273

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4656

C++:类和对象初识

万字长文,初步详解类和对象!

有梦想的电信狗 1537

python实现Markowitz模型 (附完整源码)

python实现Markowitz模型 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 405

c++初识类和对象

1. 类和对象初步认识 类和对象(class)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象,类就像建房子的图纸,对象就像建造出来的房子。 2.类的引入 在C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。 struct Student { void SetStudentInfo(const char* name, const...

childemao的博客 292

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 48

推荐系统[六]:混排算法简介、研究现状混排技术以及MDP-DOTA信息流第三代混排调控框架,高质量项目实战。

混排是指将多个不同的推荐结果混合在一起,以提供更多样化的选择和更全面的覆盖。混排的目的是为了避免推荐系统出现过度偏向某些内容或类型的情况,从而提高推荐的多样性和准确性。混排的实现方式通常是基于多种推荐算法和数据源,通过加权和组合的方式来生成最终的推荐结果。信息流推荐算法的核心是理解用户兴趣,捕捉用户逛买意图,并据此做到高效的人货匹配。

丨汀、的博客 1930

C++之初识类和对象

C++类和对象基础语法摘要 本文介绍了C++中类和对象的基础概念与语法。类作为结构体的增强版,支持封装变量和函数,并通过public/protected/private控制访问权限。class默认成员为private,struct默认public。类中函数默认内联,不占用对象内存空间。对象内存计算规则与结构体类似,但空类对象占用1字节。this指针是隐式存在的常量指针,指向调用对象地址,用于访问成员变量。常量成员函数通过const修饰保证不修改对象状态,并遵循权限缩小原则。文中还通过示例代码演示了this指

2502_91790308的博客 584

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

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

【C++杂货铺】初识类和对象

本文介绍了C++中的类和对象,C++的面向对象思想、类的定义、实例化对象、访问限定符、神奇的this指针。

春人.的博客 7831

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

初识C++类和对象

本文主要介绍了C++中类的定义和使用方法。首先说明了类的基本结构,包括成员变量和成员函数的定义方式,以及struct在C++中的升级用法。其次讲解了访问限定符(public/private/protected)的作用,以及类域的概念。然后详细分析了类实例化的过程,包括内存分配规则和this指针的工作原理。最后通过对比C语言和C++实现Stack的代码,展示了C++封装特性的优势,即将数据和相关操作封装在类中,通过访问控制提高代码安全性。文章强调C++类是对C语言结构体的增强,通过封装实现了更规范的代码管理。

2501_91715541的博客 787

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

初识C++ · 类和对象(上)

/...其中,类体(花括号)里面的变量叫做类的属性或者是成员变量,类体里面的函数叫做类的方法或者成员函数。类中定义函数的时候有两种方法:一是定义和声明放在一起return 1;//...二是声明和定义放在对应的文件里面//Stack.hpublic:private:int* arr;int size;s1.Print();return 0;

更新各种计算机技能~ 1869

NTscan扫描工具

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

C++类和对象初识

面向过程是一种以步骤和函数为核心的编程思想,强调“怎么做”,适合小型、逻辑清晰的程序;而面向对象则以对象及其属性和行为为核心,强调“谁来做”,通过封装、继承和多态实现更好的复用与扩展,适合构建大型、复杂、可维护的系统C++ 面向对象(OOP, Object-Oriented Programming)是一种程序设计思想,它将现实世界中的事物抽象成“对象”,通过对象之间的交互来完成程序功能。C++ 在 C 的基础上引入了类(class)和对象(object),使得它既支持面向过程(POP),又支持面向对象。

2302_79175225的博客 779

C++--初识类和对象

初识类和对象

weixin_57248528的博客 1513
上一篇: C语言过渡C++
下一篇: 【C++】再识类和对象——六大默认成员函数
Mesar_
博客等级 码龄3年 926粉丝 56原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值