C++,构造函数、拷贝构造函数、 常成员、常对象、static

2023-09-21 08:00:00

一、构造方法

       构造方法的名字必须与类名同名

       它不具有任何返回值,也不能声明返回值类型,连void都不能写

       构造方法可以重载

       构造方法声明一般格式为

             类名(<形参列表>);

       定义构造方法格式为

             类名::类名(<形参列表>){.......}

       构造方法中的this指向新创建的对象.

       构造方法的功能是由用户定义的,用户根据初始化的要求设计方法体和方法参数。一般功能都是用于初始化实例成员变量, 有两种方式

       (1)this->实例成员变量=值

       (2)参数初始化表

       构造方法的调用: 当通过一个类创建对象后,会自动触发执行类的一个构造方法。如果类中构造方法重载时,系统根据创建对象时传递的实参来调用类中的其中一个构造方法。(只有创建对象时,才会触发执行构造方法)

       默认构造方法:如果在类中没有定义构造方法,则C++系统会自动生成一个构造方法,只是这个构造方法的方法体是空的,也没有参数。(公共、无参、空实现) 例:public:类名() {   }

       如果自定义了任意构造方法,则默认构造方法不会被自动加入。

       创建对象的一般格式为

              类名 对象名; //触发调用无参构造方法  

              类名 对象名(实参1,实参2,…);//触发调用有参构造方法

二、拷贝构造函数

       概念:拷贝构造方法是一种特殊的构造方法,用于从同一类的其他对象进行初始化。它通常用于复制一个对象的内容到另一个对象,以实现对象的拷贝操作。

       拷贝构造方法的声明: 类名(const 类名& obj)

       对象克隆简单示例:

              Stu stu2(stu1)。这会触发复制构造方法

       默认拷贝构造方法,如果没有写拷贝构造方法,则会有一个默认的拷贝构造方法,其函数体功能是通过已有对象引用,为新创建对象中的实例成员赋值,这属于浅拷贝。

       默认拷贝构造方法:(浅拷贝)

       一但显示创建拷贝构造方法,则默认拷贝构造方法就不会产生。

       只要显示写了任何构造方法,默认无参构造方法都不会被自动加入。

       而只有显示写了拷贝构造方法,默认拷贝构造方法才不会被自动加入。

 )

       浅拷贝,即使实例成员是指针,也只拷贝指针的值,这新的对象和源对象中的指针实例成员变量会指向同一个内存。

       深拷贝,新的对象和源对象中的指针实例成员变量不会指向同一个内存。这就要求自定义拷贝构造方法。

三、对象的赋值(类似于浅拷贝,但不是浅拷贝)

       格式:  对象1= 对象2,

       意义:参与赋值运算的两个对象都是已经创建了的,作用是把对象2中成员变量的值赋值给对象1

       注意:对象的赋值不会调用拷贝构造方法

t2.operator=(t1);简写为t2=t1。

//等号运算符重载。重写了等号运算符,若不重写,也会被编译器自动加上。

类对象默认加载的函数

       构造函数

       拷贝构造函数

       析构函数

       “=“运算符重载函数

四、析构函数

       析构函数(destructor)名字是类名的前面加一个“~”符号。没有参数,并且也不能重载,没有返回值,连void 都不能写。

       当对象的生命期结束时,会自动触发执行析构函数。

       析构函数一般用于完成“清理”的工作。如果用户没有定义析构函数,C++编译系统会自动生成一个析构函数,但它什么操作都不进行。想让析构函数完成任何工作,都必须自定义的析构函数。

       将析构函数声明前面加上virtual关键字的作用是实现多态的析构函数

五、常成员变量

       1、常成员变量是用关键字const来声明成员变量,  const位于类型前后都一样,但是成员类型为指针时,const只能位于类型后,如 int * const p;

       2、常成员变量只能通过构造方法的初始化表对常成员变量进行初始化。

       3、常成员变量所在类中所有构造方法都必须通过初始化表对常成员变量进行初始化。

       4、常成员变量可以像普通的成员变量一样被访问,但是其值不能被修改.

六、常成员函数

       1、常成员函数不能修改对象,即不能修改对象的成员变量

       2、常成员函数:用const来修饰的成员函数,const位于函数的括号之后, 定义和声明的地方都要加上const。

       3、常成员函数不能修改成员变量的值

       4、常成员函数只能调用常成员函数,不能调用普通成员函数

       5、普通成员函数可以调用常成员函数

七、常对象

       定义常对象格式为: 类名 const对象名[(实参表列)]; 或const类名 对象名[(实参表列)];

       常对象中所有的成员变量的值都不能被修改, 常对象只能访问常成员函数;

       创建常对象时,触发的构造方法必须把所有的成员变量初始化,方式可以是初始化表也可以是函数体中的this。

八、在堆中创建对象

       new运算符可以动态创建对象,创建对象后会返回对象的地址。如果内存不足导至无法成功创建对象,则会返回一个0指针值。

    动态创建的对象要用delete 对象指针才能销毁对象;  销毁对象时,会触发析构函数的执行。

       堆中对象起名字

       销毁对象方法:

       函数返回堆中对象的引用

