C++学习笔记(重载、类)

news2025/1/20 18:36:03

C++

  • 1、函数重载
  • 2、类
    • 2.1、类的方法和属性
    • 2.2、类的方法的定义
    • 2.3、构造器和析构器
    • 2.4、基类与子类
    • 2.5、类的public、protected、private继承
    • 2.6、类的方法的重载
    • 2.7、子类方法的覆盖
    • 2.8、继承中的构造函数和析构函数

1、函数重载

函数重载大概可以理解为,定义两个名字一模一样,但形参不一样的函数。通过传入参数可以判别具体执行哪一个函数。并且在这两个函数中,理论上可以执行截然不同的程序。
以下是一个简单的demo。

/* 
函数重载小实验——写一段代码求两个数或者三个数的平均值 
2023.9.7 
*/
#include <iostream>

using namespace std;

float average(float ,float ,float); 
float average(float ,float);

float average(float a,float b,float c)
{;
	return (a+b+c)/3;
}

float average(float a,float b)
{
	return (a+b)/2;
}


int main()
{
	int choice;
	float temp1,temp2,temp3;
	float result;
	
	cout<<"please choose two or three numbers"<<endl;
	cin >> choice;
	
	if (choice == 2)
	{
		cout<<"please enter two numbers:"<<endl;
		cin >> temp1 >> temp2;  
		result = average(temp1,temp2);
	}
	else if(choice == 3)
	{
		cout<<"please enter three numbers:"<<endl;
		cin >> temp1 >> temp2 >> temp3;
		result = average(temp1,temp2,temp3);	
	}
	else {cout<<"your input is wrong!"<<endl;} 
	
	cout<<"please result is:"<<result<<endl;
	
	return 0;
}

注:cin可以通过enter或tab来分割输入。

2、类

2.1、类的方法和属性

通过class定义一个叫car的类。类里面的变量就叫做属性,函数就叫做方法。

class car
{
public:
	int num;
	void run();		
};

2.2、类的方法的定义

在2.1中,我们声明了类中的有一个叫run的方法,但是具体到run函数里面到底在执行什么,还得再次定义一下。

void car::run(void)
{
	cout<<"running!"<<endl;
}

当然,如果类的方法中所实现的内容并不复杂,也大可在声明的时候直接定义了。如下:

class car
{
public:
	int num;
	void run(){ cout<<"running"<<endl; };		
};

2.3、构造器和析构器

Ⅰ、类的构造器是指,在实例化这个类之后,程序会先执行一个和类同名的方法。
Ⅱ、类的析构器是指,当类被被使用完毕之后,程序会自动执行一个名字为“类名字前加个~”的方法。
但如果像2.1那样,没有定义构造器和析构器,那程序其实也会去执行构造器和析构器里面的程序的,只是此时的程序为空。
注:实例化是将一个类变成一个实体,一个类可以被无限次实例化。

#include <iostream>

using namespace std;


class car
{
public:
	int num;
	car(int);   //构造器可以传输参数
	~car(void);  //析构器不可以传输参数
	void run();		
};

//构造器
car::car(int temp)
{
	num = temp;
	cout<<"this car's license number is:"<<num<<endl;
}

//析构器,本代码是在main函数执行结束后才调用析构器方法的。
car::~car(void)
{
	cout<<"end."<<endl;
}


void car::run(void)
{
	cout<<num<<" is running!"<<endl;
}


int main()
{
	class car mycar(666);    //构造器的参数在实例化的时候就得赋上了
	class car yourcar(888); //再次实例化一个类对象
	
	mycar.run();
	yourcar.run();
	
	return 0;
}

2.4、基类与子类

基类又称父类,也就说我们可以再定义一个类,继承父类的变量和方法。

#include <iostream>

using namespace std;


//父类 
class car
{
public:
	int num;
	void run();		
};

//子类 
class motorcycle:public car
{
public:
	void hand_brake();
};

//父类的run方法 
void car::run(void)
{
	cout<<"running"<<endl;
}

//子类的hand_brake方法 
void motorcycle::hand_brake(void)
{
	
	cout<<"notice! I'am using the hand brake!"<<endl;
}


int main()
{
	class motorcycle my_motor;
	my_motor.run();
	my_motor.hand_brake();

	return 0;
}

2.5、类的public、protected、private继承

public:可以被任何实体访问,也可以被子类访问,以及类的函数成员访问。

protected:不能被类的实体访问,但可以被子类访问,也可以类的函数成员访问。
private:不能被类的实体访问,不可以被子类访问,但可以被类的函数成员访问。

#include <iostream>
using namespace std;

//父类 
class car
{
public:
	int num;
	void run();	
protected:
	int test1;	
private:
	int test2;
};

//子类 
class motorcycle:public car
{
public:
	void hand_brake();
};

//父类的run方法 
void car::run(void)
{
	test1 = 1;   //✔ protected可以被类的函数成员访问
	test2 = 2;   //✔ private可以被类的函数成员访问
	
	cout<<"running"<<endl;
}

