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

news2024/12/23 23:24:40

C++

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

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<<"I am running"<<endl;
}

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

class Car
{
public:
	int num;
	void run(){ 
		cout<<"I am 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、类的实例化

第一种实例化的方法:

class Car mycar;        //无参数,即便是class Car mycar();也不行 
class Car mycar(9);   //当构造器有参数时(假设参数是整形变量)

第二种实例化的方法:

Car mycar;        //无参数
Car mycar(9);    //当构造器有参数时(假设参数是整形变量)

由于第二种方法比较整洁,所以在实际运用中比较常用。那么接下来运用第二种实例化方法再来讲讲构造函数的隐式赋值。

Car mycar = 9;
Car mycar(9);

以上两句代码实现的效果是一样的,形式不同罢了。为了读起来方便,一般还是用Car mycar(9);这样的定义方式。

2.5、基类与子类

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

#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.6、类的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.7、类的方法的重载

这里其实和第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.8、子类方法的覆盖

子类再次声明一个和父类一模一样的方法,用以覆盖父类的方法。但值得注意的是,这里说的覆盖并不完全准确。当我们对父类进行实列化之后,再次调用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()
{
	Car my_car;
	MotorCycle my_motor;
	
	my_car.run();   //调用的是父类的run方法
	my_motor.run();  //调用的是子类的run方法

	return 0;
}

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

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

#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()
{
	Little_car mycar(888);
	
	return 0;
}

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

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

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

相关文章

再次理解Android账号管理体系

目录 ✅ 0. 需求 &#x1f4c2; 1. 前言 &#x1f531; 2. 使用 2.1 账户体系前提 2.2 创建账户服务 2.3 操作账户-增删改查 &#x1f4a0; 3. 源码流程 ✅ 0. 需求 试想&#xff0c;自己去实现一个账号管理体系&#xff0c;该如何做呢&#xff1f; ——————————…

竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…

2004-2020年中小企业板上市公司财务报表股票交易董事高管1200+变量数据及说明

2004-2020年中小企业板上市公司财务报表股票交易董事高管1200变量数据及说明 1、时间&#xff1a;2004-2020年 2、范围&#xff1a;中小企业板上市公司&#xff0c;具体名单参看下文链接内数据预览 3、指标&#xff1a;1200变量 变量说明、证券代码、证券代码-字符串、年份…

HTML基础标签 CSS选择器 JavaScript基础语法 WebAPI_ 页面设计 HTTP协议

第 1 题&#xff08;简答题&#xff09; 题目名称&#xff1a; 编写博客, 总结 HTML 中的常用标签用法 题目内容&#xff1a; 编写博客, 总结 HTML 中的常用标签用法 第 2 题&#xff08;简答题&#xff09; 题目名称&#xff1a; image 标签的 alt 和 title 属性有什么…

基于红黑树对map和set容器的封装

本章代码gitee仓库&#xff1a;map和set模拟实现、stl_map_set_tree源码 文章目录 &#x1f431;1. 红黑树的泛型&#x1f408;1.1 红黑树节点&#x1f408;1.2 红黑树迭代器&#x1f408;1.3 仿函数 &#x1f42f;2. 对set的封装&#x1f984;3. 对map的封装 &#x1f431;1. …

android获取设备的IMEI号

在Android 8.0 (API级别26)和更高版本的平台上的 &#xff0c;64位数字(表示为十六进制字符串)&#xff0c;对于应用程序签名密钥、用户和设备的每个组合都是唯一的。ANDROID_ID的值由签名密钥和用户限定作用域。如果在设备上执行出厂重置或如果APK签名密钥更改&#xff0c;则该…

【校招VIP】前端操作系统之存储管理加密

考点介绍 加密算法有很多&#xff0c;如不可逆的摘要算法MD5、SHA&#xff08;安全哈希算法&#xff09;&#xff0c;可逆的Base64编码&#xff0c;对称加密算法DES、AES&#xff0c;还有非对称加密算法DH、RSA等。那是不是说明我们可以使用任何一种加密算法就能保证网站的安全…

认养一头牛———众筹+合伙人商业模式解析

2016年成立以来&#xff0c;认养一头牛致力于打造数字化乳业第一品牌&#xff0c;只为一杯好牛奶。公司在创立三年内完成了10个亿销售目标&#xff0c;被业界称为新消费品牌黑马&#xff0c;一举闯入互联网新消费梯队的视线。未来三年&#xff0c;认养一头牛将着力打造全国最大…

【精品】将两个字符串进行加密和解密的Java工具类

原理 使用一个分隔符将两个字符串连接在一起&#xff0c;并对连接后的字符串进行加密。加密过程中&#xff0c;首先生成一个随机下标列表&#xff0c;然后根据随机下标打乱字符串的顺序&#xff0c;并使用Base64进行编码。解密过程中&#xff0c;根据之前生成的随机下标列表将…

Definition and properties of the Gamma function

See https://math.libretexts.org/Bookshelves/Analysis/Complex_Variables_with_Applications_(Orloff)/14%3A_Analytic_Continuation_and_the_Gamma_Function/14.02%3A_Definition_and_properties_of_the_Gamma_function 勒让德倍元公式&#xff08;Legendre duplication fo…

无涯教程-JavaScript - N函数

描述 N函数返回一个转换为数字的值。 语法 N (value) 争论 Argument描述Required/OptionalValue 要转换的值或对值的引用。 N转换下表中列出的值。 Required 值 N的返回值一个数字那个数字日期,采用Microsoft Excel中可用的内置日期格式之一该日期的序列号 TRUE 1 FALSE…

微视网媒:新媒体时代的宣传与营销新范式

随着数字科技的快速发展&#xff0c;新媒体已经成为了现代社会中不可或缺的一部分。其中&#xff0c;微视网媒作为新兴的网络媒体形态&#xff0c;正在改变着传统的宣传和营销模式&#xff0c;为企业和个人提供了全新的推广平台。本文将对微视网媒的优势、应用场景以及案例进行…

免费开箱即用的微鳄任务管理系统

编者按&#xff1a;基于天翎低代码平台实现的微鳄365任务管理系统&#xff0c;包括有发起任务、重点关注、日程、项目管理等功能&#xff0c;支持私有化部署&#xff0c;免费开箱即用。任务管理系统是组织工作中不可或缺的工具&#xff0c;可以提高工作效率、促进协作、增强任务…

GTS 中testPeakPssOfAllApps fail 详解

0. 前言 GTS 在测试 case armeabi-v7a GtsMemoryHostTestCases 的时候出现下面异常&#xff0c;本文总结一下。 com.google.android.memory.gts.AllAppsMemoryHostTest#testPeakPssOfAllApps 1. error log 09-14 10:16:34 I/TestFailureListener: FailureListener.testFaile…

第十届IEEE电气工程与自动化国际学术论坛(IFEEA 2023)

第十届IEEE电气工程与自动化国际学术论坛&#xff08;IFEEA 2023&#xff09; 2023 10th International Forum on Electrical Engineering and Automation IFEEA论坛属一年一度的国际学术盛会。因其影响力及重要性&#xff0c;IFEEA论坛自创建筹办以来&#xff0c;便受到国内…

【React】面试题5题

1. 说说你对 dangerouslySetInnerHTML 的理解 dangerouslySetInnerHTML是React中的一个属性&#xff0c;用于将HTML代码作为字符串直接插入到组件中的DOM元素中。它可以用来动态地生成HTML内容&#xff0c;但同时也带来了一些潜在的安全风险。 使用dangerouslySetInnerHTML时…

函数递归详解

前言&#xff1a; 函数递归是一种算法&#xff0c;递归是通过将问题分解为更小的子问题来解决问题的办法&#xff0c;递归的优点如下&#xff1a; 简洁性&#xff1a;递归可以用较少的代码实现复杂的功能灵活性&#xff1a;递归可以应对未知深度的数据结构&#xff0c;因为它不…

Spring MVC 中的数据绑定和验证机制是什么,如何使用

在 Spring MVC 应用中&#xff0c;数据绑定和验证是非常重要的一部分&#xff0c;它们可以帮助我们将用户提交的数据绑定到 Java 对象上&#xff0c;并对数据进行验证&#xff0c;保证数据的正确性和可靠性。在 Spring MVC 中&#xff0c;数据绑定和验证机制都是通过注解来实现…

Unity 课时 4 : No.4 模拟面试题

课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案&#xff1a; str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…

CentOS7 yum安装报错:“Could not resolve host: mirrorlist.centos.org; Unknown error“

虚拟机通过yum安装东西的时候弹出这个错误&#xff1a; 1、查看安装在本机的网卡 网卡ens33处于disconnected的状态 nmcli d2、输入命令&#xff1a; nmtui3、选择网卡&#xff0c;然后点击edit 4、移动到Automatically connect按空格键选择&#xff0c;然后移动到OK键按空格…