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; // 输出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来访问和操作动态分配的内存。最后,我们释放了动态分配的内存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶学习笔记(二十四)——车辆控制开发

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 控制算法 控制标定 控制协议…

C# PrinterSettings修改打印机纸张类型,paperType

需求&#xff1a;直接上图&#xff0c;PrinterSettings只能改变纸张大小&#xff0c;打印质量&#xff0c;无法更改打印纸类型 爱普生打印机打印照片已经设置了最高质量&#xff0c;打印图片仍不清晰&#xff0c;需要修改打印纸类型&#xff0c;使用PrintDialog调出对话框&…

Avalonia学习(十五)-OxyPlot

今天开始继续Avalonia练习。展示一些样例&#xff0c;尤其是第三方库的使用。 本节&#xff1a;OxyPlot 1.引入OxyPlot.Avalonia 2.项目引入 在Main方法里增加OxyPlotModule.EnsureLoaded()方法调用。 public static void Main(string[] args) {OxyPlotModule.EnsureLoade…

向量数据库调研

向量数据库的优势 数据库类型 适用场景 典型数据库举例 关系型数据库&#xff08;RDBMS&#xff09; 处理结构化数据&#xff0c;擅长OLTP&#xff0c;如财务、人事管理等。 MySQL&#xff0c;Oracle&#xff0c;SQL Server 非关系型数据库&#xff08;NoSQL&#xff09;…

太阳系三体模拟器

介绍 《三体》是刘慈欣创作的长篇科幻小说&#xff0c;文中提到的三体问题比较复杂和无解。 该项目代码就是利用 Python 来模拟三体的运行&#xff0c;此项目代码完全共享&#xff0c;欢迎下载。 我们可以自己通过调整天体的初始坐标、质量和矢量速度等等参数来自定义各种场景…

使用Android Studio等idea工具开发flutter应用,必备的debug调试技能,非常好用

我们程序员不论开发什么软件&#xff0c;都需要一把锋利的调试工具&#xff0c;这是必不可少的&#xff0c;不然出现问题了&#xff0c;你都不知道问题是啥&#xff0c;出现在哪&#xff0c;就更别说怎么解决了。所以我这里就介绍一下android studio开发flutter必备的调试技能&…

全栈架构:从0开始,Vue的搭建与开发

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 然后&#xff0c;很多小伙伴平时聚焦CRUD&#xff0c;没有亮点项目&#xff0c; 黄金项目。 简历也写得是非常lo…

政务大数据能力平台建设方案:文件全文30页,附下载

关键词&#xff1a;智慧政务解决方案&#xff0c;智慧政务建设&#xff0c;智慧政务服务平台&#xff0c;智慧政务大数据&#xff0c;数字政务一体化平台。大数据&#xff0c;政务大数据建设 一、智慧政务建设需求 1、政务服务需求&#xff1a;智慧政务建设需要满足人民群众的…

2023年《环球科学》十大科学新闻

2023年3月的一篇重磅文章迅速将“室温超导”的话题送上各大媒体的头条&#xff0c;在惊呼一个新时代来临之余&#xff0c;很多科学家也提出了反对意见。于是&#xff0c;精彩的多方对垒几乎贯穿了这一整年。虽然最终以撤稿收尾&#xff0c;但这也让我们见识了众人对突破性技术的…

啊哈c语言——4.10(练习)

1&#xff0e;请尝试用for循环打印下面的图形。 #include <stdio.h> #include <stdlib.h> int main() {int a,b,c,d,e;for(a 1;a < 10;a){if(a < 5){b a * 2 - 1;c 5 - a;}else{b 9 - (a - 5) * 2;c a - 5;}for(d 0;d < c;d ){printf(" "…

HTML+CSS+JAVASCRIPT实战项目——新年快乐特效

生成动态视频 <!doctype html> <html> <head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, minimum-scale1.0, user-scalableno"/><title>2024新年快乐…

鸿蒙应用开发 应用内字体大小调节

1 数据管理概述 在移动互联网蓬勃发展的今天&#xff0c;移动应用给我们生活带来了极大的便利&#xff0c;这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置&#xff0c;HarmonyOS 应用开发也不例外。 本文将为您介绍 HarmonyOS 提供的数据…

黑马程序员SSM框架-SpringBoot

视频连接&#xff1a;SpringBoot-01-SpringBoot工程入门案例开发步骤_哔哩哔哩_bilibili SpringBoot简介 入门程序 也可以基于官网创建项目。 SpringBoot项目快速启动 下面的插件将项目运行所需的依赖jar包全部加入到了最终运行的jar包中&#xff0c;并将入口程序指定。 Spri…

信号与线性系统翻转课堂笔记17——z变换及其性质

信号与线性系统翻转课堂笔记17——z变换及其性质 The Flipped Classroom17 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff09;序列的z变换…

Unity 爱心血量效果

这里写自定义目录标题 1.准备爱心血条2.HeartUI 代码3.在Inspector窗口中绑定好对象4.在血量减少的地方&#xff0c;调用更新方法5.效果展示 1.准备爱心血条 准备好红色爱心和灰色爱心的图片 2.HeartUI 代码 using System.Collections; using System.Collections.Generic; u…

计算机缺失api-ms-win-crt-runtime-l1-1-0.dll要怎么解决

在Windows 7操作系统中&#xff0c;api-ms-win-crt-runtime-l1-1-0.dll是一个关键的运行时库文件&#xff0c;负责提供多种实用功能。许多用户在操作系统或软件使用过程中&#xff0c;可能会遇到api-ms-win-crt-runtime-l1-1-0.dll缺失的问题。那么&#xff0c;api-ms-win-crt-…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南&#xff0c;介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…

Halcon 膨胀dilation_circle

Halcon 膨胀 文章目录 Halcon 膨胀 膨胀是对选区进行“扩大”的一种操作。其原理是使用一个自定义的结构元素,在待处理的二值图像上进行类似于“滤波”的滑动操作&#xff0c;然后将二值图像对应的像素点与结构元素的像素进行对比&#xff0c;得到的并集为膨胀后的图像像素。图…

【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】

目录 第1关&#xff1a;括号表示法创建二叉树任务描述相关知识编程要求测试说明完整代码 第2关&#xff1a;先序序列创建二叉树任务描述相关知识二叉树的前序遍历如何创建一颗二叉树伪代码如下&#xff1a; 二叉树的中序遍历 编程要求测试说明完整代码 第3关&#xff1a;计算二…

python编程从入门到实践(1)

文章目录 2.2.1命名的说明2.3字符串2.3.1使用方法修改字符串的大小写2.3.2 在字符串中使用变量2.3.3 制表符 和 换行符2.5.4删除空白2.5.5 删除前缀&#xff0b;后缀 2.2.1命名的说明 只能包含&#xff1a;字母&#xff0c;下划线&#xff0c;数字 必须&#xff1a;字母&#…