C++初阶——基础知识(函数重载与引用)

目录

1.命名冲突

2.命名空间

3.缺省参数

4.函数重载

1.函数重载的特点包括:

2.函数重载的好处包括:

3.引用

引用的特点包括

引用的主要用途包括

引用和指针

引用

指针


类域

命名空间域

局部域

全局域

第一个关键字

命名冲突

同一个项目之间冲突

  预作用限定符::

命名空间

缺省参数

1.命名冲突

指在同一个项目中出现了命名冲突的情况。为了避免命名冲突,可以使用预作用限定符(::)进行限定。

2.命名空间

是一种组织代码的机制,用于避免不同模块或库之间的命名冲突。命名空间可以将代码进行逻辑上的分组,并提供了一种层次化的命名结构。

3.缺省参数

指在函数或方法定义时给参数设置默认值,使得在调用时可以不传递该参数的值。这样做可以增加函数的灵活性和可重用性。

4.函数重载

函数重载是指在同一个作用域内定义多个相同名称但参数列表不同的函数。通过函数重载,可以根据传入的参数类型或数量的不同来调用不同的函数。

1.函数重载的特点包括:

  1. 函数名称相同:重载的函数必须使用相同的名称。
  2. 参数列表不同:重载的函数必须有不同的参数列表,可以是参数类型不同、参数数量不同或参数顺序不同。
  3. 返回值类型不影响重载:函数的返回值类型对函数重载没有影响,只有参数列表不同才能实现重载。

2.函数重载的好处包括:

  1. 提高代码的可读性:通过使用相同的函数名称,可以更直观地表示函数的功能和意图。
  2. 简化函数调用:不需要记住多个不同名称的函数,只需根据不同的参数类型或数量调用相同的函数名称。
  3. 增加代码的灵活性:可以根据不同的需求设计适用于不同情况的函数。

需要注意的是,在进行函数重载时,编译器会根据调用时的参数类型或数量匹配最合适的函数进行调用。如果存在多个函数都能匹配到调用条件,编译器会选择最精确匹配的函数进行调用。如果出现无法唯一确定调用的情况,编译器会报错。因此,在进行函数重载时,需要保证函数之间的参数列表能够明确区分。

下面是一个使用函数重载的示例代码

#include <iostream>
using namespace std;int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}int add(int a, int b, int c) {return a + b + c;
}int main() {int x = 1, y = 2, z = 3;double u = 1.5, v = 2.5;cout << add(x, y) << endl; // 调用add(int, int)函数cout << add(u, v) << endl; // 调用add(double, double)函数cout << add(x, y, z) << endl; // 调用add(int, int, int)函数return 0;
}

在这个例子中,我们定义了三个同名但参数列表不同的add函数,分别接受两个整型参数、两个浮点型参数和三个整型参数。在main函数中,我们分别调用了这三个函数,并根据传入的参数类型来选择调用哪个函数。由于函数重载的存在,编译器可以根据传入的参数类型自动选择最适合的函数进行调用。

&取地址

3.引用

在编程中,引用是指通过使用已有变量的别名来访问该变量的值或者修改它。引用提供了一种方便的方式来操作变量,而无需直接访问内存地址。

引用的特点包括

  1. 别名:引用是变量的别名,它与原变量共享同一块内存空间。
  2. 内存共享:对引用的修改会直接影响到原变量的值,因为它们指向同一块内存地址。
  3. 无需解引用:使用引用时无需进行解引用(*)操作,可以像直接操作变量一样使用引用。

引用的主要用途包括

  1. 函数参数传递:通过引用传递参数,可以实现对变量的修改,而无需返回值。
  2. 避免拷贝开销:使用引用可以避免对大型对象进行拷贝,提高程序的效率。
  3. 别名操作:使用引用可以为变量创建别名,提高代码的可读性和可维护性。

需要注意的是,引用和指针不同。引用在定义时必须初始化,并且不能改变引用的目标,而指针可以在任意时刻指向不同的对象。引用也没有空值(null)的概念,而指针可以为空。

在C++中,使用&符号来声明引用,例如:

int a = 42;
int& ref = a; // ref是a的引用

在函数参数传递中,可以使用引用参数来实现对原变量的修改,例如:

void increment(int& num) {num++;
}int main() {int a = 5;increment(a); // 通过引用修改a的值cout << a; // 输出6return 0;
}

 

引用和指针

都是用于间接访问变量的工具,它们在C++中有着不同的特点和用法。

  1. 引用

    • 引用是一个别名,它必须在创建时初始化,并且一旦指向了某个变量,就无法再指向其他变量。
    • 引用本质上是对变量的另一个名字,使用起来更加直观,并且不需要进行解引用操作。
    • 对引用的操作会直接影响到引用所指向的变量,因为它们共享同一块内存空间。
    • 通常用于函数参数传递、返回引用值以及创建别名变量等场景。
  2. 指针

    • 指针是一个变量,它存储了另一个变量的内存地址。指针可以在程序运行过程中被重新赋值,指向不同的变量或者空地址(nullptr)。
    • 操作指针需要使用解引用操作符(*)来访问所指向的变量。
    • 指针相对于引用更加灵活,可以动态分配内存,并支持指针算术运算。
    • 在C++中,指针需要显式地进行内存管理,包括分配和释放内存,因此使用指针需要更加小心谨慎,以避免出现内存泄漏等问题。

