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

news2025/3/3 4:10:52

目录

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; // 输出6
    return 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; // 使用指针来访问变量a
    int& r = a; // 使用引用来访问变量a

    increment(a); // 通过引用修改a的值
    cout << a << endl; // 输出6

    int* 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.coloradmin.cn/o/1346526.html

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

相关文章

8天狂收6000+⭐️,可商用的开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员&#xff0c;联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于&#xff0c;将传统的顺序去噪变成流批处理去噪&#xff0c;消除了漫长的等待…

嵌入式学习路线

嵌入式系统是一种将软件和硬件紧密结合的技术&#xff0c;首先我们要认识到&#xff0c;无论我们是专注于软件开发还是硬件开发&#xff0c;最终的目标都是为了更好的工作和职业发展。 根据企业的规模和需求&#xff0c;大公司更倾向于将职责分得更细&#xff0c;例如软件分为…

2023年总结(2023年1月1日至2023年12月31日)

前言 时间过得真快啊&#xff0c;一年又过去了。 从去年11月换了家公司后&#xff0c;工作就稳定多了&#xff0c;做的工作也是我喜欢做的工作——摄像头驱动&#xff0c;平时也挺轻松的&#xff0c;偶尔有事儿的时候会压力大点&#xff0c;加点班&#xff0c;其他都还好&…

SAP 资产管理后台配置之设定主数据字段

前阵子给财务创建了一个固定资产类型&#xff0c;但同事使用时发现字段跟平时不一样。 正常是有下面这些标签页的 然后我找到主数据屏幕格式的配置里发现 发现格式默认错了 应该是默认我司的自定义格式ZSAP 但是改成ZSAP还是不会生效 需要给这个资产分类重新分配一下字段标签页…

『番外篇八』SwiftUI 脑洞大开实现“另类”视图跟随方法

概览 在 SwiftUI 的开发中,我们时常需要用指尖丝滑般地操作指定视图:比如,我们需要在拖动视图后让它自动归位,或者拖动一个视图时让另一个视图跟随它移动。 我们随后将会详细讨论上述两个 SwiftUI 中与视图移动相关场景的实现。 在本篇博文中,您将学到如下内容: 概览1.…

12.31_黑马数据结构与算法笔记Java

目录 331 两数之和 Leetcode167 332 三数之和 Leetcode15 333 四数之和 Leetcode18 334 盛水最多容器 Leetcode11 335 滑动窗口最大值 Leetcode239 336 接雨水 Leetcode42 337 字符串匹配 bf Leetcode28 338 字符串匹配 kmp Leetcode28 339 字符串匹配 lps Leetcode28 …

洛谷:集合与差分

1.学籍管理(map&#xff09; #include<iostream> #include<map> #include<string> using namespace std; map<string,int>a; int n; string name; int op,score; int main() {cin>>n;for(int i1;i<n;i){cin>>op;if(op!4)cin>>na…

深度解析ShardingJDBC:Java开发者的分库分表利器

一、ShardingSphere ShardingSphere 是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC 。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、电…

Mybatis 事务接口

当我们从数据源中得到一个可用的数据库连接之后&#xff0c;就可以开启一个数据库事务了&#xff0c;事务成功开启之后&#xff0c;我们才能修改数据库中的数据。 在修改完成之后&#xff0c;我们需要提交事务&#xff0c;完成整个事务内的全部修改操作&#xff0c;如果修改过…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析

1.简介 在介绍selenium的时候&#xff0c;宏哥也介绍过等待&#xff0c;是因为在某些元素出现后&#xff0c;才可以进行操作。有时候我们自己忘记添加等待时间后&#xff0c;查了半天代码确定就是没有问题&#xff0c;奇怪的就是获取不到元素。然后搞了好久&#xff0c;或者经…

桉木芯建筑模板与其他材质比较有何不同?

在建筑行业中&#xff0c;模板的选择对于确保工程质量和效率至关重要。桉木芯建筑模板作为市场上的一种选择&#xff0c;与其他材质的模板相比&#xff0c;具有独特的优势。能强优品木业作为专业的桉木芯建筑模板生产厂家&#xff0c;其产品充分展示了这一材质的优越性能。 材质…

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

如何实现WinApp的UI自动化测试?

WinApp&#xff08;WindowsAPP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinApp&…

[pingCTF 2023] 闲来无事作个题

谁元旦还打CTF啊&#xff0c;这两周没有比赛&#xff0c;明天才加班&#xff0c;作个已经过去的比赛。好在已经有官方WP&#xff0c;不会的可以看。 PWN without-love-it-cannot-be-seen 这个没有代码属于瞎pwn&#xff0c;随便输入个东西会提示密码不正确&#xff0c;然后输…

逻辑卷使用和扩容

1.逻辑卷管理LVM &#xff08; Logical Volume Manager&#xff09; 是 Linux 下对硬盘分区的一种管理机制 /boot分区用于存放引导文件&#xff0c;不能基于lvm创建 2.分区缺点&#xff1a; 无法动态扩容 必须使用连续的空间 没有备份 逻辑卷 lvm&#xff1a; 可以动态扩容…

设计模式:工厂方法模式(讲故事图文易懂)

目录 简单工厂工厂方法模式 简单工厂 定义&#xff1a;简单工厂由一个工厂根据参数类型决定创建哪种产品的实例。 简单工厂不包含在23种设计模式之内&#xff08;简单工厂不满足开闭原则&#xff0c;后面会详细讲&#xff09; 举例&#xff1a;张三去4S店买了车&#xff0c;显…

大二第17周总结——2023年的最后一天

本周&#xff0c;学校安排的是数据结构的程序设计&#xff0c;设计是挺好设计的&#xff0c;小半天搞完了&#xff0c;然后帮室友也搞了。内容在上一个博客。 学习上嘛~ 学了一下websocket,看了下微信小程序........ 今天早上做了一套小米的面试题&#xff0c;不做不知道&…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性&#xff1f; 105.什么是缓存穿透&#xff0c;什么是缓存雪崩&#xff1f;怎么解决&#xff1f; 106.如何对数据库进行优化&#xff1f; 107.使用索引时有哪些原则&#xff1f; 108.存储过程如何进行优化&#xff1f; 109.说说…

按摩上门预约小程序源码系统 开发组合:PHP+MySQL 附带完整的搭建教程

现代生活节奏的加快&#xff0c;人们越来越注重健康与放松。按摩作为传统的舒缓方式&#xff0c;市场需求逐年上升。然而&#xff0c;传统的按摩服务预约方式较为繁琐&#xff0c;用户需拨打热线电话或前往实体店进行预约&#xff0c;这无疑增加了用户的操作成本。因此&#xf…

前端框架前置学习(4) AJAX

同步代码和异步代码 同步代码 浏览器按照我们书写代码的顺序一行一行地执行程序.浏览器会等待代码的解析和工作,在上一行代码完成之后才会执行下一行代码.这被称之为同步程序 逐行执行,需要原地等待结果 异步代码 异步编码技术使得程序可以在执行一个可能长期运行的任务的…