C++类和对象(2)

C++笔记3•类和对象2• 类和对象2 阅读详情

今天继续讲C++类和对象这块的内容:

1.类的6默认成员函数

在这里插入图片描述
1.1构造函数(无返回值)
构造函数是完成初始化工作的而不是创建对象的,这点一定要记清!!!
用户没写构造函数的话编译器是会自动生成的,但是用户一旦显式的定义了编译器将不再生成!!!
如果有创建多个对象,那么调用构造函数的顺序和你创建对象的顺序是一样的!!!
< font>

默认构造函数有三类:(默认构造函数就指的是不用参数就能调用的)
1)我们不写,编译器自动生成的
2)我们写了,但是是没有参数的
3)我们写的参数是全缺省的(一般这种要用的多一些)
例如下面:(默认构造函数只能存在一个)

class Date { 
public :    
// 1.自己写的无参构造函数    
	Date () {}        
// 2.全缺省的构造函数    
	Date (int year, int month , int day )    
	{        
		_year = year ;        
		_month = month ;        
		_day = day ;    
	} 
private :    
	int _year ;    
	int _month ;    
	int _day ; 
};
 
void Test() 
{ 
    Date d1; 
}

很多人会疑惑这里如果自己没写构造函数的话,创建对象时会调用系统默认生成的构造函数,但是这里的d1对象的值都是随机值,貌似看起来系统生成的这个默认构造函数没什么用啊?我想很多人都会有这个疑惑,其实是有用的,看下面这个例子:

class Time { 
public:    
	Time() 
	{
        cout << "Time()" << endl; 
        _hour = 0;        
        _minute = 0;        
        _second = 0;    
    } 
private:    
	int _hour;    
	int _minute;    
	int _second; 
};
 
class Date { 
private:    
// 基本类型(内置类型)    
	int _year;    
	int _month;    
	int _day;
// 自定义类型    
	Time _t; 
};
 
int main()
{   
	 Date d;    
	 return 0;
}

运行结果:
在这里插入图片描述
你会发现当创建对象d时,编译器生成默认的构造函数会针对自定类型成员_t调用的它的默认成员函数,而且你也会发现上面的成员变量定义时前面都加了下划线,是为了和函数的参数区分开,以免引发冲突例如:year = year 这样的情况!

1.2析构函数(无参无返回值)
对象的销毁同样不是由析构函数去完成,析构函数只是完成一些资源的清理工作!!!
对象生命周期结束时,C++编译系统会自动调用析构函数
析构函数析构多个对象的顺序恰好和构造是相反的,类似于栈的性质
一般你没写析构函数,系统也会默认生成,但是如果遇到malloc或者new等开辟出来的空间就需要自己写析构函数来清理这些内存空间!!!< font>

1.3拷贝构造函数
拷贝构造函数就是用一个已经创建好的对象来初始化创建另一个对象。
拷贝构造函数是构造函数的一个重载形式。
若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。< font>

class Date 
{ 
public:    
	Date(int year = 1900, int month = 1, int day = 1)   
	{        
		_year = year;        
		_month = month;       
		_day = day;    
	}
 
    Date(const Date& d)    //拷贝构造函数
    {        
    	_year = d._year;        
    	_month = d._month; 
        _day = d._day;    
     } 
private:    
	int _year;    
	int _month;    
	int _day; 
};
 
int main() 
{    
	Date d1;    
	Date d2(d1);
    return 0; 
}

拷贝构造函数里的参数加const是为了让d2能和d1的值一样,因为使用d1的值去拷贝构造出一个一模一样的对象d2,为了不改变值,所以必须加const,加&符是为了避免引发无穷递归。< font>
如下图所示:
在这里插入图片描述

因为如果不加&符就属于值拷贝,在这里调用拷贝函数的时候,拷贝构造函数的参数就是一个临时变量,就又需要调用拷贝构造函数来生成,这样将会如此递归调用下去,,,,程序就会陷入死循环!

1.4赋值运算符重载
首先先说下运算符重载:
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的 操作符有一个默认的形参this,限定为第一个形参 。

.* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。 < font>

bool operator==(const Date& d2) 
{    
	return _year == d2._year        
		&& _month == d2._month        
		&& _day == d2._day; 
}

