C++类和对象(1)

Python的类和对象(与C++对比学习) 通过C++的类和对象理解,来学习Python 阅读详情

今天讲一下关于C++类和对象的一些知识点:

1.类和对象的初识

C语言是面向过程的,关注过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,还可以定义函数。
在C++中更喜欢用class来代替。

2.类的定义

类就是同类事物的抽象集合,而对象就是类的具体实现!
举个例子:
比如军人就属于一个类:
其有很多对象:比如海军,陆军,空军等,,,

class  className
{
		//类体:由成员变量和成员函数组成
};           //这末尾的分号一定不要忘记

类的两种定义方式:
1.声明和定义全部放在类体中,要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2.声明放在.h文件中,类定义放在.cpp文件中,这样声明和定义就分离了,.cpp文件中不仅要引入.h文件还要在定义函数时,函数名前要加上className: : ,一定不能忘记否则编译不会通过。

3.类的访问限定符及封装

3.1访问限定符
在这里插入图片描述
访问限定符说明:
1.public修饰的成员在类外可以直接被访问
2.protected和private修饰的成员在类外不能被直接访问
3.访问权限的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
4.class的默认访问权限是private,struct是public(因为struct要兼容C)
注:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

3.2 封装
面向对象三大特性:封装,继承,多态 (面试题)

封装:就是将数据和操作的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们 首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。 不想给别人看到的,我们使protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

4.类的实例化

用类创建对象的过程叫做类的实例化
1.类就相当于一个模型,限定了有哪些成员,定义出一个类并没有分配实际的内存空间来存储它 。
2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

5.类的对象模型

5.1如何计算类对象的大小
可以猜测下类对象的存储方式有两种:

1.对象中包含类的各个成员
虽然对象中的成员变量是不同的,但是会调用同一份函数,如果按照此种方式存储,每创建一个对象时,每个对象中都会保存一份代码,相同代码会保存多次,浪费空间,那么如何解决呢?就有了下面这种方式。

2.只保存成员变量,成员函数放在公共代码段

下面以一个例子来证明他是以何种方式存储的:

#include<iostream>
using namespace std;

class A1 
{ 
public:    
  void f1(){} 
private:    
  int _a; 
};

// 类中仅有成员函数 
class A2 
{ 
public:   
	void f2() {} 
};

// 类中什么都没有---空类 
class A3 
{
};

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

结果是 4 1 1 ,这就很好说明在计算类的大小时是不包含成员函数的,只包含成员变量。

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

内存对齐请见我的另一篇文章,和结构体的内存对齐计算方法是一样的。
https://blog.youkuaiyun.com/Python_programer/article/details/90236722

6.隐含的this指针
例如下面这个例子:

#include<iostream>
using namespace std;

