波奇学c++:类和对象:类,构造函数,析构函数和拷贝构造函数

news2024/11/18 17:39:53

面向对象和面向过程

面向对象:划分事务参与的对象,关注对象的交互,现实关系更真实的模拟现实

面向对象三大特性:封装,继承,多态

封装:私有,公有,为了更好的管理

c语言数据,方法分离,c++没有分离都定义在类中。

面向过程:把一项事务分为各步完成

struct 关键字可以作为结构体,又能作为类

类中可以定义成员函数和成员变量

struct a
{
    void add(int a, int b)//成员函数
    {
        return a+b;
    }
    int a;//成员变量
}
int main()
{
    stack a;
    a.add(1,2);
}

class作为类的关键字可以替代struct,两者区别,如果class默认访问权限private,struct默认访问权限public,访问限定符只在编译时有用,映射到内存时无区别。

类的访问权限问题

C++封装方式:用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性将其接口提供给外部用户使用

 公有在类外面可以直接访问,保护和私有不行,后两者区别在继承中体现。

struct a
{
public:
    void add(int a, int b)//成员函数
    {
        return a+b;
    }
private:
    int _a;//成员变量,一般用_前
}
//在函数外面不能访问 _a,函数里面的指针可以

在下一个限定符(private)之前都是上一个限定符的范围public(公有)

类可以声明定义分离,在类中定义函数默认内联函数,长函数一般是在类中声明,短函数在类里面定义。

//头文件
class A 
{
    void add(int a, int b);
}
//源文件
void A::add(int a,int b)
{
    return a+b;
}

域分为局部,类,全局,局部,全局影响生命周期,类域不影响生命周期。

类的大小:

类里面的变量是声明,不占空间,类实例化,才开辟空间。类只能一整个整体定义,不能单调定义类中的一个变量。

类的大小只和成员变量有关,和成员变量无关。

类的成员函数放在公共地方,创建多个实例时,不会拷贝多份函数代码,会创建多个成员变量。

大小计算规则:和struct结构体一样

struct A{
int add(int a,int b)
{
    return a+b;
}
int _a;
int _b;
};
sizeof(A)//8

*类可以不写关键字struct。

没有对象的类也有空间 占1byte

struct A
{
    int add(int a,int b)
{
      return a+b;
}
};
sizeof(A);//1

实例调用会有this指针,隐性传递过去给函数

struct A
{
    int add(int a,int b)
{
      return a+b;
}
};
A a;
a.add(a,b);

实例a调用时,除了传递a,b参数还传了this指针this指针,指向实例a。前面我们说过函数成员是放在一个公有的地方,所以为了分辨不同的实例,要传指向实例的指针进入是很合理的。

this 指针不能在类外调用,显性传递,但能在类中调用,访问成员变量函数

struct A
{
    int add(int a,int b)
{
      return a+b+this.c;
}
int _c=0;
};
A a;
a.add(a,b);

感觉和python的self很像。

类当中的默认成员函数:

构造函数:初始化实例

struct A
{
	A(int c)
	{
		_c = c;
	}//构造函数
	int add(int a, int b)
	{
		return a + b;
	}
	int _c;
};

A a(1);//构造函数调用

函数名与类名相同,无返回值,不用 void 。

对象实例化编辑器会自动调用。

C11:支持成员变量缺省值

struct A
{
	int _c=1;//成员声明给缺省数,不是初始化
};

全缺省构造函数和无参构造会有在函数调用时歧义。虽然两个函数可以重载,但是都可以无参调用,会有歧义。

struct A
{
	A()
	{
		_c =1;
	}
    A(int c =1)
	{
		_c =c;
	}
	int _c;
};

当类无构造函数时,会自动生成:

1.内置数据类型:不处理,有些编译器可能会处理

2.自定义数据类型:class,struct 会使用它的构造函数

内置数据类型给缺省值,成员变量全是自定义数据类型不用写构造函数。

析构函数:释放空间等,,如malloc 开辟的空间。

析构函数在类名加-。

无参数,无返回值。一个类会有一个析构函数,如果无显示定义,会自动生成一个。析构不能重载,内置数据类型不处理,自定义数据类型会调用对应的析构函数。

struct A
{
	int* _a;
    A()//构造函数
    {
        _a=(int*)malloc(sizeof(int));
    }
    ~A()//析构函数
    {
        free(_a);
        _a=NULL;
    }

};
 

