c++之 类和对象

news2025/1/16 3:36:31

目录

1.类和对象的基本概念

1.c语言与c++中的结构体

2.类的封装性

 3.定义类

4.构造与析构

构造与析构的概念:

构造函数

析构函数

拷贝构造函数

c++默认增加的函数


1.类和对象的基本概念

1.c语言与c++中的结构体

我们知道在c语言里,我们是无法在结构体内部定义函数的,但在c++里,我们可以定义函数。从这里我们就可以看出c++对于数据(属性)和行为(方法)是封装的。它可以在数据的储存里同时添加了数据操作的功能。

所谓封装就是将抽象得到的数据和行为相结合,形成一个有机体,及就是将数据与操作数据的函数代码进行有机的结合,形成类,其中的数据和函数都是类的成员。

c语言中结构体中不能存放函数,也就是数据(属性)和行为(方
法)是分离的
c++中结构体中是可以存放函数的,也就是数据(属性)和行为
(方法)是封装在一起的。
所以了解c++中的类是至关重要的。

2.类的封装性

c++将事物的属性和行为封装在一起
类和结构体的一个区别在于,类对成员可以进行访问的权限控
制,结构体不可以
类 = 类型 (事物的行为和属性) 类实例化出来的变量叫对象
类中的函数 可以访问类里面的成员

类将具有共性的数据和方法封装在一起,加以权限区分,用户只能通过公共的方法访问私有数据。

类的权限分为:private (私有)  ,public (公有), protected(保护)三种权限。

这些权限是针对类外部的访问,只有公有(public)数据才能被访问,在没有涉及到继承与派生是,private和protected是同等级的,外部都不允许访问,要想访问到该成员,只能通过公有的方式间接访问到这两类数据。

 3.定义类

类的关键字 class ,类的定义方式为:

class 类名

{

     成员列表

}

c++ 中对事物的封装 将属性和行为封装在一起
类 将事物抽象成属性和行为 , 并且封装在一起
类中定义的成员不声明权限,默认为私有型。

举个例子:

/定义一个类
class Data
{
private:
	int a;//私有数据  也是默认的类型
protected:
	int b;//保护数据
public:
	int c;//公有数据
	void showdata()//方法
	{
		cout << a << " " << b << " " << c << endl;
	}

};
//使用类
int main()
{
	//定义Data类的一个对象
	Data data;
	//只能访问公有的数据
	cout << data.c<<endl;
	//通过公有的方法实现间接访问私有的数据
	data.showdata();
	//打印data中的a,b,c。


}
结构体中所有成员默认都是公有的 而类中的所有成员默认是私有的 ,且在结构体中 也可以修改成员的访问权限。

设计一个类需要我们对该类的方法与数据做出详细的判断,比如设计一个人的类

class person
 { 
 private:
	 char pname[20];
	 int page;
	 char pIDnumber[10];
 public:
	 void Initperson(char* name,int age,  char *IDnumber)//初始化person
	 {
		 strcpy(pname, name);
		 if (age > 0)
		 {
            page = age;
		 }
		 else
		 {
			 cout << "错误格式" << endl;
		 }
		 
		 strcpy(pIDnumber, IDnumber);
	 }
	 //修改名字
	 void setname(char *arr)
	 {
		 strcpy(pname, arr);
	 }
	
	 //修改年龄
	 void setage(int age)
	 {
		 if (age > 0)
		 page = age;
	 }
	 //修改身份号码
	 void setIDnumber(char* arr)
	 {
		 strcpy(pIDnumber, arr);
	 }
	 //打印信息
	 void showperson()
	 {
		 cout << "姓名:" << pname << endl;
		 cout << "年龄:" << page << endl;
		 cout << "身份号码:" << pIDnumber << endl;
	 }
 };
 int main()
 {
	
	 //定义两个person类的对象
	 person jack;
	 //初始化
	 jack.Initperson((char*)"jack", 12,(char *)"123456");
	 jack.setage(18);
	 jack.showperson();
	 return 0;
 }
