C++类的学习1

news2024/11/17 9:45:16

类的定义一般包括两部分,一是类的属性,二是他所拥有的方法。类的实例化是指给类的加载并初始化过程,比如一个people类,我们具体到每一个人就是类的实例化,此外一个类可以在此类上进行扩展。比如people类,我们分为  外国people   和   中国people,那么people叫做基类,外国people叫做派生类或子类

1.C++类的定义

C++使用class关键字定义一个类:

public:公共的行为或属性(类外可以调用);

private:表示该部分内容是私密的,不能被外部访问或调用,只能在类内调用;

protected:保护成员,和私有成员类似,不过在派生类可以调用;

比如我们建立一个people类

#include <iostream>
using namespace std;
class people{
	public:
		void a(){
			cout<<name;
		}
	private:
		string name="小明";
		void b(){
			cout<<"dsfsfds";  //不必在意;
		}
}; 
int main(){
	people cao;   //实例化
	cao.a();
	return 0;
} 

 

类的传参,比如我们要传入人的身高和体重,可以通过一个函数传入,传给私有变量;

#include <iostream>
using namespace std;
class people{
	public:
		void a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		void chuanru(int x,int y){   
//x,y是函数内的的变量,因此需要赋值给整个类的变量,作用域不同
			height=x;
			weight=y;
		} 
	private:
		string name="小明";
		int height;
		int weight; 
}; 
int main(){
	people cao;
	cao.chuanru(170,130);
	cao.a();
	return 0;
} 

 此外类内的函数或者方法可以放到类外面,需要先在类内声明函数,通过“::”作用域操作符实现例如:

#include <iostream>
using namespace std;
class people{
	public:
		void a();
		void chuanru(int x,int y);   //函数声明
	private:
		string name="小明";
		int height;
		int weight; 
}; 

void people::a(){           //表面是people的a函数
			cout<<name<<' '<<height<<' '<<weight;
		}
void people::chuanru(int x,int y){
			height=x;
			weight=y;
		} 
		
int main(){
	people cao;
	cao.chuanru(170,130);
	cao.a();
	return 0;
} 

 2.初识构造函数和析构函数

先不管那些拷贝构造函数和转换构造函数,我们先学习普通的,

#include <iostream>
using namespace std;
class people{
	public:
		people(int x=8,int y=9){    //构造函数,可以设置默认值
			height=x;
			weight=y;
		}
		void a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
	private:
		string name="小明";
		int height;
		int weight; 
}; 
int main(){
	people cao(170,130);   //构造函数传参,
	cao.a();
	return 0;
} 

 同理构造函数也可以放到类外面

#include <iostream>
using namespace std;
class people{
	public:
		people(int x,int y);
		void a();
		
	private:
		string name="小明";
		int height;
		int weight; 
}; 

people::people(int x=9,int y=8){    //类内或类外只能有一个地方初始化
			height=x;
			weight=y;
		}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
int main(){
	people cao(170,130);
	cao.a();
	return 0;
} 

构造函数用来初始化类,析构函数与构造函数相反;在对象生命周期结束后自动调用,用于在对象删除之前的清理工作,清理对象释放内存;

#include <iostream>
using namespace std;
class people{
	public:
		people(int x,int y);
		void a();
		~people();
	private:
		string name="小明";
		int height;
		int weight; 
}; 

people::people(int x=9,int y=8){
			height=x;
			weight=y;
		}
people::~people(){
	
}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
int main(){
	people cao(170,130);
	cao.a();
	return 0;
} 

是生命周期结束,举个例子:

#include <iostream>
using namespace std;
class people{
	public:
		people(string n,int x,int y); 
		void a();
		~people();
	private:
		string name;
		int height;
		int weight; 
}; 

people::people(string n,int x=9,int y=8){
			name=n;
			height=x;
			weight=y;
			cout<<name<<' '<<"调用构造函数"<<endl; 
		}
people::~people(){
	cout<<name<<' '<<"调用析构函数"<<endl; 
}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight<<endl;;
		}
void shiyan(){
	people lin("小刚",180,190);
}	
int main(){
	people cao("小明",170,130);
	shiyan();
	cout<<"main还没结束!"<<endl; 
	return 0;
} 

小明是在main函数内,小刚是在shiyan()函数内,调用完shiyan() 函数后小刚生命周期结束,调用小刚的析构函数,而小明是等到main函数结束后调用析构函数; 