class Date
{
public:
	Date(){}
	void SetDate(int year,int month,int day){
		_year = year;
		_month = month;
		_day = day;
	}
	void Display(){
		cout <<_year<<"-"<<_month<<"-"<<_day<< endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.SetDate(2019, 5, 15);
	d1.SetDate(2018, 5, 6);
	d1.Display();
	d2.Display();
	return 0;
}

看到这个代码,你应该想为什么d1和d2都调用SetDate( )和Display( )函数为什么结果还会不i样呢,函数体中并没有关于不同对象的区分,那么当的d1调用SetDate时,该函数是怎么知道要设置d1对象,而不是设置d2对象?

这是因为C++中引入了this指针,C++中编译器给每个成员函数增加了一个隐含的this参数,让该指针指向当前调用该函数的对象,在函数体中所有的成员变量的操作,都是通过该指针去访问的,只不过这些操作对用户是透明的,用户不需要来传递,由编译器自动完成。

比如编译器处理时 :d1.Display() 会变为----》d1.Display(&d1) ,此时Display()函数的形参会变为Display(Date *this) ,*this来接收d1对象的地址,从而函数知道是操作d1对象。

this指针的特性:
1.this指针的类型:类类型* const
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() 
{    
	Date* p = NULL;    
	p->PrintA();     
	p->Show(); 
} 

这个程序会崩溃么,答案当然是会的,为什么呢?
因为看*p对象首先调用的是PrintA( )函数,这时就需要用到我刚才说的this指针了,因为在Print( )函数体中有cout<<_a<<endl; 这样一句话编译器处理时就会变为this->_a,一旦这么做了程序必然崩溃,此时 *p是一个空指针,-> 符号是会涉及到解引用的相当于 *( p ) . ,空指针解引用程序必然崩溃,这才是主要原因!而Show( )函数没牵扯这样的操作,所以只调用Show( )函数的话程序不会出现崩溃!

C++:类和对象1 /类体,由成员函数和成员变量组成//注意有分号,这个和结构体相同class为定义类的关键字,classname为类的名字,{}中为类的主体,着重注意类后面的分号不能省略。类体中的内容称为类的成员,类中的变量称为类的成员变量或者类的属性,类中的函数称为类的方法或者成员函数。int num;char name;方法如果直接在类里面定义默认就是内联。在一个.h文件中public:public:int a;int num;char name; 阅读详情

相关推荐

Python3.11安装fairseq避坑指南:解决dataclasses兼容性问题(附详细代码修改)

本文详细解析了在Python 3.11环境下安装Fairseq时因dataclasses模块规则变更导致的安装失败问题。通过定位核心配置文件,将`default=SomeConfig()`修改为`default_factory=SomeConfig`,并调整依赖版本,提供了从源码修改到环境验证的完整解决方案,确保Fairseq顺利运行。

weixin_29098367的博客 495

C++学习:对象和类详细总结

C++对象和类总结

谢小小XH 1万+

载波同步技术(一):BPSK的Costas Loop 载波同步

Author:McCrocodile 2010/11/04          载波的提取在相干解调中往往比较重要,根据信号中是否包含载频分量,载波同步一般也可以分为两种方法。包含载频分量的可以采用窄带滤波或者基本的锁相环环路来实现,不包含的则比较麻烦需要采用特殊的环路实现载波的同步。这里介绍的BPSK的载波恢复就属于后面一种。 对于不包含载频分量的信号载波同步一般有:同相-正交环(就是常说的Costas环)、判决反馈环(几乎可以适用所有调制方式)、同相-正交环衍生环(QPSK松尾环、N相同相-正交环)。

McCrocodile Blog 1万+

C++和python中的类

文章目录一、C++中的类1.public和private2.构造函数2.1默认构造函数和自定义构造函数2.2拷贝构造函数2.3赋值重载函数3.析构函数4.类中的static5.构造函数的初始化列表5.类中的const6.组合和聚合6.1组合(Compostion)6.2聚合(Aggregation)7.成员函数的定义8.指向类内成员的指针9.类的深入理解二、python中的类1.访问权限2.类属性,实例属性,类方法,实例方法,构造函数,析构函数,静态方法 一、C++中的类   1.public和

weixin_39861267的博客 2553

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 540

EU 2021/646 eCall工程拆解:MSD、测试模式与型式核准

紧急呼叫系统(eCall)是车载通信中面向事故救援的安全功能,其原理是在碰撞或人工触发后,通过蜂窝网络向公共安全应答点发送最小数据集(MSD),并建立语音链路。技术价值在于缩短救援响应时间、提升事故后生存率,应用场景覆盖乘用车、轻型商用车及车载T-Box等前装通信模块。面向欧盟市场时,EU 2021/646把eCall从安装要求推进到型式核准测试,关注触发链路、备用电源、GNSS定位、MSD字段、音频质量与回拨能力。工程落地需要围绕测试模式、字段校验、配置管理和送检样件建立可交付合规方案。

weixin_31815843的博客 209

【C++学习分享】类和对象(一)

C++学习分享,面向过程和面向对象的初步认识 类的引入 类的定义 类的访问限定符及类的封装 类的访问限定符 类的封装 类的作用域 类的实例化 类对象模型 类的大小 this指针 this指针的引出 this指针的特性

weixin_69519040的博客 443

告别手动标注!用ENVI Classic高效搞定高光谱图像语义分割标签(以农业/地物分类为例)

本文详细介绍了如何利用ENVI Classic实现高光谱图像的半自动化智能标注,特别针对农业和地物分类场景。通过光谱特征分析、智能标注技巧和MAT文件转换,显著提升标注效率和质量,助力AI模型训练。

weixin_28694169的博客 251

C++中的类和对象

类 问题1:C语言和C++中struct定义的结构体有什么区别? 答:①C语言中函数不可以作为struct结构体的成员;C++中函数可以作为struct结构体的成员②C语言声明结构体类型之后,定义变量必须为—&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;struct 结构体名 变量名;C++声明好结构体之后,定义变量为—&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;结构体名 变量名

h___q的博客 592

使用Kettle进行数据同步(增量)

文章目录kettle介绍kettle安装kettle使用使用kettle同步关系型数据库数据(MySQL示例)1. 创建一个转换2. 选择表输入3. 格式转换4. 执行脚本5. 创建job使用kettle同步NoSql数据(MongoDB示例)创建转换时的注意事项MongoDBInput怎么创建job的创建如何在Linux上面运行已经创建好的job?1、把创建好的job传输到Linux机器上面2、编辑kjb文件3、执行任务 kettle介绍 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写

JenKin的博客 7351

记录:解决Ubuntu20.04安装ros报错E: Unable to locate package ros-kinetic-desktop-full【亲测有效】

报错:E: Unable to locate package ros-kinetic-desktop-full.尝试好久一直都无法下载,最后得知真相的我眼泪哗哗的直流。

**My Coding Family** 6万+

cpp.1 C++类和对象(上)

文章目录第一部分 C++入门1.命名空间2.缺省参数3.函数重载4.引用 第一部分 C++入门 1.命名空间 命名空间实际上就是为了防止命名相同会导致很多的冲突,可以使用命名空间对标识符进行本地化,来避免命名的冲突 使用方式: 1.加命名空间名称及作用域限定符std::cout<<"hello world"<<std::endl; 2.使用using将命名空间中成员引入using std::cout; 3.用using namespace 命名空间名称引入using namespac

Pinksatrfish的博客 368

MobileViT替换YOLOv11主干网络:轻量化新思路-(用MobileViT等轻量视觉Transformer降低计算成本)

在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度-精度平衡成为工业界和学术界的热门选择。随着YOLOv11的推出,模型性能达到了新的高度,但其计算复杂度和参数量也随之增加,这对资源受限的移动设备和嵌入式系统提出了挑战。与此同时,视觉Transformer(ViT)的出现为计算机视觉带来了全新范式,但其庞大的计算需求限制了在移动端的应用。MobileViT作为一种创新的轻量级视觉Transformer架构,巧妙结合了CNN的归纳偏置优势和V

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1647

【C++】类和对象——Lesson1

类、类的默认成员函数

小羊的博客 3210

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++——类和对象(1)

猛攻C++新语法——类和对象。带你领略C++的语法之美

yang_xinxim的博客 727

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

C++类和对象,内存对齐,this指针,

Xie_sheng的博客 1791

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++类和对象1

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。内联函数:在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。内联函数实际可以理解为空间换时间,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。

2401_86164065的博客 1972

【C++语法】类和对象(1)

本文围绕C++类和对象展开。介绍对象概念,对比C与C++编程范式;讲解类定义、访问限定、作用域、实例化;说明类存储大小含内存对齐,即便无成员变量也占1字节;还阐述this指针特性,它是成员函数隐式形参。

feng_qi0325的博客 1129

CPP类和对象(1)

CPP类和对象(1)

m0_68981107的博客 144

C++实验三——类和对象(1)

实验报告题目1题目2题目3 【实验名称】 实验三 类和对象(1) 【实验内容】 题目1 设计一个用于描述三维空间中的点的类,为其设计必要的成员变量和函数,并尽量增强其功能。 #include<iostream> #include<math.h> using namespace std; class Point { public: Point(){} Point (string name,double x,double y,double z){

Onlyone_1314的博客 1675

C++ 类和对象1

类型:由成员函数 和 成员变量组成,后面一定要加上分号!class为定义类的关键字ClassName为类的名字,{ } 中是类的主体注意类定义结束时后面的分号是不能省略的。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1.声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可以会将其当成内联函数处理。2.类声明放在 .h 文件中,成员函数定义放在.cpp文件中。

yun2739_love的博客 921

【c++】类和对象1

1.上面的那种方法,定义和声明都在类里面2.定义和声明分开stack.cppreturn;_top = 0;// 扩容++_top;_top = 0;int* _a;int _top;源.cppint main()stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);

yyqzjw的博客 1290

【C++】类和对象1

本篇文章主要介绍类与对象的基础知识 -- 类的概念与定义、对象的概念与实例化、this指针

L_0907的博客 927
上一篇: 结构体内存对齐详解(同比C++类的大小计算)
下一篇: Linux之线程安全
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值