尽量设置成员变量为私有权限
设置成员变量为私有,优点:
对变量的设置时的控制
可以给变量设置只读权限
可以给变量设置只写权限
可以给变量设置可读可写权限
当然我们也可以类外实现方法-即函数,不过我们需要添加作用域符来表明所属地。
class Data
	 {
	 private:
	 	int a;//私有数据  
	 protected:
	 	int b;//保护数据
	 public:
	 	int c;//公有数据
	 	void showdata()//方法
	 	{
	 		cout << a << " " << b << " " << c << endl;
	 	}
		void getA(int a);
	 
	 };
 void Data::getA(int A)
 {
	 a = A;
 }

4.构造与析构

构造与析构的概念:

创建对象时,对对象进行初始化的工作,就是构造
销毁对象时对对象进行清理工作,就是析构
一般需要人为提供,如果不提供,那么编译器也会给提供,只是编译器提供的构造和析构函数不会做任何操作,只是默认为空。若创建有构造函数与析构函数,编译器会自动调用构造函数与析构函数。
创建对象时和释放对象时,构造函数和析构函数自动会调用,不 需要人为调用。
构造函数的特点:
1.没有返回值
2.没有函数返回类型
3.函数名与类名一样
4.可以发送函数重载
5.创建对象时,会自动调用。
析构函数的特点:
没有返回值
1.函数名: 类名前面加上~
2.没有参数
3.不能发送函数的重载
4.销毁对象之前,回被自动调用

构造函数

构造函数的几种方式:
class Data
	 {
	 private:
	 	int a;//私有数据  
	 protected:
	 	int b;//保护数据
	 public:
		 Data()//无参构造函数
		 {
			 c= 0;
		 }
	 	int c;//公有数据
		Data(int x,int y)//有参构造函数
		{
			c = x;
             a=y;
		}
	 
	 };
  int main()
  {
	  //隐式调用无参构造函数(未创建构造函数,构造函数默认为无参的)
	  Data b1;
	  //显示调用无参构造函数
	  Data b2=Data();
	  //隐式调用有参构造函数
	  Data b3(1,2);
	  //显式调用有参构造函数
	  Data b4 = Data(1,2);

	  //匿名对象(无名构造对象)  存活周期为当前语句结束,立即释放
	  Data();
	  Data(20,10);
	  //构造函数隐式转换(类中只有一个数据成员)
	  Data b5 = 100;
 }
构造函数的分类
无参构造和有参构造
普通沟通和拷贝构造
拷贝构造函数的写法: 类名 ( const 类名 & obj ){}
注意:
如果自定义了一个构造函数,系统将不再提供默认的构造函数.
如果自定义了一个拷贝构造,系统将不再提供默认的拷贝构造.
默认的拷贝构造是简单的值拷贝.
如果创建对象时,不能调用对应的构造函数,将不能创建出对象.
我们要习惯去在构建类时,把构造函数也构建了。

析构函数

函数名称与类名相同,在函数名前加~,没有返回类型,没有函数形参,不能被重载。
当对象生命周期结束时,系统自动调用析构函数。
先调用析构函数,在释放对象空间。
析构函数的定义
 class Data1
	 {
	 private:
	 	int a;//私有数据  
	 protected:
	 	int b;//保护数据
	 public:
		 Data1(int x)//有参构造函数
		 {
			 c= x;
			 cout << "构造函数:" << c << endl;
		 }
		 int c;
		 ~Data1()//析构函数
		 {
			cout<<"析构函数:"<<c<<endl;
		 }
	 };

  Data1 b1(10);//整个项目结束时才会析构
  void test1()
  {
	  Data1 b2(20);
	   {
		  Data1 b3(30);//局部对象 (出了范围就会自动调用析构函数销毁)
	   }
	  Data1 b4(40);

  }
  int main()
  {
	  test1();
	  return 0;
  }

运行来通过打印顺序发现函数调用顺序:

 一般析构函数为空,这里只是展示一下调用关系才写了打印功能。

一般不写析构函数,但若存指针,必须要写析构函数,因为所在堆区空间,默认是无法释放的,会造成内存泄漏,我们要创建析构函数释放这一部分空间。

拷贝构造函数

拷贝构造:本质是构造函数

拷贝构造函数的写法:
类名 ( const 类名 & obj ){}

拷贝构造函数的调用时机

