(学习日记)2024.02.01:引用变量 / 默认实参 / 一元作用域运算符 / 函数重载

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.02.01

  • 一、C++:&——引用变量
  • 二、C++:默认实参
  • 三、C++:::——一元作用域运算符
  • 四、C++:函数重载

一、C++:&——引用变量

引用变量是一个巨有用,巨简洁的传递变量用法,类似于指针,但更简洁。

引用变量是用 & 符号来声明的。如果学过C语言的同学,可能知道 & 可以获取变量的地址,但是C++给 & 符号赋予了另一个函数——声明引用变量。例如,要将 b 作为 a 变量的别名,可以这么做:

int a;
int &b = a; // b 是 a 变量的别名

其中,&不是地址运算符,而是类型标识符的一部分。就类似声明 char* 指的是指向 char 的指针一样, int &指的是指向 int 的引用。
上述引用声明完后,a和b就指向相同的值和内存单元(即b是a变量的别名)。

#include <iostream>
using namespace std;
int main()
{int a = 5;int& b = a;cout << "a = " << a << ", a address: " << &a << endl;cout << "b = " << b << ", a address: " << &b << endl;return 0;
}

在这里插入图片描述
可以看到,变量a b的地址都是一样的,换句话说,就是a就是b

大家可以在下面实验:

  1. 如果我们用指针写一个交换两个数的函数,代码如下:
#include<stdio.h>void Swap(int* a, int* b) {int tmp = *a;*a = *b;*b = tmp;
}int main() {int a = 5;int b = 3;Swap(&a, &b);printf("a = %d\nb = %d",a,b);return 0;
}

结果为:
在这里插入图片描述

本函数需要在Swap函数中频繁的使用 *,并且Swap函数中a和b本质上是形参。

  1. 那么如果用 引用变量 来写呢:
#include<stdio.h>void Swap(int& x, int& y) {int tmp = x;x = y;y = tmp;
}int main() {int a = 5;int b = 3;Swap(a, b);printf("a = %d\nb = %d",a,b);return 0;
}

结果如下:
在这里插入图片描述
可以看到,程序简洁了很多

  1. 何时使用引用参数
一、传递值而不修改值(尽量 const 修饰)1、内置数据类型:由于较小,可直接按值传递;2、数组:采用 const 修饰的指针;3、较大的结构:使用 const 指针或 const 引用,可提高效率、节省时间空间;4、类对象:const 引用。二、需要修改原数据1、内置数据类型:可使用指针;2、数组:只能使用指针;3、较大的结构:使用指针或引用;4、类对象:const 引用。
  1. 引用这么高效为什么内置类型不使用引用呢?
    《Effective C++》条款20:宁以pass by reference to const替换pass by value。
    其中有这么一句“如果你有个对象属于内置类型(例如int) pass by value 往往比 pass by reference 的效率高些”。
    说白了就是自己的东西用的更顺手一些。

参考资料:
C+±–引用变量(&)
C++——引用变量
C++ | 引用变量

二、C++:默认实参

某些函数有这样一种形参, 在函数的很多次调用中它们都被赋予一个相同的值, 我们把这个反复出现的值称为函数的默认实参。

调用含有默认实参的函数时, 可以包含该实参, 也可以省略该实参。

对于有多个形参的函数, 必须从右向左添加默认值。
在这里插入图片描述
在这里插入图片描述

三、C++:::——一元作用域运算符

在C ++中,作用域运算符为::
它用于以下目的。

  1. 当存在具有相同名称的局部变量时,要访问全局变量:
// C++ program to show that we can access a global variable 
// using scope resolution operator :: when there is a local  
// variable with same name  
#include<iostream>  
using namespace std; int x;  // Global x int main() 
{ int x = 10; // Local x cout << "Value of global x is " << ::x; cout << "\nValue of local x is " << x;   return 0; 
} 

输出:
全局x的值为0
本地x的值为10

  1. 在类之外定义函数。
// C++ program to show that scope resolution operator :: is used 
// to define a function outside a class 
#include<iostream>  
using namespace std; class A  
{ 
public:  // Only declaration void fun(); 
}; // Definition outside class using :: 
void A::fun() 
{ cout << "fun() called"; 
} int main() 
{ A a; a.fun(); return 0; 
} 

输出:
fun() called

  1. 访问一个类的静态变量。
// C++ program to show that :: can be used to access static 
// members when there is a local variable with same name 
#include<iostream> 
using namespace std; class Test 
{ static int x;   
public: static int y;    // Local parameter 'a' hides class member // 'a', but we can access it using :: void func(int x)   {  // We can access class's static variable // even if there is a local variable cout << "Value of static x is " << Test::x; cout << "\nValue of local x is " << x;   } 
}; // In C++, static members must be explicitly defined  
// like this 
int Test::x = 1; 
int Test::y = 2; int main() 
{ Test obj; int x = 3 ; obj.func(x); cout << "\nTest::y = " << Test::y; return 0; 
} 

输出:
静态x的值为1
本地x的值为3
测试:: y = 2

  1. 如果有多个继承:
    如果两个祖先类中存在相同的变量名,则可以使用作用域运算符进行区分。
