当前位置: 首页 > news >正文

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

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

相关文章:

  • JavaEE——File类
  • CANoe-如何模拟CAN总线网关通信(满满都是细节)
  • 请求转发与重定向
  • 如何使用OpenCV的随机森林(Python)
  • matlab神经网络预测数据,Matlab神经网络预测复数
  • 毕业设计 基于单片机的智能蓝牙密码锁设计与实现
  • 【线上实习项目】助力你的校招!
  • 吊打面试官系列之--吃透Spring ioc 和 aop (中)
  • Matlab制作GUI
  • Spring Data JPA或Spring Data JDBC中Like和Containing区别
  • SpringMVC04之JSON和全局异常处理
  • <C++> list容器本质|常用接口|自定义排序规则
  • 【Matlab】简单控制系统建模(控制系统工具箱)
  • 设计模式——模板模式
  • 倍投技巧 - 凯利公式教你如何用正确的方法投资
  • 【391天】每日项目总结系列128(2018.03.03)
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular4 模板式表单用法以及验证
  • AWS实战 - 利用IAM对S3做访问控制
  • Fastjson的基本使用方法大全
  • KMP算法及优化
  • node入门
  • PAT A1017 优先队列
  • Phpstorm怎样批量删除空行?
  • ViewService——一种保证客户端与服务端同步的方法
  • vue:响应原理
  • 对JS继承的一点思考
  • 爬虫模拟登陆 SegmentFault
  • 区块链技术特点之去中心化特性
  • 数组大概知多少
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过npm或yarn自动生成vue组件
  • 网络应用优化——时延与带宽
  • 我与Jetbrains的这些年
  • 学习ES6 变量的解构赋值
  • 阿里云服务器购买完整流程
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $(selector).each()和$.each()的区别
  • $.ajax,axios,fetch三种ajax请求的区别
  • (c语言)strcpy函数用法
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (多级缓存)多级缓存
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(下)
  • (万字长文)Spring的核心知识尽揽其中
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .cn根服务器被攻击之后
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net mvc总结
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】