总结一种情况: 旧对象初始化新对象

分类:
旧对象初始化新对象
形参是一个对象
返回局部对象

c++默认增加的函数

默认情况下, c++ 编译器至少为我们写的类增加 3 个函数
1 .默认构造函数 ( 无参,函数体为空 )
2 .默认析构函数 ( 无参,函数体为空 )
3 .默认拷贝构造函数,对类中非静态成员属性简单值拷贝
如果用户定义拷贝构造函数, c++ 不会再提供任何默认构造函数
如果用户定义了普通构造 ( 非拷贝 ) c++ 不在提供默认无参构造,但是
会提供默认拷贝构造.
类对象成为另一个类的成员
类中有多个对象时,构造的顺序是先构造里面的对象,在构造外
面的对象.
类中有多个对象时,析构时顺序是先析构外面的对象,在析构里
面的对象.

 

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

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

相关文章

进程的开销比线程大在了哪里?

进程内部都有哪些数据&#xff1f; 为什么创建进程的成本很高&#xff1f; 这样的问题确实不好回答&#xff0c;除非你真正理解了进程和线程的原理&#xff0c;否则很容易掉入面试大坑。探究问题背后的原理&#xff0c;围绕面试题展开理论与实践知识的学习。真正理解进程和线…

centos7虚拟机下hbase的使用案例讲解

系列文章目录 centos7虚拟机在集群zookeeper上面配置hbase的具体操作步骤 centos7虚拟机配置集群时间同步的操作步骤_centos虚拟机时间同步 centos7配置zookeeper本地模式与集群模式的详细教程 卸载centos7自带的jdk的操作步骤_centos7 卸载java 虚拟机centos7配置Hadoop单…

如何用 Vitis HLS 实现 OpenCV 仿真

这篇文章的基础是《Windows上快速部署Vitis HLS OpenCV仿真库》&#xff0c;我们使用的版本是Vitis HLS 2022.2&#xff0c;其他版本BUG不清楚&#xff0c;目前已知2021版本有BUG&#xff0c;只能使用其他方式&#xff0c;本文不适合。 这次选择中值滤波这个常规算法作为演示算…

Springboot电脑商城项目

目录 系统概述与环境搭建 1 系统开发及运行环境 2 项目分析 3 创建数据库 4 创建Spring Initializr项目 5 配置并运行项目 6 导入前端项目 用户注册 1 用户-创建数据表 2 用户-创建实体类 3 用户-注册-持久层 4 用户-注册-业务层 5 用户-注册-控制器 6 用户-注册…

归并排序(递归实现)

上一次我们说了快排的其他版本&#xff0c;还有就是快排的非递归实现 这次我们就说一哈归并排序&#xff0c;归并排序也是很厉害的一种排序&#xff0c;而且归并排序的时间复杂度可以说成标准的O(n log n) 下面我们就来看一下归并排序 我们先来看一下什么是归并排序 假设我…

Scratch蓝桥杯实战训练 —— 巧解“韩信点兵”难题的五种方式

“韩信点兵”蓝桥杯问题描述&#xff1a; “蓝桥杯”中有一道有趣的 Scratch 编程题&#xff0c;题目要求为&#xff1a;韩信点兵 扩展知识&#xff1a; 这道题叫“中国余数定理”&#xff0c;又叫“孙子定理”&#xff0c;也叫“韩信点兵问题”&#xff0c;是我国古代数学智慧…

Faster-RCNN代码解读3:制作自己的数据加载器

Faster-RCNN代码解读3&#xff1a;制作自己的数据加载器 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&…

Node【三】Buffer 与 Stream

文章目录&#x1f31f;前言&#x1f31f;Buffer&#x1f31f; Buffer结构&#x1f31f; 什么时候用Buffer&#x1f31f; Buffer的转换&#x1f31f; Buffer使用&#x1f31f; 创建Buffer&#x1f31f; 字符串转Buffer&#x1f31f; Buffer转字符串&#x1f31f; 拼接Buffer&…

python 理解BN、LN、IN、GN归一化、分析torch.nn.LayerNorm()和torch.var()工作原理