其实构造函数还有初始化列表形式:

#include <iostream>
using namespace std;
class people{
	public:
		people(int x,int y);   //构造函数
		void a();
		~people();            //析构函数
	private:
		string name="小明";
		int height;
		int weight; 
}; 

people::people(int x=9,int y=8):height(x),weight(y){}	   //初始化列表		
people::~people(){
	
}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
int main(){
	people cao(170,130);
	cao.a();
	return 0;
} 

想知道构造函数怎样工作的吗?

我来告诉你

首先我们来看定义未知数的顺序;

 我们先定义height,在定义weight,那么构造函数是按照先初始化height在初始化weight的顺序构造的,并不是按照构造函数的顺序,举个例子:

#include <iostream>
using namespace std;
class people{
	public:
		people(int x);
		void a();
		~people();
	private:
		string name="小明";
		int height;
		int weight; 
}; 

people::people(int x=9):height(x),weight(height){}	 
//先初始化height,再将height赋值给weight		
people::~people(){
	
}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
int main(){
	people cao(170);
	cao.a();
	return 0;
} 

#include <iostream>
using namespace std;
class people{
	public:
		people(int x);
		void a();
		~people();
	private:
		string name="小明";
		int height;
		int weight; 
}; 

people::people(int x=9):height(weight),weight(x){}	
//先初始化height,但height依赖于weight,由于weight没有初始化,所以出现错误;
people::~people(){
	
}
void people::a(){
			cout<<name<<' '<<height<<' '<<weight;
		}
		
int main(){
	people cao(170);
	cao.a();
	return 0;
} 

 

  3.类的继承

子承父业吗,子类继承父类,分为三种继承方式;

(1)公共继承:父类的公共属性在子类还是公共属性,保护属性还是保护属性,私有属性子类访                              问不到

(2)保护继承:父类的公共属性和保护属性在子类中都变为保护属性;私有还是访问不到

(3)私有继承:父类的公共属性在子类变为保护属性,父类的保护属性变为私有属性,私有访问                             不到;

举例说明:

(1)公共继承:

#include <iostream>
using namespace std;
class father{
	public:
		string a="father 公共";
	protected:
		string b="father 保护";
	private:
		string c="father 私有";
};

class son:public father{
	public:
//		string a="son 公共";
//		string b="son 保护";
//		c="son 私有"; 

	void dain(){
		cout<<a<<endl<<b<<endl<<endl;
//		cout<<c;  //报错 
	}
};
int main(){
	son linyuan;
	linyuan.dain();
	cout<<linyuan.a<<endl; 
//	cout<<linyuan.b<<endl;    //报错 
	return 0;
}

 (2)保护继承

#include <iostream>
using namespace std;
class father{
	public:
		string a="father 公共";
	protected:
		string b="father 保护";
	private:
		string c="father 私有";
};

class son:protected father{
	public:
//		string a="son 公共";
//		string b="son 保护";
//		c="son 私有"; 

	void dain(){
		cout<<a<<endl<<b<<endl<<endl;
//		cout<<c;  //报错 
	}
};
int main(){
	son linyuan;
	linyuan.dain();
//	cout<<linyuan.a<<endl; 
//	cout<<linyuan.b<<endl;    //报错 
	return 0;
}

 (3)私有继承

#include <iostream>
using namespace std;
class father{
	public:
		string a="father 公共";
	protected:
		string b="father 保护";
	private:
		string c="father 私有";
};

class son:private father{
	public:
//		string a="son 公共";
//		string b="son 保护";
//		c="son 私有"; 

	void dain(){
		cout<<a<<endl<<b<<endl<<endl;
//		cout<<c;  //报错 
	}
};
int main(){
	son linyuan;
	linyuan.dain();
//	cout<<linyuan.a<<endl; 
//	cout<<linyuan.b<<endl;    //报错 
	return 0;
}

那么继承方式讲完了,其实C++类还支持同时继承多个类例如;

#include <iostream>
using namespace std;
class father1{
	public:
		string name1;
		father1(){
			name1="小刚"; 
		}
};

class father2{
	public:
		string name1;
		father2(){
			name1="小明"; 
		}
};

class son:public father1,public father2{
	public:
		string name1;
		son(){
			name1="木木渊"; 
		}
		
}; 
int main(){
	son a;
	cout<<a.name1<<endl;
	cout<<a.father1::name1<<endl;
	cout<<a.father2::name1;
		
} 