//子类的hand_brake方法 
void motorcycle::hand_brake(void)
{
	test1 = 1;   //✔ protected可以被子类的函数成员访问
	//test2 = 2;  × private不可以被子类的函数成员访问
	
	cout<<"notice! I'am using the hand brake!"<<endl;
}


int main()
{
	class motorcycle my_motor;
	my_motor.run();
	my_motor.num = 888;    //✔ public可以被实体访问
	//my_motor.test1 = 1;     × protected不可以被实体访问
	//my_motor.test2 = 2;     × private不可以被实体访问
	my_motor.hand_brake();

	return 0;
}

2.6、类的方法的重载

这里其实和第1章中的函数重载是一样的,只不过是类中定义两个名字一样的方法而已。

class car
{
public:
	void run();
	void run(int);	//定义两个同名的方法,一个有整形形参,一个没有。
};


void car::run(void)
{
	
	cout<<"running"<<endl;
}

void car::run(int temp)
{
	
	cout<<"speed running"<<endl;
}

2.7、子类方法的覆盖

子类再次声明一个和父类一模一样的方法,用以覆盖父类的方法。但值得注意的是,这里说的覆盖并不完全准确。当我们对父类进行实列化之后,再次调用run方法,执行依旧的父类中的run方法,而不是覆盖之后子类的run。这点从子类的函数成员可以调用父类的run方法也可以看出来。通过以下两段代码希望可以加强各位的理解。
代码一:

//父类
class car
{
public:
	void run();
};

//子类 
class motorcycle:public car
{
public:
	void run();
};

//父类的run方法 
void car::run(void)
{
	cout<<"running"<<endl;
}


//子类的run方法。
void motorcycle::run(void)
{
	car::run();         //子类的函数成员可以直接调用子类的方法
	cout<<"the motorcycle is running"<<endl;
}

代码二:

#include <iostream>

using namespace std;


//父类
class car
{
public:
	void run();
};

//子类 
class motorcycle:public car
{
public:
	void run();
};

//父类的run方法 
void car::run(void)
{
	cout<<"the car is running"<<endl;
}


//子类的run方法
void motorcycle::run(void)
{
	cout<<"the motorcycle is running"<<endl;
}



int main()
{
	class car my_car;
	class motorcycle my_motor;
	
	my_car.run();   //调用的是父类的run方法
	my_motor.run();  //调用的是子类的run方法

	return 0;
}

2.8、继承中的构造函数和析构函数

即便是子类继承继承父类,再对子类实例化之后,也是会执行父类的构造器和析构器。但如果想要子类也执行一下属于子类的构造器,则可以参考以下代码。至于子类的析构器,则正常定义即可。

#include <iostream>

using namespace std;

class Car
{
public:
	int temp1;
	Car(int num){
		cout<<"the license plate of this car is:"<<num<<endl; 
	} 
	~Car(void){
		cout<<"the father car haved terminated!!"<<endl;
	}
};

class Little_car:public Car
{
public:
	Little_car(int num):Car(num){           //注意子类的构造器的传入参数必须和父类构造器的传入参数一样
		cout<<"i am little car"<<endl;
	}
	~Little_car(void){
		cout<<"i am the destructor of the litte car"<<endl;
	}	
};


int main()
{
	class Little_car mycar(888);
	
	return 0;
}

输出结果:
在这里插入图片描述

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

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

相关文章

Rethink LSTMGRU

LSTM 设计思想 姑且不看偏置。 W W W 和 U U U 是加权的矩阵&#xff0c;写模型的时候用 nn.Linear(in_dim, out_dim) 就成&#xff1b; σ \sigma σ 是 Sigmoid 函数 第一条&#xff0c;遗忘门&#xff0c;定义为 有多少内容需要被遗忘&#xff1b;第二条&#xff1a;输入门…

ES8生产实践——pod日志采集(Fluentd方案)

Fluentd介绍 Fluentd是一个是一个开源的日志收集和传输工具&#xff0c;旨在解决日志数据的收集、传输和处理问题&#xff0c;它可以收集来自于各种系统或应用的日志&#xff0c;转化为用户指定的格式后&#xff0c;转发到用户所指定的日志存储系统之中。 用图来说明问题的话&…

【安装mysql(基础安装+主从复制)】

由于我的 centos 版本是 aarch64 版本 安装链接&#xff1a; 1、aarch64 版本 linux 系统安装 mysql 2、安装完成之后是不能用 navicat 进行直接访问的&#xff0c;需要如下设置&#xff1a; mysql -uroot -proot&#xff08;明文登陆&#xff0c;记得 -uroot 和 -proot之间…

Redis 基础总结

1、NoSQL概述 1.1 数据库分类 目前数据库分&#xff1a;关系型数据库与非关系型数据库 常用的关系型数据库&#xff1a; Oracle&#xff0c;MySQL&#xff0c;SqlServer&#xff0c;DB2 常用的非关系数据库&#xff1a;Redis&#xff0c;MongoDB&#xff0c;ElasticSearch&…

MIT 6.S081学习笔记(第一章)

〇、前言 本章主要是关于实验环境的搭建和完成 LAB UTIL。 平台&#xff1a;阿里云 Ubuntu20.04VScode on macOS&#xff08;M1 Apple Silicon&#xff09;。 一、环境搭建 1、QEMU QEMU&#xff08;quick emulator&#xff09;是一款由法布里斯贝拉&#xff08;Fabrice Bel…

