从C到C++ | C++入门(二)

news2024/11/25 4:41:10

目录

缺省参数

1.)全缺省

 2.)半缺省

函数重载 

1.) 参数类型不同

2.) 参数个数不同

3.) 参数顺序不同 

函数重载的原理:

!!!注意  !!!

引用

1.) 引用做参数

2.) 引用做返回值

引用和指针的区别:


缺省参数

        顾名思义,就是函数的参数可以缺省,即我们在写函数的声明或定义的时候,可以让其参数有默认值。起作用是,在调用函数的时候,如果我们没有指定实参,则会采用该形参的缺省值。

        例子:

#include <iostream>
using namespace std;

//形参n的缺省值10,若没有指定实参,则实参n的值为10
void test(int n = 10)
{
    cout << "n :" << n << endl;
}
int main() 
{
    test();
    test(1);
    return 0;
}

         输出结果:

缺省参数有以下几种:

1.)全缺省

     顾名思义,全缺省的意思则是函数参数全部都有缺省值。

// 形参a 和形参b 都有缺省值
void test(int a = 10, int b = 20)
{
    cout << "a: " << a << endl;
    cout << "b: " << b << endl;
}

 2.)半缺省

        顾名思义,则是函数参数部分有缺省值,但是要注意的是,半缺省则必须从右往左开始。

// 形参a 没有缺省值,形参b 有缺省值
void test(int a, int b = 20)
{
    cout << "a: " << a << endl;
    cout << "b: " << b << endl;
}

        为什么半缺省必须从右往左开始缺省?以下代码则可以解释

// 这是个错误的例子,从左往右开始缺省
void test(int a = 10, int b)
{
    cout << "a: " << a << endl;
    cout << "b: " << b << endl;
}

         上述错误的例子,该如何调用函数test()?

        假设我们都有指定的参数,test(1,2),这个没问题,实参a = 1, b = 2。

那,如果我们要采用形参的缺省值,使 a 采用缺省值10,b 的值为20 的话,是test(20),那这个20按照函数参数的定义顺序的话,是赋给a,而参数b则没有收到指定的值,则会出现错误。


函数重载 

        在学习C++的过程中,会经常遇到的知识点就是重载,其是C++的精华之一,可以说“不了解重载则是不了解C++”。函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 参数个数 或 类型 或 类型顺序 不同。

1.) 参数类型不同

        例子:

#include <iostream>
using namespace std;

//参数类型不同 
int Add(int num1, int num2)
{
    cout << " Add(int num1, int num2) " << endl;
    return num1+num2;
}

double Add(double num1, double num2)
{
    cout << " Add(double num1, double num2) " << endl;
    return num1+num2;
}

int main()
{
    // 参数是两个int类型,调用Add(int num1, int num2)
    Add(1,2);
    
    // 参数是两个double类型,调用double Add(double num1, double num2)
    Add(2.5,2.5);

    return 0;
}

        结果:

2.) 参数个数不同

        例子:

#include <iostream>
using namespace std;

// 参数个数不同
void test()
{
    cout << " test() " << endl;
}

void test(int a)
{
    cout << " test(int a) " << endl;
}

int main()
{
    // 参数个数为0,调用函数test()
    test();

    // 参数个数为1,调用函数test(int a)
    test(0);    

    return 0;
}

        结果:

3.) 参数顺序不同 

        例子:

#include <iostream>
using namespace std;

// 参数顺序不同
void test(int a, double b)
{
    cout << " test(int a, double b) " << endl;
}

void test(double a, int b)
{
    cout << " test(int a, double b) " << endl;
}

int main()
{
    // 参数顺序为 int double,调用函数test(int a, double b)
    test(1,2.0);

    // 参数顺序为 double int,调用函数test(double a, int b)
    test(1.0,2);

    return 0;
}

        结果:

函数重载的原理:

        重载函数在编译的汇编阶段会生成一个自己的符号表,在不同环境下生成的符号表不同,例如在g++环境下,以void test(int a, double b)为例,会生成一个为<_z4testid>的符号表,其中4是函数名的长度,test为函数名,id为形参的类型及顺序。

!!!注意  !!!

        因符号表中并不能区别函数的返回值的类型,因此函数的返回值的类型不同并不能构成函数重载!函数重载的构成的条件是 参数个数 或 类型 或 类型顺序 不同!!!