派生类和父类继承元素重名时可以通过命名空间来分别 ,函数也是如此实现多继承;

接下来我们看一下析构函数的情况;

#include <iostream>
using namespace std;
class father1{
	public:
		string name1;
		father1(){
			cout<<"father1 构造函数"<<endl; 
			name1="小刚"; 
		}
		~father1(){
			cout<<"father1 析构函数"<<endl; 
		}
};

class father2{
	public:
		string name1;
		father2(){
			name1="小明"; 
			cout<<"father2 构造函数"<<endl; 
		}
		~father2(){
			cout<<"father2 析构函数"<<endl; 
		}
};

class son:public father1,public father2{
	public:
		string name1;
		son(){
			name1="木木渊"; 
			cout<<"son 构造函数"<<endl;
		}
		~son(){
			cout<<"son 析构函数"<<endl; 
		}
		
}; 
int main(){
	son a;
	cout<<"main 要结束了"<<endl; 
		
} 

 很明显son先继承father1,在继承father2,因此构造函数先是father1,再father2,最后son,析构函数正好相反;

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

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

相关文章

vue项目使用luckyexcel预览excel表格

场景 最近工作中在开发文档上传并能在新窗口打开预览的功能。在此记录下心路历程。 方法 我总共尝试了2种方法预览excel&#xff0c;均可实现。还发现一种方法可以实现&#xff0c;需要后端配合&#xff0c;叫做KKfileview。 1.使用luckyexcel插件实现xlsx的预览 2.使用fi…

组合式升降压PFC的分析方法

1. 组合式升降压PFC的基本原理 组合式升降压PFC采用两组储能元件&#xff0c;基本单元为Cuk&#xff0c;Sepic和Zeta。参考论文《New Efficient Bridgeless Cuk Rectifiers for PFC Applications》中的三种拓扑进行分析。   Cuk型PFC的TypeI如下图所示&#xff0c;正半周Dp一…

Jef-log-tail日志采集工具使用说明

介绍 jef-log-tail是一款基于netty实现的日志采集工具&#xff0c;支持指定目录、指定文件、指定后缀的动态持续日志采集&#xff0c;日常使用场景如&#xff1a;集群部署后将多台主机的日志集中存放到一台日志服务器上&#xff0c;或者将日志统一输出到数据库、redis、kafka、…

STM32实战项目-温湿度传感器

程序功能&#xff1a; 1、软件模拟I2C协议与SHT30数字温湿度传感器通讯&#xff1b; 2、数码管显示环境温湿度&#xff1b; 3、串口打印环境温湿度。 目录 一、硬件电路 二、技术讲解 2.1IIC简介 2.2 IIC总线协议 2.2设备接入 三、SHT30数字温湿度传感器 3.1性能介绍 …

Rollup 实践:插件生态和实用技巧(续)

在前面的文章中&#xff0c;我们已经了解了 Rollup 的性能优化和高级用法。本篇文章将继续探讨 Rollup 的插件生态和实用技巧。 插件生态 Rollup 拥有一个丰富的插件生态&#xff0c;下面我们介绍几个实用的插件&#xff1a; rollup-plugin-terser&#xff1a;使用 Terser 压…

FlowForge 使用教程 团队资源管理

前言 本篇文章结合FF的操作来给大家解释一下,FF在团队管理上都与那些资源可以操作。 团队创建 使用超管第一次登录FF平台,默认什么资源都没有,你只能先去创建一个团队才能继续往下操作。 在FF平台上,团队就代表一个租户,也是一种资源隔离的手段。 创建团队可以通过右上…

Rollup 实践:性能优化和高级用法(续)

在前面的文章中&#xff0c;我们已经了解了 Rollup 的基本概念和配置。本篇文章将继续探讨 Rollup 的性能优化和高级用法。 懒加载 通过 Rollup 的代码分割功能&#xff0c;我们可以实现懒加载&#xff0c;从而减小初始页面加载时间。假设我们有一个动态导入的模块 dynamic.j…

vue项目用后端返回的文件流实现docx和pdf文件预览

前端docx和pdf文件预览实现效果图docx-preview文件预览pdf文件预览写这篇文章的目的&#xff0c;是因为我比较懒&#xff0c;想把代码记录一下&#xff0c;方便日后使用&#xff1b;哈哈&#xff0c;如果你也需要&#xff0c;也可以复制粘贴啊&#xff0c;为了方便自己和需要的…