在选择使用引用还是指针时,可以根据具体的需求和场景来决定:

  • 如果需要在函数中修改变量的值,可以使用引用作为函数参数;
  • 如果需要支持动态内存分配或者需要指向多个不同对象,可以使用指针。

下面是一个使用引用和指针的示例代码,以展示它们的不同特点:

#include <iostream>
using namespace std;void increment(int& num) {num++; // 直接操作num所指向的变量
}void allocate(int*& ptr, int size) {ptr = new int[size]; // 动态分配内存,并将ptr指向该内存块
}int main() {int a = 5;int* p = &a; // 使用指针来访问变量aint& r = a; // 使用引用来访问变量aincrement(a); // 通过引用修改a的值cout << a << endl; // 输出6int* q = nullptr;allocate(q, 10); // 动态分配内存,并将q指向该内存块q[0] = 42; // 使用指针操作动态分配的内存delete[] q; // 释放动态分配的内存return 0;
}

在这个例子中,我们定义了一个increment函数,它使用引用参数来修改传入的变量的值。我们还定义了一个allocate函数,它使用指针参数来动态分配内存,并将指针指向该内存块。在main函数中,我们使用引用r和指针p来访问变量a,然后调用increment函数来修改a的值。我们还使用指针q来动态分配内存,并使用q来访问和操作动态分配的内存。最后,我们释放了动态分配的内存。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

期权二叉树估值与图计算

传统期权二叉树的算法都是基于数组的&#xff0c;对于没有编程基础的人来说非常不直观。二叉树是一种特殊的图&#xff0c;可以用python networkx这个图算法库实现&#xff0c;这个库不仅包含常用的图算法&#xff0c;还包含简单的绘图功能&#xff0c;非常适合研究分析使用。 …

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex /.srec 文件介绍】

请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】 文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 hex 文件和srec 文件生成Motorola S-Record (srec) 格式 HEX 文件介绍 .hex 文件通常用于微控制器编程&#xff0c;包括 ARM C…

TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)

报错 找到错误代码 这个错误是因为在使用 numpy.loadtxt() 函数时尝试将换行符&#xff08;\n&#xff09;作为分隔符&#xff08;delimiter&#xff09;。然而&#xff0c;换行符是用于标识文本文件中每一行的结束&#xff0c;而不是用于分隔数据字段。 解决 如果你的数据文…

c++ OpenCV4图像处理与视频分析实战教程 -> 自建代码库

OpenCV4图像处理与视频分析实战教程&#xff0c;系列视频自建代码库。C版本。 视频可B站搜索。 简介&#xff1a; 网上流传的“OpenCV4图像处理与视频分析实战”课程附带资料需要解压密码&#xff0c;无法使用&#xff0c;且原视频购买很贵&#xff08;51CTO售价119&#xff0…

在Mac上恢复SD卡数据的 6 个有效应用程序

慌&#xff01;SD卡里的照片和视频不小心删了&#xff0c;Mac设备上还恢复不了数据&#xff01; 遇到这种情况&#xff0c;你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表&#xff0c;并且还有详细的评论。另外&#xff0c;我们还会给…

用通俗易懂的方式讲解大模型:LangChain Agent 原理解析

LangChain 是一个基于 LLM&#xff08;大型语言模型&#xff09;的编程框架&#xff0c;旨在帮助开发人员使用 LLM 构建端到端的应用程序。它提供了一套工具、组件和接口&#xff0c;可以简化创建由 LLM 和聊天模型提供支持的应用程序的过程。 LangChain 由几大组件构成&#…

k8s搭建(五、k8s可视化管理工具Dashboard配置)

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

【基础】【Python网络爬虫】【8.Selenium入门】selenium配置、环境安装、浏览器驱动下载(附大量案例代码)(建议收藏)

Python网络爬虫基础 Selenium 入门1. 动态网页&静态网页动态网页JavaScriptJQueryAjaxHTML 动态网页处理方法 2. Selenium 工作原理3. Selenium 配置环境安装浏览器驱动下载配置浏览器驱动 selenium 快速上手 4. Driver对象的常用方法及属性5. 元素提取6. 元素对象的方法及…

【基础】【Python网络爬虫】【5.数据解析】bs4、Xpath、Parsel模块、正则表达式(附大量案例代码)(建议收藏)

Python网络爬虫基础 数据解析1. 为何数据解析2. 常见的数据类型结构化数据半结构化数据非结构化数据 3. 爬虫项目实现步骤 数据解析模块1. Bs4环境安装bs4解析流程案例 - bs4碧血剑文本爬取 2. Xpath环境安装xpath解析的编码流程xpath表达式如何理解&#xff1f;案例 - 简历模板…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…

SparkStreaming与Kafka整合

1.3 SparkStreaming与Kafka整合 1.3.1 整合简述 kafka是做消息的缓存&#xff0c;数据和业务隔离操作的消息队列&#xff0c;而sparkstreaming是一款准实时流式计算框架&#xff0c;所以二者的整合&#xff0c;是大势所趋。 ​ 二者的整合&#xff0c;有主要的两大版本。 kaf…