上面这样重载了==,就可以判断两个日期对象是否是相等的了!

赋值运算符的重载:

Date& operator=(const Date& d)    
{        
	if(this != &d)        
	{            
		_year = d._year;            
		_month = d._month;            
		_day = d._day;        
	}    
}

赋值运算符主要有四点:
1.参数类型
2. 返回值
3. 检测是否自己给自己赋值
4. 返回*this

一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

const成员函数:
将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this 指针,表明在该成员函数中不能对类的任何成员进行修改。

void Display() const
{
	cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}

void Display(const Date *this)
{
	cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}

上面两个函数是一样的,表示的意思都是不能修改*this这个对象的值!

Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图 其中,阵列方向图是评价阵列性能的重要参数之一。均匀面阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个圆盘。均匀线阵由若干个相同的阵元构成,阵元间等距排列,阵元的方向图形状为一个矩形。本文将采用Matlab进行仿真,分别实现均匀面阵方向图、均匀线阵方向图和均匀圆阵方向图,并对三种阵列进行比较分析。通过以上代码仿真,我们可以对均匀面阵、均匀线阵和均匀圆阵进行方向图的绘制,进一步分析不同阵列在天线性能方面的差异。Matlab仿真:均匀面阵方向图、均匀线阵方向图、均匀圆阵方向图。 阅读详情

相关推荐

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3678

[转]以下划线开头的变量名

C++; 系统头文件里将宏名、变量名、内部函数名用 _ 开头就是为了避免与用户用的名字冲突。因为当你#i nclude 系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪现象。换句话说:我们写程序时一定不要用 _ 开头的名字,以免与系统头文件的名字冲突,产生奇怪的问题(很难debug、弄清楚,当心)。 Python: 核心风格:避免用...

weixin_34124939的博客 1840

从Cartographer3D到LIO-SAM:主流3D激光SLAM算法怎么选?一份给机器人工程师的实战避坑指南

本文深入探讨了从Cartographer3D到LIO-SAM等主流3D激光SLAM算法的选型策略,为机器人工程师提供实战避坑指南。通过对比不同算法在传感器配置、环境特性和计算资源等方面的表现,帮助开发者根据项目需求选择最优方案,并分享传感器标定、资源优化等实用技巧。

weixin_27310985的博客 154

c/c++ 几个双下划线 实用的内置宏