引用

        引用是给已存在对的变量取一个别名,而不是新定义一个变量,编译器不会为引用变量开辟内存空间,它和引用的变量共用同一块内存空间,因此,在某些场景下,我们可以采用引用来直接对变量的值进行修改,这种方式比采用指针的方式方便。

        例子:

void test()
{
    int a = 10;
    int& ra = a;    //ra引用变量a
    cout << " a: " << a <<endl;
    cout << " ra: " << ra << endl;
    ++ra;       //实际是对变量a进行修改
    cout << " a: " << a << endl;
    cout << " ra: " << ra << endl;
}

        结果:

        在使用引用的时候,要注意权限不能放大。例如引用一个const修饰的常变量时,要给const修饰引用。

void test()
{
    const int a = 10;
    // int& ra = a; 该语句编译时会出错,权限放大了
    const int& ra = a;
}

        引用有多种使用场景,例如做函数参数以及返回值等等。

1.) 引用做参数

// 引用做参数,效果类似指针,直接访问实参所在的内存空间
void Swap(int& num1, int& num2)
{
    int tmp = num1;
    num1 = num2;
    num2 = tmp;
}

2.) 引用做返回值

// 引用做返回值
int& SelfIncrease(int& num)
{
    return ++num;
}

         在使用引用做返回值的时候,要注意返回的对象的生命周期是否在函数作用域之外,若返回的对象的生命周期不在函数作用域之外,则不该采用引用的方式。

//正确的例子
int& Count()
{
    static int n = 0;
    ++n;
    return n;
}

// 错误的例子
int& Add(int a, int b)
{
    int c = a + b;
    return c;
}

        以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率低下,尤其是当参数或者返回值类型非常大时,效率就更低。

        而采用引用做参数或者返回值,在传参和返回期间,函数会直接传递参数或者变量的本身,效率得到了提高。

引用和指针的区别:

        引用在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间
        引用在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

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

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

相关文章

C#使用DataGridView模拟绘图

接到一个需求&#xff0c;绘制一个水管线的图片&#xff0c;这种管线可以有12种分段方法&#xff0c;最后将这12种分段方法合并后在一条水管线上展示&#xff0c;要求&#xff1a; ⒈支持分段的属性展示&#xff1b; ⒉要求每个分段都能清晰展示&#xff0c;分段数在0&#xff…

一天吃透JVM面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 什么是JVM&#xff1f; JVM&#xff0c;全称Java Virtual Machine&#xff08;Java虚拟机&#xff09;&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回…

C++11(1)——新增用法零碎总结

目录 1. C11简介 2. 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list std::initializer_list是什么类型&#xff1a; std::initializer_list使用场景&#xff1a; 让模拟实现的vector也支持{}初始化和赋值 1. C11简介 在2003年C标准委员会…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

学无止境·MySQL⑧(Redis)

Redis和Mongodb练习 Redis1、安装redis2、string类型数据的命令操作&#xff1a;设置键值&#xff1a;读取键值数值类型自增1数值类型自减1查看值的长度 3、list类型数据的命令操作对列表city插入元素&#xff1a;Shanghai Suzhou Hangzhou将列表city里的头部的元素移除将name列…

AI炒股:用Claude来分析A股2023年中报业绩预告

Claude是和ChatGPT类似的AI大模型&#xff0c;据测试 AI 的水平能力接近 GPT-4&#xff0c;支持高达 100K token 的上下文。Claude只需要到官方网站注册账号后就可以直接免费使用。不过&#xff0c;目前智能美国和英国的 IP 可以注册和使用。 Claude支持上传文档功能&#xff…

计算机网络基础第三章

一、数据链路层功能概述 1.1 数据链路层基本概念 结点&#xff1a;主机、路由器 链路&#xff1a;网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路 数据链路&#xff1a;网络中两个结点之间的逻辑通道&#xff0c;…

C++ 异常

文章目录 一. C语言的错误处理二. C的异常三. 异常的抛出与捕获1. 异常的抛出与匹配机制2. 在函数调用链中异常栈展开匹配原则3. 异常安全 四. 多态在异常中的应用五. C标准库的异常体系六. 异常规范七. 异常的优缺点结束语 一. C语言的错误处理 在C语言中&#xff0c;我们常见…