目录 前言&#xff1a; 简言之BN、LN、IN、GN等归一化的区别&#xff1a; 批量归一化(Batch Normalization&#xff0c;BN) 优点 缺点 计算过程 层归一化(Layer Normalization&#xff0c;LN) 优点 计算过程 总结 分析torch.nn.LayerNorm()工作原理 分析torch.var(…

Vue2-黑马(十一)

目录&#xff1a; &#xff08;1&#xff09;vue2-联调准备 &#xff08;2&#xff09;vue2-登录实战-国际化 &#xff08;3&#xff09;vue2实战-登录-login-index.vue &#xff08;1&#xff09;vue2-联调准备 登录这个请求&#xff0c;并不是发给后台的&#xff0c;现在还…

浙大MBA提面申请材料的三六九等……

每年浙大MBA项目提前批面试申请的每个批次中都会有部分材料因为某些原因而被淘汰&#xff0c;无缘面试资格。考生们由最初的不理解到逐渐隐约的理解&#xff0c;行至今日也可以大体接受材料被刷这个结果&#xff0c;当然其中含有一部分面上资质背景还可以的考生&#xff0c;等到…

Faster-RCNN代码解读2:快速上手使用

Faster-RCNN代码解读2&#xff1a;快速上手使用 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff08;…

中国电子学会2023年03月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-03 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 测试时长&#xff1a;90min 一、单选题(共10题&#xff0c;共30分) 1.编写一段程序&#xff0c;从26个英文字母中&#xff0c;随机选出10个加入列表a。空白处应填入的代码是&#xff1f;&#xff08;C&am…

Flink (十二) --------- Flink CEP

目录一、基本概念1. CEP 是什么2. 模式 (Pattern)3. 应用场景二、快速上手1. 需要引入的依赖2. 一个简单实例三、模式 API&#xff08;Pattern API&#xff09;1. 个体模式2. 组合模式3. 模式组4. 匹配后跳过策略四、模式的检测处理1. 将模式应用到流上2. 处理匹配事件3. 处理超…

【高项】项目整体管理、范围管理与进度管理(十大管理)

【高项】项目整体管理与范围管理 文章目录1、项目整体管理1.1 整体管理的过程1.2 制定项目章程&#xff08;启动&#xff09;1.3 制订项目管理计划&#xff08;规划&#xff09;1.4 指导与管理项目执行&#xff08;执行&#xff09;1.5 监控项目工作与实施整体变更控制&#xf…

Systemverilog中operators和expression的记录

1. Equality operators Equality operators有三种&#xff1a; Logical equality&#xff1a;, !&#xff0c;该运算符中如果运算数包含有x/z态&#xff0c;那么结果就是x态。只有在两边的bit都不包含x/z态&#xff0c;最终结果才会为0(False)或1(True)Case equality&#xf…

中云盾DDoS云防护系统

中云盾 DDoS 防护系统作为公司级网络安全产品&#xff0c;为各类业务提供专业可靠的 DDoS/CC 攻击防护。在黑客攻防对抗日益激烈的环境下&#xff0c; DDoS 对抗不仅需要 “降本” 还需要 “增效”。 为什么上云&#xff1f; 云原生作为近年来相当热门的概念&#xff0c;无论…

RHCE-NTP、SSH服务器

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间​ 服务器端&#xff1a; &#xff08;1&#xff09;首先安装chrony软件&#xff1a; dnf install -y chrony &#xff08;2&#xff09;配置时间同步源&#xff1a; 进入vim /etc/chrony.conf &#xf…

引用和指针

总结 引用&#xff1a; 因为引用是变量的别名&#xff0c;所以引用必须初始化 因为引用不存在自己的地址&#xff0c;所以指针不能指向引用&#xff0c;即不能定义引用的指针 因为引用不是对象&#xff0c;但是引用又要绑定一个对象&#xff0c;所以不能定义引用的引用 in…

一篇文章看懂C++三大特性——多态的定义和使用

目录 前文 一&#xff0c;什么是多态&#xff1f; 1.1 多态的概念 二&#xff0c; 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.3.1 虚函数重写的两个例外 2.4 C override 和 final 2.5 重载,重写(覆盖),隐藏(重定义)的区别 三&#xff0c;抽…