热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《C++类中的基本常识》

【this指针】正常情况下,在类中函数编写的时候就会出现一个非常尴尬的问题就是,我们参数名和类中名字是相同的,这个时候就会出现一个特别尴

【this指针】

正常情况下,在类中函数编写的时候就会出现一个非常尴尬的问题就是,我们参数名和类中名字是相同的,这个时候就会出现一个特别尴尬的问题,就是我们傻傻分不清这个这个成员是这个本身类中的还是参数类中的,这个时候C++中通过引入this指针在解决这个问题

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

也就是:this指针这玩意是编译器自动生成的,不需要你手动生成了,你也这可以理解为这个this就是这个类本身。

【this指针的特性】

1.this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

2.只能在“成员函数内部使用”

3.this指针本质上是“成员函数”的形参,当对象调用成员函时,将对象地址作为实参传递给this形参,所以对象中不存储this指针,所以在类的成员中你找不到这玩意。

4.this指针是“成员函数”第一个隐含的指针形参,一般情况下由编译器通过ecx寄存器自动传递,不需要用户传递。

【类的6个默认成员函数】

如果一个类总什么成员都没有,简称空类

空类中真的什么都没有吗?并不是,任何类在什么都不写的时,编译器会自动生成以下六个默认成员函数。

默认成员函数:用户没有显示显现,编译器会生成的成员函数称为默认成员函数。

【构造函数】

 特性:构造函数是特殊的成员函数,需要注意的是,构造函数虽然名字叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。

其特征如下:

1.函数名和类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载

tips:如果类中没有显示定义构造函数,则编译器会自动生成一个无参的默认构造函数,一旦用户显示定义,编译器将不在生成。

这个时候聪明的小朋友就要问了,为啥我有了编译器自带的构造构造函数,但是我初始化一个类最后的结果依旧是一个随机值?也就是说默认构造函数并没有用?

C++把类型分为内置类型和自定义类型,内置类型就是语言提供的数据类型,如:int,char....,自定义类型就是我们使用class/struct/union等自己定义的类型,而C++中编译器自己生成的构造函数对内置类型不做处理,但是对自定义类型调用自定义类型本身的构造函数。

注意:可能写出C++的大佬认为这个构造函数不对内置类型做出处理属实有点反人类,于是在C++11中对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给出默认值。置于为何是又,这个倒构造函数的细解就知道了。

默认构造函数的类型:

无参的构造函数和全缺省的构造函数都被称为默认构造函数,并且默认构造函数只能有一个!!!

注意:无参构造函数,全缺省构造函数,我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

【析构函数】

概念:构造函数告诉我们一个对象是咋来的,那么析构函数函数就是告诉我们一个对象时咋没的

析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象资源中的清理工作。

特性:

1.析构函数名是在类名前面加上字符“~”。

2.无参数无返回类型

3.一个类只有一个析构函数,若未显示定义,系统会自动生成默认的析构函数,注意:析构函数不能重载。

4.对象声明周期结束时,C++编译系统自动调用析构函数

5.和构造函数相反,析构函数默认只能将内置类型给重新归零,但是对申请的内存资源不做处理,对自定义类型则会调用自定义类型自己的析构函数。

tips:当类的成员没有向系统申请资源的时候,默认的析构函数就已经够用了,但如果内部成员调用了系统资源,就要你自己去手动编写这个析构函数了。


推荐阅读
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文详细探讨了Java中HashMap类的hash()方法的工作原理及其重要性,特别是在JDK 7版本中的实现。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 探讨了一个包含纯虚函数的C++代码片段,分析了其中的语法错误及逻辑问题,并提出了修正方案。 ... [详细]
author-avatar
DaybreakCP
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有