拷贝构造函数:拷贝和复制类。

struct A
{
	int* _a;
    int _b=1;
    A()//构造函数
    {
        _a=(int*)malloc(sizeof(int));
    }
    A(const A& d)//拷贝构造函数
    {
       _d=(int*)malloc(sizeof(int));//深拷贝
       _b=d._b;//浅拷贝
    }
    ~A()//析构函数
    {
        free(_a);
        _a=NULL;
    }

};

当自定义类型作为参数时,会先在类中调用拷贝构造,再运行,而内置数据类型是直接拷贝。

A c;
fun(c);
int d = 0;
fun(d);

fun(d)时会直接拷贝d,fun(c)时会先运行A(const A& d)再进入函数。

A(const A& d)
    {
       _d=(int*)malloc(sizeof(int));//深拷贝
       _b=d._b;//浅拷贝
    }

拷贝构造的参数只有一个且必须是类对象引用。用传值方式编译器会无穷递归。

传值调用就又变成参数是自定义类型,又会调用拷贝函数。

为了防止顺序弄反,可以用const修饰参数。

不定义会默认生成拷贝构造函数

1.内置类型成员:值拷贝

2.自定义类型:调用他的拷贝

因为默认情况下是值拷贝,如果_a也是值拷贝的话就会变成两个变量指向一个空间,不符合我们的想法。为了解决这个问题才有了拷贝构造的存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第 7 章 与 Hive 的集成--以及最后的HBase回顾

7.1 使用场景 如果大量的数据已经存放在 HBase 上面,需要对已经存在的数据进行数据分析处理,那 么 Phoenix 并不适合做特别复杂的 SQL 处理,此时可以使用 hive 映射 HBase 的表格,之后 写 HQL 进行分析处理。 插入一条&#xff…

鸿蒙Hi3861学习五-Huawei LiteOS(任务管理)

一、任务简介 关于任务的相关介绍,之前文章有比较详细的介绍,这里不做过多解释,可以参考如下文章:FreeRTOS学习二(任务)_t_guest的博客-CSDN博客 而LiteOS的主要特性可以总结为如下几点: LiteO…

一个文章学会使用Git

GIT版本控制系统 版本控制系统 : ​ 1.记录历史版本信息 (记录每一次修改的记录) ​ 2.方便团队相互之间协作开发 ​ … 常用的版本控制系统 cvs / svn : 集中式版本控制系统git : 分布式版本控制系统 svn git GIT工作原理 工作区 : 我们能看到的,并且用来写代码的…

nodejs的安装以及Dos的命令

1.0 nodeJS nodejs是基于谷歌v8引擎的执行环境,他没有BOM、DOM nodeJS安装 找官网 ->下载 -> 傻瓜式下一步 -> win键 r -> 输入cmd 进入dos操作命令 -> node -v 查看版本 1.1 DOS 命令【掌握】 进入指定文件夹 cd 文件目录 退出到上一层 cd .…

112.【Vue-细刷-03】

Vue-03 (二十)、过渡和动画1.过渡案列_原生实现2.过渡案列_Vue实现3.动画案列_Vue实现 (1)4.动画案列_Vue实现(2)5.Vue实现时间格式化6.Vue实现过滤器7.Vue常用内置指令 (二十一)、Vue的自定义指令1.自定义非内嵌指令(不保留h2中的原有text)2.自定义非内…

在线教育机构视频加密防下载和防盗用的方法有哪些可以借鉴

阿酷TONY / 原创 / 2023-5-5 / 长沙 在线教育机构防止视频被盗用和视频被下载,可以采取以下措施,一共10条,总有一条适用于您吧,收藏一下吧~~~~~ 1.VRM分片错序视频加密 2.Html5全链路视频加密 3.用户ID跑马灯 4.数字化动态水印 …

【科普帖】晶振 OCXO、VCXO、TCXO、VC-TCXO、DCXO、SPXO区别

一、前言 晶体振荡器用作频率基准,以生成非常稳定的频率源。它用于许多应用中,如频率合成器,本地振荡器,并在调制解调器和其他电路中提供稳定的时钟。 晶体输出频率漂移主要受温度、电源电压和老化的影响。其中温度变化是最为重要…

PS VR创始成员:瑕不掩瑜,PS VR2是跨世代的飞跃

