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

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的地址空间一样!!!

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

相关文章:

  • 3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展
  • QT--基础
  • C++编程:实现简单的高精度时间日志记录小程序
  • 【ChatGPT】Python 实现计算两线段的变换矩阵
  • 【virtuous】ron与rout的区别
  • css 数字比汉字要靠上
  • DTOF(direct Time-of-Flight,直接飞行时间)
  • 【C++】继承,菱形继承,虚拟继承,组合详解
  • WebAssembly与WebGPU:游戏开发的新时代
  • 代码随想录训练营第45天|编辑距离
  • 如何构建鲁棒高性能 Prompt 的方法?
  • IIS HTTPS 网页可能暂时无法连接,或者它已永久性地移动到了新网址 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
  • docker简单熟悉
  • 技术分享|一文读懂三维建模技术
  • 18年408数据结构
  • [Vue CLI 3] 配置解析之 css.extract
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ES6 学习笔记(一)let,const和解构赋值
  • git 常用命令
  • Java编程基础24——递归练习
  • mysql 数据库四种事务隔离级别
  • Spring Boot MyBatis配置多种数据库
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 阿里云应用高可用服务公测发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 闭包,sync使用细节
  • 测试如何在敏捷团队中工作?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 那些被忽略的 JavaScript 数组方法细节
  • 怎么把视频里的音乐提取出来
  • # centos7下FFmpeg环境部署记录
  • #NOIP 2014#Day.2 T3 解方程
  • #pragma预处理命令
  • $jQuery 重写Alert样式方法
  • (LLM) 很笨
  • (笔记)M1使用hombrew安装qemu
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Framework 3.5安装教程
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net 高效开发之不可错过的实用工具
  • .net 怎么循环得到数组里的值_关于js数组
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net7 环境安装配置
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET未来路在何方?
  • .Net中ListT 泛型转成DataTable、DataSet
  • @RestController注解的使用
  • [20150629]简单的加密连接.txt
  • [22]. 括号生成
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!