C++中多态的底层实现

1.先来看一波比较容易出错的题 会打印出来什么&#xff1f; 其实打印出来的是B->1;为什么呢&#xff1f;看我如何讲解的。 2.思考为什么只有引用或则指针才能触发多态 结论&#xff1a;子类赋值给父类对象切片&#xff0c;不会拷贝虚标 我听老师上面的解释是&#xff1a;如…

敏捷工具敏捷项目管理实践管理

​Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交付最大价值。 Leangoo领歌是一款永久免费的专业敏捷研发管理工具&#xff0c;提供敏捷研发解决方案&#xff0c;解决研发痛点&#xff0c;打造成功…

STM32低功耗分析

1.ARM发布最新内核 2023 年5 月 29 日&#xff0c;Arm 公司今天发布了处理器核心&#xff1a;Cortex-X4、Cortex-A720 和Cortex-A520。这些核心都是基于 Arm v9.2 架构&#xff0c;只支持 64 位指令集&#xff0c;不再兼容 32 位应用。Arm 公司表示&#xff0c;这些核心在性能…

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…

Python 之使用Numpy库来加载Numpy(.npy)文件并检查其内容

文章目录 总的介绍data.dtypedata.shapedata.ndimdata.size 总的介绍 要判断一个Numpy&#xff08;.npy&#xff09;文件的数据集类型&#xff0c;你可以使用Python中的Numpy库来加载该文件并检查其内容。以下是一些常见的步骤&#xff1a; 导入Numpy库&#xff1a; 首先&…

【关于存储故障的维修心得】

工具 分享&#xff1a;傲梅分区助手 和 DiskGenius https://www.diskgenius.cn/ https://www.disktool.cn/download.html 傲梅 1&#xff0c;想要不改变文件的情况下&#xff0c;改变某些盘的大小&#xff0c;如C盘&#xff0c;Win11有概率磁盘管理 工具不能压缩卷 扩展卷。…

Idea中如何在一个项目中引入其他子模块?

首先在Settings打开Project Structure&#xff0c;然后找到Modules&#xff0c;点击加号点击import module&#xff0c;将需要引进的module引进来。 然后点击Artifacts 可以看到比如说day22…这个是我现在的项目&#xff0c;day16是我需要引入的。那么就在红色横线上面右键点第…

第六章 图 五、图的深度优先遍历(DFS算法)

目录 一、定义 深度优先遍历通常用于解决以下问题&#xff1a; 深度优先遍历算法具有以下优点&#xff1a; 深度优先遍历算法的一个缺点是&#xff1a; 二、代码 空间复杂度&#xff1a; 时间复杂度&#xff1a; 邻接矩阵存储&#xff1a; 邻接表存储&#xff1a; 三、…

[Qt]基础数据类型和信号槽

文章目录 1. Qt基本结构1.1 Qt本有项目1.1.1 项目文件&#xff08;.pro&#xff09;1.1.2 main.cpp1.1.3 mainwindow.ui1.1.4 mainwindow.h1.1.5 mainwindow.cpp 1.2 Qt中的窗口类1.2.1基础窗口类1.2.2 窗口的显示 1.3 内存回收 2. Qt中的基础数据类型2.1 基础类型2.2 log输出2…

用postman 推送消息到GCP的pubsub

创建1个Topic 和 2个 subscription 我们可以用terraform 去创建1个topic 和 2个subscriptions # topic resource "google_pubsub_topic" "topic_a" {name "TopicA"project var.project_id }# subscriptions resource "google_pubsub_s…

C++环境配置(MinGW下载)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Tomcat配置域名和端口

Tomcat配置域名和端口 1.进入tomcat文件夹2. cd 到你的tomcat下3. 修改server.xml文件中监听端口4. 重启tomcat 1.进入tomcat文件夹 2. cd 到你的tomcat下 3. 修改server.xml文件中监听端口 继续修改server.xml中Host 4. 重启tomcat 进入bin ./shutdown.sh ./startup.sh …

Hilbert-Schmidt Operator

Hilbert-Schmidt Operator See https://mathworld.wolfram.com/Hilbert-SchmidtOperator.html See https://people.kth.se/~laptev/FA08/l8.pdf

Spring Boot集成JasperReport生成文档

由于工作需要&#xff0c;要实现后端根据模板动态填充数据生成PDF文档&#xff0c;通过技术选型&#xff0c;使用Ireport5.6来设计模板&#xff0c;结合JasperReports5.6工具库来调用渲染生成PDF文档。 一、使用Ireport designer 5.6设计模板 ireport的使用由于时间关系不便多…

php-fpm未授权访问漏洞

目录 一、产生原因 二、利用条件 三、过程原理 四、复现过程 一、产生原因 php-fpm配置不当&#xff0c;fastcgi_pass这里配置了0.0.0.0&#xff0c;将fastcgi接口暴露在公网&#xff0c;任何人都可以利用接口对php-fpm发送fastcgi协议数据&#xff0c;更改php.ini配置文件…