九、static成员

       1、如果想在同类的多个对象之间实现数据共享,可以用静态成员变量,即用static修饰的成员变量,例 static  int a;

       2、静态成员变量在项目刚运行的时候就分配内存,项目运行结束以后才销毁。

       3、静态成员变量被它所属类创建的所有对象共享。

       4、静态成员变量必须在类体外初始化, 一般使用对应的cpp文件中进行初始化。

              格式为:类型  类名∷静态成员变量 = 初值

             例:   int    Stu:: a  = 20;

       5、访问静态成员变量有两种方式:

              与普通的成员变量一样

              用静态成员变量所属类的类名来访问,即“类名::静态成员变量名”。第一种形式       底层也会变成"类名::静态成员变量名"

       6、访问静态成员方法与访问静态成员变量相同。

       7、在声明成员函数时,在最前面使用static修饰函数,该函数就是静态成员函数,静       态成员函数被访问与静态成员变量相同。静态成员函数中无this

       实例成员只能使用this访问。(实例成员:无static修饰的成员变量或成员方法)。

更多推荐

6.1 使用scikit-learn构建模型

6.1使用scikit-learn构建模型6.1.1使用sklearn转换器处理数据6.1.2将数据集划分为训练集和测试集6.1.3使用sklearn转换器进行数据预处理与降维1、数据预处理2、PCA降维算法代码scikit-learn(简称sklearn)库整合了多种机器学习算法,可以帮助使用者在数据分析过程中快速建

【深度学习】快速部署ONNX模型【入门】

【深度学习】快速部署ONNX模型【入门】提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论文章目录【深度学习】快速部署ONNX模型【入门】前言搭建打包环境打包exe文件总结前言之前的内容已经尽可能简单、详细的介绍CPU【Pytorch2ONNX】和GPU【Pytorch2ONNX】俩种模式下Pytor

【Linux入门】---Linux权限管理详解

文章目录1.shell命令以及运行原理2.linux用户分类su指令切换用户3.Linux权限管理3.1Linux文件访问者3.2文件类型和访问权限3.3文件权限值的表示方法3.4文件访问权限的相关设置方法chmod指令--权限修改方法①chmod指令--权限修改方法②chown指令chgrp指令umask指令file

基于Gradio/Stable Diffusion/Midjourney的AIGC自动图像绘画生成软件 - Fooocus

0.参考本项目:GitHub-lllyasviel/Fooocus:Focusonpromptingandgenerating作者:LvminZhang​编辑lllyasviel另一杰作ContorlNethttps://github.com/lllyasviel/ControlNet模型:https://huggin

登录认证方式汇总,例如ThreadLocal+拦截器+Redis、JWT

登录方式汇总先讲讲传统的登录方式1.Cookie方案用cookie作为媒介存放用户凭证。用户登录系统之后,会返回一个加密的cookie,当用户访问子应用的时候会带上这个cookie,授权以解密cookie并进行校验,校验通过后即可登录当前用户。缺点:Cookie不安全,Cookie是存到客户端的,攻击者可以伪造Cook

设计模式概述

什么是设计模式?“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动“。——ChristopherAlexander软件设计固有的复杂性:“建筑商从来不会去想给一栋已建好的100层高的楼房底下再新修一个小地下室——这样做花费极大而且注定要失败

爬虫异常处理实战:应对请求频率限制和数据格式异常

目录一:请求频率限制的处理1、设置请求间隔时间2、使用随机化延迟3、添加爬虫IP和用户代理二:数据格式异常的处理1、异常数据的过滤2、错误信息的记录3、动态调整解析规则总结在爬虫编程中,我们经常会遇到各种异常情况,比如请求频率限制和数据格式异常。这些异常可能会让我们的爬虫任务陷入困境,因此,学会处理这些异常就显得尤为重

威胁的数量、复杂程度和扩散程度不断上升

Integrity360宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。数据盗窃、网络钓鱼、勒索软件和APT是最令人担忧的问题这项调查于2023年8月9日至14日期间对205名IT安全决策者进行了调查,强调了他们的主要网络安全威胁和担忧,超过一半的受访者(55%)认为数据盗窃是最大的担忧,勒索软件位

linux--进度条

目录搭建环境版本1版本2版本3本篇文章我们将来尝试写一个简单的小程序–进度条。搭建环境在这之前,我们要先搭建好一个框架,如下:先依次创建好一个头文件(pb.h)用以声明和定义宏,一个源文件(pb.c)用于书写进度条源代码,一个源文件(main.c)用于测试以及后续搭建实际的场景,以及makefile。makefile:

SpringAOP入门案例

packagecom.elf.spring.aop.aspectj;/***@author45*@version1.0*/publicinterfaceUsbInterface{publicvoidwork();}packagecom.elf.spring.aop.aspectj;importorg.springfra

故障注入实验:了解如何使用Chaos Engineering的方法,在服务网格中进行故障注入实验

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

热文推荐