// Use of scope resolution operator in multiple inheritance. 
#include<iostream> 
using namespace std; class A 
{ 
protected: int x; 
public: A() { x = 10; } 
}; class B 
{ 
protected: int x; 
public: B() { x = 20; } 
}; class C: public A, public B 
{ 
public: void fun() { cout << "A's x is " << A::x; cout << "\nB's x is " << B::x; } 
}; int main() 
{ C c; c.fun(); return 0; 
}

输出:
A的x是10
B的x是20

  1. 对于命名空间
    如果两个命名空间中都存在一个具有相同名称的类,则可以将名称空间名称与作用域解析运算符一起使用,以引用该类而不会发生任何冲突
// Use of scope resolution operator for namespace. 
#include<iostream> 
int main(){ std::cout << "Hello" << std::endl;
} 

在这里,cout和endl属于std命名空间。

  1. 在另一个类中引用一个类:
    如果另一个类中存在一个类,我们可以使用嵌套类使用作用域运算符来引用嵌套的类
// Use of scope resolution class inside another class. 
#include<iostream> 
using namespace std; class outside 
{ 
public: int x; class inside { public: int x; static int y;  int foo(); }; 
}; 
int outside::inside::y = 5;  int main(){ outside A; outside::inside B; } 

在这里插入图片描述

四、C++:函数重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Linux一键部署telegraf 实现Grafana Linux 图形展示

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

三.Linux权限管控 1-5.Linux的root用户用户和用户组查看权限控制信息chmod命令chown命令

目录 三.Linux权限管控 1.Linux的root用户 root用户&#xff08;超级管理员&#xff09; su和exit命令 sudo命令 为普通用户配置sudo认证 三.Linux权限管控 2.用户和用户组 用户&#xff0c;用户组 用户组管理 用户管理 getent---查看系统中的用户 三.Linux权限管控…

【2024美赛】F题(中英文):减少非法野生动物贸易Problem F: Reducing Illegal Wildlife Trade

【2024美赛】F题&#xff08;中英文&#xff09;&#xff1a;减少非法野生动物贸易Problem F: Reducing Illegal Wildlife Trade 写在最前面2024美赛翻译 —— 跳转链接 中文赛题问题F&#xff1a;减少非法野生动物贸易你的工作应探讨以下子问题&#xff1a;参考文献词汇表 英文…

XGB-2: Boosted Trees(提升树)简介

XGBoost代表“Extreme Gradient Boosting”&#xff0c;其中术语“Gradient Boosting”来源于Friedman的论文《Greedy Function Approximation: A Gradient Boosting Machine》。 梯度提升树已经存在一段时间&#xff0c;关于这个主题有很多资料。本部分将使用监督学习的元素&…

git小白之路

git是最常用的版本控制工具&#xff0c;我对其进行了整理后续补充&#xff0c;这个文档欢迎大家来讨论&#xff0c;当前我的视频梳理&#xff1a; git小白进阶之路_哔哩哔哩_bilibili&#xff0c;非常希望大佬们能够批评指正&#xff0c;并多多交流。 目录 初始配置 配置账号…

【Linux】线程安全——同步和互斥

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 引入1. Linux线程互斥1.1 互斥的相关概念1.2 互斥量mutex1.3 mutex的使用1.4 mutex的…

VScode注释快捷键,RStudio注释快捷键, Texmaker注释快捷键

VScode&#xff1a;一款界面简单的代码编辑器&#xff1b;RStudio: R语言的IDE&#xff0c;包含代码编辑器&#xff0c;运行&#xff0c;绘图窗口等&#xff1b;Texmaker&#xff1a;Latex编译器&#xff08;编辑编译&#xff09;&#xff0c;界面简单&#xff0c;个人认为比Te…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

基于单片机的智能燃气灶控制系统设计

摘要&#xff1a;针对传统燃气灶存在不能防干烧、不能进行温度检测、不能进行火力自动调节等问题&#xff0c;设计了一种基于单片机控制的智能燃气灶&#xff0c;它通过单片机进行控制&#xff0c;由开关模块、测温模块、语音播报模块、火力控制模块和防空烧模块五个模块组成&a…

Java中使用StopWatch实现代码块耗时统计/计时某段代码执行

场景 Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)&#xff1a; Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)_lru 算法 jdk-CSDN博客 上面讲了统计方法的耗时&#xff0c;实现和使用…

数据探索与可视化:可视化分析数据-下

目录 一、前言 二、介绍 Ⅰ.时间序列数据 Ⅱ.文本数据 Ⅲ.社交网络数据 三、结语 一、前言 那么本篇将互怼其他类型的数据分析的可视化方法进行介绍&#xff0c;它们分别是:时间序列&#xff0c;文本数据&#xff0c;社交网络数据。 二、介绍 Ⅰ.时间序列数据 import pan…

算法——A/算法通识

目录 一、复杂度分析 A/时间复杂度 B/空间复杂度 C/分析技巧 二、枚举分析 A/枚举算法介绍 B/解空间的类型 C/循环枚举解空间 三、模拟算法 四、递归 A/递归介绍 递归的两个关键要素&#xff1a; B/递归如何实现 C/递归和循环的比较 一、复杂度分析 A/时间复杂度…