c/c++ 几个双下划线 实用的内置宏 这几个宏分别是 __FILE__ 文件路径文件名 字符串 __FUNCTION__ 函数名 字符串 __LINE__ 行号 数字 __TIME__ 编译时间 字符串 __DATE__ 编译日期 字符串 printf("%s %s %d %s %s",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIM...

杂七杂八 3718

红帽RHCE考试下午-RHCE (RH294)任务概览[2021最新版]

RH294任务概览 考试时间4个小时,6台虚拟机,15道题 原来通过脚本或者集群做的题现在都需要使用playbook实现 考试时大概有6台虚拟服务器,都已经做好了互相的免密 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行 注意:考试时一定注意要求将playbook放在哪个用户的家目录中,就需要用指定的户登录做题!

SunMy的博客 5619

DRV8711驱动器的各寄存器的介绍

drv8711驱动器

PCLintelligence的博客 1634

C++ 中单独的下划线_是合法的标识符

更多关于编程语言, 数据库,算法等精品内容, 请访问 我的个人博客 huqijun.org ------------------------------------------------------------------------------------------------------------- int main() { char _ = 'n'; st...

所有内容都已迁移到 https://huqijun.org 6533

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1389

C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数

构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

机器学习 4164

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1353

基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论进一步优化建议需求分析电励磁同步电动机

MHD0815的博客 266

C++变量前面加下划线的含义

C++变量前面加下划线和不加下划线都不会影响对变量的定义,只是风格问题,更喜欢将成员变量或者私有成员变量的前面加上下划线。以表示该变量是某个类的属性。 比如: int size; int getsize() {     return size; } 但是大多数人都不喜欢,觉得麻烦,就用了如下风格: int _size; int size()

说自己行就行 2万+

使用 Python 爬虫抓取 IMDb 电影信息 - 评分、评论与基本信息抓取教程

本文介绍了如何使用 Python 爬虫技术抓取 IMDb 电影评分、评论和基本信息。我们分别展示了通过IMDb API和两种方法抓取数据,并进行了数据存储、分析与可视化。在未来,我们还可以基于这些数据开发电影推荐系统、情感分析工具等,进一步丰富电影数据的应用场景。通过这些实践,您不仅学会了如何抓取和存储数据,还可以通过这些基础来构建自己的数据分析应用,获取更丰富的电影数据。

2201_76125261的博客 601

【C++】类和对象(3.2W字剖析类和对象)

类和对象相关内容,构造函数和析构函数、拷贝构造的详细解析,全文3.2w字步步剖析类和对象

就业知识博客 1348

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

运算符重载

小羊的博客 2449

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++类和对象2

当我们自己写构造函数的时候,编译器会自动生成。但是我们发现编译器生成的构造函数,成员变量依旧是随机值,仿佛什么事情都没有做。C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,

2401_86164065的博客 1536

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

CPP类和对象 (2)

文章目录类和对象(2)对象的赋值(=)复制构造函数静态成员(Static)成员Friend函数与类函数模板 类和对象(2) 对象的赋值(=) 类型相同的对象可以相互赋值,相当于类中的数据成员相互赋值(memberwise copy)。 这种赋值与对象数据成员的访问权限无关。 demo class A{ int x; public: A(int x):x(x){} void ...

SongyangJi 604

【C++】类和对象2

本篇文章主要讲解C++中类和对象的基本知识,包括构造函数,析构函数,拷贝构造函数,赋值运算符重载函数,取地址运算符重载函数等

L_0907的博客 1192

C++类和对象 - 2

这篇文章写的蛮久,但是内容很多,有很多干货知识。我将在后续的日期类的实现一文中将前面知识进行再度的讲解。像后面的第6点这个也会再度提及,全部都会过一遍。内容较多,希望大家学有所获!

qiuyunoqy的博客 1027

C++类和对象梳理2

因此,当拷贝构造的参数类型为类类型时,如此往复,每传值都调用一次拷贝构造,形成了无穷套娃,因此便引发了无穷递归。当对象成员里含有指针时,形成地址拷贝,也就是说两个对象中的指针成员都指向同一块空间,因此当对其中一个对象中的空间操作时,另一个对象中的该空间也会改变,此时也会出现析构两次的情况,此时就需要深拷贝了。这当然是有意义的,在一个类的成员变量都为自定义类型的时候,这个时候便会对自定义类型的成员变量进行初始化(调用它的默认构造,如果它的默认构造是编译器自动生成的,则里面的内置类型变量仍为随机值)。

2301_81758005的博客 1704

2.C++ 类和对象

类和对象部分内容

Enen_nenE的博客 1066

C++——类和对象2

默认成员就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成6个默认成员函数:初始化和清理、拷贝复制、取地址重载(最重要的是前4个,最后两个不重要),从两个方面去了解:第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求???第二:编译器默认生成的函数不满足我们的需求时,需要我们自己去实现,那又该如何实现呢??构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称为构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是

2302_80045891的博客 576

C++ 类和对象2

内置类型就是语言提供的数据类型,比如:int、char.... ,自定义类型就是我们使用class / struct / union 等自己定义的类型,看看下面的程序,就会发现编译器生成的默认的构造函数会对自定义类型成员_t调用它的默认成员函数。

yun2739_love的博客 1198

2.C++类和对象(上)

1.oj:声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::类的命名规则:一般在成员变量前加_,来区分赋值,例如 _year= year,这样就区分开了。

No Game No Life 1456

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

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象在栈帧创建时,空间就开好了),而是对象实例化时初始化对象。构造函数的本质是要替代我们以前在Stack和Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init。析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁。比如局部对象是存在栈帧的, 函数结束后栈帧就销毁,它就释放了,不需要我们管。

2301_81888634的博客 1357

C++类和对象(2)

初始化列表,类型转换,static成员,友元,内部类

2302_81120572的博客 753
上一篇: Linux之线程安全
下一篇: C++实现日期类
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值