windows10开发环境下部署kafka消息服务

下载kafka&#xff0c;官方地址https://kafka.apache.org/downloads 百度网盘链接&#xff1a;https://pan.baidu.com/s/1h3iXtfzEIBoajGPId5Dcag?pwd0000 提取码&#xff1a;0000直接把下载的文件解压到某个盘的根目录&#xff0c;要不然后面的命令就会遇到“命令行过长”的报…

linux 系统的一些使用小技巧

实现RedHat非正常关机的自动磁盘修复 先登录到服务器&#xff0c;然后在/etc/sysconfig里增加一个文件autofsck,内容如下&#xff1a; AUTOFSCK_DEF_CHECKyes PROMPTyes 改变文件或目录之最后修改时间(变为当前时间) 执行格式&#xff1a;touch name ( name 可为文件或目录名称…

Matlab vs Python:哪个更适合数据分析和可视化?

当谈到数据分析和可视化时&#xff0c;许多人会思考使用哪种编程语言来实现这一目标。在IT行业&#xff0c;最流行的两种编程语言是Matlab和Python。这两种语言都有广泛的应用&#xff0c;但是对于初学者来说&#xff0c;选择哪种语言可能会有些困难。在本文中&#xff0c;我们…

【ENVI】监督分类

好久没用ENVI了&#xff0c;用起来有点生疏&#xff0c;这里记录一下操作流程。。。 基础数据&#xff1a;从91卫图下载相应地区影像数据。 下载影像推荐&#xff1a;地理空间数据云、91卫图、水经注等。 1、加载tif数据 2、样本选择 &#xff08;1&#xff09;在图层管理器…

Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来计算相机的实时帧率&#xff08;C#&#xff09;Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率计算方式在BufferEvent声明显示FrameID设计显示帧率的函数Baumer工业相机通过BGAPI SDK计算帧率的优势​B…

亚马逊云科技:智能家居时代已来,如何抢滩海外市场的“真空区”?

在充满着不确定性的2022年&#xff0c;电子消费市场一片哀鸿遍野&#xff0c;智能家居行业却如同逆水行舟&#xff0c;显示出稳健的发展之势&#xff0c;宣告着智能家居时代已来。在2023年3月24日举办的“智能家居&#xff0c;出海闭门会”上&#xff0c;为进一步发挥产业带潜力…

微前端--qiankun原理概述

demo放最后了。。。 一、微前端 一》微前端概述 微前端概念是从微服务概念扩展而来的&#xff0c;摒弃大型单体方式&#xff0c;将前端整体分解为小而简单的块&#xff0c;这些块可以独立开发、测试和部署&#xff0c;同时仍然聚合为一个产品出现在客户面前。可以理解微前端是…

2023.04.16 学习周报

文章目录摘要文献阅读1.题目2.摘要3.简介4.Dual-Stage Attention-Based RNN4.1 问题定义4.2 模型4.2.1 Encoder with input attention4.2.2 Decoder with temporal attention4.2.3 Training procedure5.实验5.1 数据集5.2 参数设置和评价指标5.3 实验结果6.结论MDS降维算法梯度…

亚马逊listing如何提高?测评要满足什么条件?

为什么有些大卖就可以卖得很好&#xff0c;而有些卖家始终都做不起来&#xff1f;其中的影响因素之一就是listing&#xff0c;listing页面做得好&#xff0c;转化率自然就提高了。而这其中的原理还需要卖家去具体了解亚马逊的算法。 首先来看一下亚马逊最大的流量搜索&#xf…

第十三届蓝桥杯Web组国赛真题 开学礼物大放送

介绍 又是一年开学季&#xff0c;蓝桥为大家准备了开学礼物&#xff0c;想制作一个页面来宣传一下该活动。 本题需要按照要求完成一个以“开学季”为主题的页面布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├─…

微服务-微服务为什么要用到 API 网关

什么是微服务 微服务架构&#xff08;通常简称为微服务&#xff09;是指开发应用所用的一种架构形式。通过微服务&#xff0c;可将大型应用分解成多个独立的组件&#xff0c;其中每个组件都有各自的责任领域。 在处理一个用户请求时&#xff0c;基于微服务的应用可能会调用许多…

C语言标准CRC-16校验函数

C语言标准CRC-16校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。获得的校验码是随数据绑定获得。 CRC校验原理及标准CRC-8校验函数可参考&#xff1a;C语言标准CRC-8校验函数。…