今年2月,索尼次世代VR头显PS VR2正式发售,这款立项近7年的产品受到了游戏玩家和从业者广泛关注,市面上也有很多种不同的测评报告。PS VR项目创始成员、前索尼沉浸式体验专家、高级VR游戏设计师Jed Ashforth也发表了自己对于该头显的一些看法&…

Verilog概述一:Verilog HDL和 VHDL详细对比

当前比较流行的硬件设计语言有两种,即 VHDL 与 Verilog HDL,两者各有优劣,也各有相当多的拥护者。 VerilogHDL和VHDL都是完备的HDL设计和验证语言,具有完整的设计方法和设计规范。 何为HDL HDL(hardware descriptio…

Go type关键字定义新类型和类型别名的区别

type关键字再定义类型和类型别名有很大的区别,前者是新定义一个数据类型,后者是对类型的重命名。 type NewString stringtype OldString stringtype NewString string声明了一个NewString类型,和string具有完全一致的数据结构,确…

【Linux】usb游戏手柄测试、编程

1、简述 在ubuntu18.04下使用usb游戏手柄,之前联系客服,客服回答不清楚是否支持linux,因此采购一款北通蝙蝠2的手柄来测试 2、测试 2.1 测试环境 系统:Ubuntu18.04 正常电脑系统ubuntu中都是自带手柄驱动的joystick,即内核配置已添加选项:Joysticks interface和Joys…

vue - 常见的移动端适配方案

移动端适配方案 rem适配原理方案1:rem媒体查询方案2:jsrem方案3:vwrem(不用查询屏幕宽度) 移动端适配经常使用的就是 rem; 主要有以下几种方案: 1:rem 媒体查询(media) …

Springboot(二):配置文件读取

1.1引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><a…

一目了然凉哥为大家倾力打造的付费专栏

写在前面 大家好&#xff0c;我是几何心凉&#xff0c;欢迎来到我的付费专栏系列&#xff0c;本专栏将深入介绍 Vue 3 和 Vite&#xff0c;以及如何在 TypeScript 的帮助下构建现代化的 Web 应用程序。 Vue 是一个流行的 JavaScript 框架&#xff0c;它允许开发人员构建高性能…

Java之多线程初阶

目录 一.进程和线程 1.什么是进程 2.并发,并行和串行 3.线程和多线程 4.进程和线程的区别(重点) 5.多线程的优点 6.多线程的缺点 二.线程的创建 1.继承Thread类 2.实现Runnable接口重写run()方法 3.通过匿名内部类的方式创建Thread和实现Runnable 4.通过Lambda表达式…

金豺(GJO)优化算法、matlab代码实现以及与PSO、GWO、SO算法比对

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1 算法原理2 算法步骤2.1 初始化种群2.2 搜索猎物(全局搜索)2.3 包围和围捕猎物&#xff08;局部搜索&#xff09;2.4 从全局搜索转向局部搜索 3 算法流程图4 m…

(22)目标检测算法之 yolov8模型导出总结

yolov8模型导出总结 不断更新中… 几种部署情况: onnxxmlengine官网说明:https://github.com/ultralytics/ultralytics/blob/main/docs/modes/export.md导出参数: onnx 参数解析format: 导出的模型形式:onnx xml engine ... imgsz: 设置模型的输入尺寸大小,默认640*640 ke…

记录一次docker镜像迁移过程

1.在母本服务器上查看要复刻的docker镜像。 sv800:build 作为docker镜像源[repository:tag],使用docker save 指令提出docker镜像包rk3588.tar docker save -o rk3588.tar sv800:build 2.在新环境下加载docker镜像包&#xff0c;预先安装docker指令工具 docker load -i rk35…

OCT图像中的多尺度无监督视网膜水肿区域分割

文章目录 Multiscale Unsupervised Retinal Edema Area Segmentation in OCT Images摘要本文方法原始的DCCS无监督图像聚类Pseudo-Mask-Guided Pixel-Wise Segmentation 实验结果 Multiscale Unsupervised Retinal Edema Area Segmentation in OCT Images 摘要 提出了一种新的…

STM32F051K8U6按键中断实例

引言 最近要开始做毕设了&#xff0c;准备用STM32做一个平衡小车&#xff0c;好久没做过STM32的裸机项目了&#xff0c;做几个项目练练手&#xff0c;复习一下。本例程使用STM32CubeMX配套hal库来实现按键中断和串口中断。芯片用的是STM32F051K8U6。 一、按键中断 &#xff0…