当前位置: 首页 > article >正文

C++那些你不得不知道的(2)

C++那些你不得不知道的(2)

1、缺省参数在使用的遍历

(1)以下是实现顺序表的初始化和检查容量空间的方式:

void Init(list* ps)
{
	ps->arr = NULL;
	ps->Capacity = ps->size = 0;
}

void CheckCapacity(list* ps)
{
	assert(ps);
	if (ps->size == ps->Capacity)
	{
		std::cout << "扩容" << std::endl;
		int newCapacity = ps->Capacity == 0 ? 4 : 2 * ps->Capacity;
		int* temp = (int*)realloc(ps->arr, sizeof(int) * newCapacity);
		if (temp == NULL)
		{
			perror("malloc fail!");
			exit(1);
		}
		ps->Capacity = newCapacity;
		ps->arr = temp;
	}
}

在这里插入图片描述

我们知道:多次扩容会消耗内存空间和时间,造成程序的效率低下!

(2)引入C++的缺省参数之后的改良代码:

typedef struct list
{
	int* arr;
	int size;
	int Capacity;
}list;

void Init(list* ps,int size=4)
{
	ps->arr = (int*)calloc(sizeof(int) ,size);
	ps->Capacity = size;
	ps->size = 0;
}

void CheckCapacity(list* ps)
{
	assert(ps);
	if (ps->size == ps->Capacity)
	{
		std::cout << "扩容" << std::endl;
		int newCapacity = ps->Capacity == 2 * ps->Capacity;
		int* temp = (int*)realloc(ps->arr, sizeof(int) * newCapacity);
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		ps->Capacity = newCapacity;
		ps->arr = temp;
	}
}

void listpush(list* ps, int x)
{
	assert(ps);
	CheckCapacity(ps);
	ps->arr[ps->size++] = x;
}

void test01()
{
	list s;
	Init(&s, 100);
	for (int i = 0 ; i < 100; i++)
	{
		listpush(&s, i);
	}
	
}

通过缺省参数的使用,我们就避免了多次动态开辟内存空间造成的缓存浪费和效率低下问题!

2、函数重载及其作用

(1)函数重载的定义:

C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形式参数(形参)不同----(形式参数的类型不同/参数个数不同)。 例如:

#include<iostream>

void Swap(int* x,int* y)
{
	int temp=*x;
	*x=*y;
	*y=temp;
}

void Swap(double* x,double* y)
{
	double temp=*x;
	*x=*y;
	*y=temp;
}

int main()
{
	int a=0,b=1;
	double c=0.2,d=1.5;
	Swap(&a,&b);
	Swap(&c,&d);
	return 0;
}

在这里,我们使用了同名函数Swap,但是函数的参数类型不同:一个参数为Swap(int* x,int* y),一个参数为Swap(double* x,double* y)。这样,我们就不用为Swap取其他函数名,能够使代码的可读性提高!!!

(2)函数重载的类型:

①参数类型不同

②参数个数不同

③参数类型顺序不同(本质还是参数类型不同)

!!!注意:返回值不同不能作为重载条件(因为调用时无法区分)

下面举例虽然满足函数重载条件,但是使用起来有歧义的代码:

#include<iostream>

void f()
{
	std::cout<<"f()"<<std::endl;
}

void f(int a=10)
{
	std::cout<<"f(int a=10)"<<std::endl;
}

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

这里调用的时候就会出现歧义,编译器无法分辨出该调用哪个函数,造成歧义,报错!

3、引用

(1)引用的概念和定义:引用是给一个已存在的变量取一个别名,编译器不会为引用变量重新开辟空间,而是与引用变量共用一块内存空间。

(2)形象表示:引用相当于水浒传中林冲的别名是“豹子头”一样,其真实的名字都是林冲这个人!

(3)引用方法:类型 & 引用别名 = 引用对象。 例如:

#include<iostream>

int main()
{
	int a=10;
	int& b=a;
    std::cout<<&a<<std::endl;
    std::cout<<&b<<std::endl;
}

这里的b和a共用一块内存空间,即a的别名是b,a和b的地址空间一样!!!

如果大家喜欢这篇文章,欢迎品读,留言,点赞,谢谢!!!
#include<iostream>

int main()
{
	int a=10;
	int& b=a;
    std::cout<<&a<<std::endl;
    std::cout<<&b<<std::endl;
}

这里的b和a共用一块内存空间,即a的别名是b,a和b的地址空间一样!!!

如果大家喜欢这篇文章,欢迎品读,留言,点赞,谢谢!!!

http://www.kler.cn/news/323531.html

相关文章:

  • .NET 控制台应用程序连接 MySQL 数据库实现增删改查
  • mysql数据库设置主从同步
  • 自动驾驶电车难题的康德式道德决策
  • 黑马头条day6-kafka及异步通知文章上下架
  • Spring 全家桶使用教程 —— 后端开发从入门到精通
  • C#——switch案例讲解
  • 计算机毕业设计 校园失物招领网站的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版
  • 【论文写作】描述一个模型比另一个模型效果好时
  • sentinel原理源码分析系列(二)-动态规则和transport
  • 如何在openEuler上安装和配置openGauss数据库
  • linux编辑文件保存退出的实操讲解
  • JVM基本了解
  • 神经网络激活函数
  • RabbitMQ 高级特性——重试机制
  • 【前端面试题】Vue 3 生命周期钩子的执行顺序详解
  • 2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡
  • Supervisor进程管理工具安装
  • Python爬虫获取指定内容
  • django drf 统一处理操作人和时间字段
  • leetcode-238. 除自身以外数组的乘积-前n项的思想
  • 一键降重:芝士AI如何简化论文查重过程?
  • 05-成神之路_ambari_Ambari实战-013-代码生命周期-metainfo-configFiles详解
  • 【第十六章:Sentosa_DSML社区版-机器学习之生存分析】
  • sql server每天定时执行sql语句
  • 【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码
  • 浅谈软件安全开发的重要性及安全开发实践
  • NSSCTF [SWPUCTF 2021 新生赛]非常简单的逻辑题
  • CodeFormer模型构建指南
  • 网络安全TARA分析