IDEA快捷键及模版配置

一、快捷键 1、常用的快捷键 删除当前行, 默认是 ctrl Y 自己配置 ctrl d (搜delete)复制当前行, 自己配置 ctrl alt 向下光标 (搜duplicate)补全代码 alt /添加注释和取消注释 ctrl / 【第一次是添加注释&#xff0c;第二次是取消注释】导入该行需要的类 先配置 auto …

S3C2440点亮LED(裸机开发)

文章目录 前言一、环境介绍一、GPIO介绍二、点亮开发板的LED1.预备动作2.led代码 总结 前言 本期和大家主要分享的是使用S3C2440开发板点亮一个LED灯&#xff0c;可能大家拿到开发板之后做的第一件事情都是点灯&#xff0c;这是为什么呢&#xff1f;因为点灯这件事情不仅能够检…

TCP三次握手调优

SYN: Synchronize Sequence Numbers。同步序列号 服务端的优化 当服务器收到 SYN 报文后&#xff0c;服务器会立刻回复 SYNACK 报文&#xff0c;既确认了客户端的序列号&#xff0c;也把自己的序列号发给了对方。此时&#xff0c;服务器端出现了新连接&#xff0c;状态是 SYN…

MySQL系列之行转列,列转行

MySQL系列之行转列&#xff0c;列转行 之前业务出现了需要行转列的场景&#xff0c;记录一下 SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理 Mysql Max、 Where和 Group By 三个关键字同时使用 执行顺序 MySql 行转列的玩法 &#xff0c;实战案例教学&#xff08;MAX…

Eolink Apikit,0 代码可拖拽的自动化测试神器

目录 一、从测试到可拖拽的自动化测试二、0 代码&#xff0c;图形化&#xff0c;好用到飞起通过图形化操作、拖拽的方式搭建测试流程 三、Eolink Apikit&#xff0c;一站式 API 研发协作平台1、多协议支持2、多种数据重用3、报告、分析、告警4、支持持续集成和部署 四、Apikit …

QT基础入门之文件操作

一、概述 Qt 作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有读写字节块的能力。下面是 I/O 设备的类图&#xff1a; QIODevice&#xff1a;所有I/O设备类的父类&#xff0c;提供字节块读写的通…

Sentinel流量规则模块(降级)

sentinel的常见页面的简介 流控是对外部来的大流量进行控制&#xff0c;熔断降级的视角是对内部问题进行处理。 Sentinel降级会在调用链路中某个资源出现不稳定状态时&#xff08;例如调用超时或异常比例升高&#xff09;&#xff0c;对这个资源的调用进行限制&#xff0c;…

【JDBC系列】- jdbc的概念以及与数据库的交互流程

【JDBC系列】- jdbc的概念以及与数据库的交互流程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习…

oc UITableView 列表

// // ViewController.m // OcDemoTest // // Created by Mac on 2023/7/14. //#import "ViewController.h" // 添加协议 interface ViewController ()<UITableViewDataSource> property (weak, nonatomic) IBOutlet UITableView *tableView;endimplementat…

Node中的的util.promisify()方法的介绍和基本实现

异步编程解决方案 我们知道&#xff0c;在JS中实现异步编程主要是通过以下几种方案&#xff1a; 回调函数&#xff1a;也是在ES6之前用的最多的方式&#xff0c;缺点是容易造成callback hell&#xff0c;可读性很差观察者模式&#xff1a;在NodeJS中的很多模块都继承了EventE…

二分搜索树节点删除

本小节介绍二分搜索树节点的删除之前&#xff0c;先介绍如何查找最小值和最大值&#xff0c;以及删除最小值和最大值。 以最小值为例&#xff08;最大值同理&#xff09;&#xff1a; 查找最小 key 值代码逻辑&#xff0c;往左子节点递归查找下去&#xff1a; ... // 返回以…

3.4 Bootstrap 按钮下拉菜单

文章目录 Bootstrap 按钮下拉菜单分割的按钮下拉菜单按钮下拉菜单的大小按钮上拉菜单 Bootstrap 按钮下拉菜单 本章将讲解如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单&#xff0c;只需要简单地在在一个 .btn-group 中放置按钮和下拉菜单即可。您也可…