C++_day2

目录

1. 引用 reference(重点)

1.1 基础使用

1.2 特性

1.3 引用参数

2. C++窄化(了解)

3. 输入(熟悉)

4. string 字符串类(掌握)

4.1 基础使用

4.2 取出元素

4.3 字符串与数字转换

5. 函数

5.1 内联函数 inline(掌握)

5.2 函数重载 overload(掌握)

5.3 函数的参数默认(缺省)值(掌握)

5.4 哑元函数(熟悉)


本章主要讲解非面向对象的升级。

1. 引用 reference(重点)

1.1 基础使用

    引用就是某个变量或常量的别名,对引用进行操作与操作原变量或常量完全相同。

#include <iostream>using namespace std;int main()
{int a = 1;int& b = a; // b是a的引用b++;cout << a << " " << b << endl; // 2 2cout << &a << " " << &b << endl; // 0x61fe88 0x61fe88return 0;
}

1.2 特性

  • 可以改变引用变量的值,但是不能再次成为其他变量的引用。

#include <iostream>using namespace std;int main()
{int a = 1;int& b = a; // b是a的引用int c = 8;b = c; // 仅仅是赋值,b仍然是a的别名cout << a << " " << b << " " << c << endl; // 8 8 8cout << &a << endl; // 地址1cout << &b << endl; // 地址1cout << &c << endl; // 地址2
//    &b = c; 错误
//    int& b = c; 错误return 0;
}

  • 声明引用时,必须初始化。

  • 声明引用时,初始化的值不能为NULL。

  • 声明引用时,初始化的值可以是纯数值,但是此时引用需要使用const修饰,表示常引用,不允许修改引用值。

#include <iostream>using namespace std;int main()
{
//    int& b = 123; 错误const int& b = 123; // 常引用cout << b << endl; // 123
//    b++; 错误return 0;
}

  • 可以将变量引用的地址赋值给一个指针,此时指针指向的还是原来的变量。

#include <iostream>using namespace std;int main()
{int a = 1;int &b  = a;int* c = &b;cout << *c << endl; // 1cout << c << " " << &a << endl; // 0x61fe84 0x61fe84return 0;
}

  • 可以建立指针变量的引用。

#include <iostream>using namespace std;int main()
{int a = 1;int* b = &a;int*& c = b; // c是b的引用cout << c << " " << b << " " << endl; // 0x61fe88 0x61fe88cout << *c << endl; // 1return 0;
}

  • 可以使用const修饰引用,表示常引用,此时不允许改变引用的值,但是可以改变原变量。

#include <iostream>using namespace std;int main()
{int a = 1;const int& b = a; // b是a的常引用
//    b++; 错误a++;cout << b << endl; // 2return 0;
}

1.3 引用参数

【思考题】写一个函数,功能为交换两个int变量参数的数值。

#include <iostream>using namespace std;/*** @brief swap1 错误的交换方式*/
void swap1(int a,int b)
{a = a ^ b;b = a ^ b;a = a ^ b;cout << a << endl; // 2cout << b << endl; // 1
}/*** @brief swap2 C的交换方式* 指针比较复杂繁琐*/
void swap2(int* a,int* b)
{*a = *a ^ *b;*b = *a ^ *b;*a = *a ^ *b;
}/*** @brief swap3 使用引用参数传递,方便简洁*/
void swap3(int& a,int& b)
{a = a ^ b;b = a ^ b;a = a ^ b;
}int main()
{int a = 1;int b = 2;swap1(a,b);cout << a << endl; // 1cout << b << endl; // 2swap2(&a,&b);cout << a << endl; // 2cout << b << endl; // 1swap3(a,b);cout << a << endl; // 1cout << b << endl; // 2return 0;
}

    使用引用作为函数参数时,不产生副本,可以使参数传递的效率提升,相比指针又更加简洁。

需要注意的是:

引用参数应该在内被const修饰的情况下,尽量使用const修饰,以达到引用参数的安全性。

#include <iostream>using namespace std;void show(const int& a,const int& b)
{cout << a << endl;cout << b << endl;
}int main()
{int a = 1;int b = 2;show(a,b);cout << a << endl;return 0;
}

2. C++窄化(了解)

#include <iostream>using namespace std;int main()
{double a = 123234.8;int b = (int)a; // C强制类型转换格式int c(a); // C++格式cout << b << endl;cout << c << endl;int d{a}; // C++11格式:可以给出数据窄化警告cout << d << endl;return 0;
}

3. 输入(熟悉)

在C++中使用cin进行键盘输入,与cout一样支持连续操作。

#include <iostream>using namespace std;int main()
{int a;double b;string c; // C++的字符串类型cout << "依次输入整型、浮点型与字符串类型:" << endl;// 连续输入三个数据,分别给abc三个变量cin >> a >> b >> c;cout << "您输入的数据是:" << endl;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

如果想输入空格,可以使用getline函数,可以一次获得一行的数据:

#include <iostream>using namespace std;int main()
{string s;cout << "请输入一行字符串,可以包含空格:" << endl;getline(cin,s);cout << "您输入的数据是:" << endl;cout << s << endl;return 0;
}

4. string 字符串类(掌握)

4.1 基础使用

string不是C++本身的基本数据类型,而是在C++标准库std中的一个字符串类。

在使用时需要引入头文件<string>,而不是<string.h>,string用于在绝大多数情况下代替char*,不必担心内存是否足够、字符串长度等问题。

string内部集成的函数可以完成绝大多数情况下字符串的操作。

string支持多种遍历方式:

  • for循环
  • for-each循环(C++11)
  • 迭代器(后面讲)

#include <iostream>using namespace std;int main()
{string s = "fsdhfjdhsjkf";// size和length效果完全相同cout << "字符串长度:" << s.size()<< " " << s.length() << endl;cout << "for循环遍历:" << endl;for(int i = 0;i<s.size();i++){cout << s[i] << " ";}cout << endl << "for-each遍历:" << endl;for(char i:s)cout << i << " ";return 0;
}

4.2 取出元素

    在C++中除了使用[]取出元素外,还可以使用at函数取出元素。

    在绝大多数情况下,更推荐使用at函数取出元素,因为at函数更安全,但是[]性能更好。

#include <iostream>using namespace std;int main()
{string s = "fsdhfjdhsjkf";cout  << s[1] << endl; // 's'// at函数cout << s.at(1) << endl; // 's'//    cout << s[-100] << endl; // '\0'或乱码cout << s.at(-100) << endl; // 检测到越界则终止运行cout << "主函数结束" << endl;return 0;
}

4.3 字符串与数字转换

    转换方式有很多种,在此使用的是字符串流。

    整数 → 字符串

#include <iostream>
#include <sstream> // 头文件using namespace std;int main()
{int i = 2323;stringstream ss;ss << i;string s = ss.str();cout << s << endl;return 0;
}

字符串 → 整数

#include <iostream>
#include <sstream> // 头文件using namespace std;int main()
{string s = "12345";istringstream iss(s);int i;iss >> i;cout << i << endl;return 0;
}

5. 函数

5.1 内联函数 inline(掌握)

    在C++中使用内联函数主要是为了取代C语言中宏定义的函数,内联函数在编译时,可以直接展开函数体到主函数中,因此提升了程序执行的效率,消除了普通的额外开销。

    建议把代码长度较小(1-5行且不能包含复杂的控制语句)且频繁使用的函数定义为内联函数,内联函数只是给编译器的建议,编译器并不一定采纳。

    只要在函数定义处使用inline关键字修饰函数,就可以把函数设置为内联函数。

#include <iostream>using namespace std;/*** @brief test 内联函数*/
inline void test(int a)
{cout << "fdfd" << endl;cout << ++a << endl;
}void func(); // 函数声明inline void func() // 函数定义
{cout << "翻江倒海发的" << endl;cout << "法国活动经费" << endl;
}int main()
{int a = 1;test(a);func();return 0;
}

    需要注意的是,后面要学习的成员函数默认都定义为内联函数。

5.2 函数重载 overload(掌握)

    C++中允许同一个函数名称定义多个函数,这就是函数重载。

    函数签名是编译器区分不同函数的方式,包括以下几个组成部分:

  • 函数名称
  • 参数数量
  • 参数类型

    两个函数的签名不可以相同,即一个函数只有一个独一无二的签名。

     当函数签名中函数名称相同,剩余条件不同时(参数数量或参数类型不同),就构成了函数重载。

#include <iostream>using namespace std;void test()
{cout << "没有参数" << endl;
}void test(int a)
{cout << "一个int参数" << a << endl;
}void test(int a,int b)
{cout << "两个int参数" << a+b << endl;
}void test(string a,string b)
{cout << "两个string参数" << a+b << endl;
}//int test(string a,string b) 错误
//{
//    cout << "两个string参数" << a+b << endl;
//    return 1;
//}int main()
{test(1,3);test(54);test();test("aa","bb");return 0;
}

后面学习的函数中,需要注意的是:构造函数可以重载,但是析构函数不能重载。

5.3 函数的参数默认(缺省)值(掌握)

    C++允许给函数的参数设定默认值,调用函数时如果传入参数,传入的参数会覆盖默认值;调用时如果不传递参数,参数使用预设的默认值。

   函数的参数默认值既可以在声明处(建议)设定,又可以在定义处设定,但是只能出现一次。

    向右(后)原则:如果函数的参数有多个,只要某个参数设定了默认值,其右边(后面)的所有参数都要设定默认值。

#include <iostream>using namespace std;void func(int a = 1)
{cout << a << endl;
}void test(int a = 2);void test(int a)
{cout << a << endl;
}void method(int a,int b = 1,int c = 2)
{cout << a << b << c << endl;
}int main()
{func(); // 1func(2); // 2test(); // 2test(1); // 1method(6); // 612method(6,6);  // 662method(6,6,6); // 666return 0;
}

尽量不要同时使用函数重载和参数默认值,因为非常容易出现二义性问题。

#include <iostream>using namespace std;void method(int a,int b = 1,int c = 2)
{cout << "A"  << a << b << c << endl;
}void method(int a)
{cout  << "B" << a << endl;
}int main()
{method(8,8,8); // A888method(5,5); // A552
//    method(9); 错误return 0;
}

5.4 哑元函数(熟悉)

    一个函数的参数只有类型没有名字,这个参数就是哑元。包含哑元的函数就是哑元函数。

#include <iostream>using namespace std;void test(int)
{cout << "AAA" << endl;
}int main()
{
//    test(); 错误test(34897);return 0;
}

哑元函数的实际功能包括但不限于:

  • 在C++的运算符重载中区分重载函数(后面讲)。
  • 保持函数的向前兼容性。

......

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

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

相关文章

服务器数据恢复—RAID5阵列硬盘坏道掉线导致存储不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EqualLogic存储中有一组由16块SAS硬盘组建的RAID5阵列。上层划分了4个卷&#xff0c;采用VMFS文件系统&#xff0c;存放虚拟机文件。 服务器存储故障&#xff1a; 存储RAID5阵列中磁盘出现故障&#xff0c;有2块硬盘对应的指示灯亮黄灯…

25国考照片处理器使用流程图解❗

1、打开“国家公务员局”网站&#xff0c;进入2025公务员专题&#xff0c;找到考生考务入口 2、点击下载地址 3、这几个下载链接都可以 4、下载压缩包 5、解压后先看“使用说明”&#xff0c;再找到“照片处理工具”双击。 6、双击后会进入这样的界面&#xff0c;点击&…

2024年云手机推荐榜单:高性能云手机推荐

无论是手游玩家、APP测试人员&#xff0c;还是数字营销工作者&#xff0c;云手机都为他们带来了极大的便利。本文将为大家推荐几款在市场上表现优异的云手机&#xff0c;希望这篇推荐指南可以帮助大家找到最适合自己的云手机&#xff01; 1. OgPhone云手机 OgPhone云手机是一款…

浅谈RPC的实现原理与RPC实战

浅谈RPC的实现原理与RPC实战 什么是RPC?RPC框架基本原理gRPC框架介绍Http/2ProtoBuf gRPC实战一、创建项目二、导入依赖三、编写proto文件编写服务端编写客户端 什么是RPC? RPC(Remote Procedore Call)&#xff0c;及远程过程调用&#xff0c;是一种在分布式系统中用于进程间…

JeecgBoot入门

最近在了解低代码平台&#xff0c;其中关注到gitee上开源项目JeecgBoot&#xff0c;JeecgBoot官方也有比较完整的入门教学文档&#xff0c;这里我们将耕者官方教程学习&#xff0c;并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

探索开源语音识别的未来:高效利用先进的自动语音识别技术20241030

&#x1f680; 探索开源语音识别的未来&#xff1a;高效利用自动语音识别技术 &#x1f31f; 引言 在数字化时代&#xff0c;语音识别技术正在引领人机交互的新潮流&#xff0c;为各行业带来了颠覆性的改变。开源的自动语音识别&#xff08;ASR&#xff09;系统&#xff0c;如…

.eslintrc.js 的解释

如果您的项目中没有 .eslintrc.js 文件&#xff0c;您可以按以下步骤创建并配置 ESLint&#xff1a; 1. 创建 ESLint 配置文件 在您的项目根目录下创建一个新的文件&#xff0c;命名为 .eslintrc.js。 2. 配置 ESLint 规则 在 .eslintrc.js 文件中添加以下内容&#xff0c;…

【Centos】在 CentOS 9 上使用 Apache 搭建 PHP 8 教程

在 CentOS 9 上使用 Apache 搭建 PHP 8 教程 1. 更新系统 确保你的系统是最新的&#xff1a; sudo dnf update2. 安装 EPEL 和 Remi 仓库 安装 Remi 仓库以获取 PHP 8&#xff1a; sudo dnf install epel-release sudo dnf install https://rpms.remirepo.net/enterprise/…

如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?

引言 在数据管理和数据库设计中,数据去重是一个重要的课题。随着信息技术的快速发展,数据的产生速度和数量都在急剧增加,如何有效地管理和维护这些数据成为了一个亟待解决的问题。 数据去重不仅可以减少存储空间的占用,还可以提高数据查询的效率,确保数据的准确性和一致…

Java基础语法①Java特点+环境安装+IDEA使用

目录 1. Java的概念和用途 1.1 Java的概念和发展史 1.2 Java的重要性 1.3 Java的特点 2. Java环境 2.1 JVM 和 JDK 2.2 Java环境安装 2.3 安装IntelliJ IDEA并使用 2.4 IntelliJ IDEA常见快捷键 2.4.1 普通快捷键 2.4.2 调试快捷键 2.4.3 代码生成快捷键 本篇完 写…

鸿蒙ArkTS中的面向对象编程

ArkTS是TypeScriptS的超集&#xff0c;而TS又是JavaScript的超集&#xff0c;意味着有JavaScript编程基础、结合一些TypeScript的使用经验就可以很快上手ArkTS。 作为一门面向对象语言的学习&#xff0c;了解和掌握这门语言的面向对象&#xff08;封装、继承、多态&#xff09;…

来了解一下!!!——React

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;特别适合用于创建单页面应用程序&#xff08;SPA&#xff09;。它由 Facebook 维护&#xff0c;并且拥有一个活跃的社区&#xff0c;这使得 React 成为了目前最流行的前端框架之一。以下是关于 React 的一些重要信息和…

刷题(question)

Description 比赛之路多艰&#xff0c;做题方得提升。努力刷题的人在比赛中往往能取得很好的成绩&#xff0c;小红就是这样的人。 为了继续提升自己的编程实力&#xff0c;小红整理了一份刷题题单&#xff0c;并选中了题单中的 n 道编程题&#xff0c;将它们从 1 到 n 编号&a…

windows与windows文件共享

目录 基础设置主机共享文件端设置从机接受文件端设置 基础设置 1、先确保两台电脑直接能够ping通&#xff0c;这是文件共享的前提&#xff0c;如果ping不通就去查找对应的原因&#xff0c;一般都是防火墙的原因。 在ping通的情况下&#xff1a; 2、先找到高级共享设置 3、对专…

Unity3D 开发教程:从入门到精通

Unity3D 开发教程&#xff1a;从入门到精通 Unity3D 是一款强大的跨平台游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧&#xff0c;帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…

第二届新生程序设计竞赛热身赛(C语言)

A:饥饿的XP XP迷失在X星球&#xff0c;他醒来时已经很久很久很久没有吃过东西了。他突然发现身边有一张地图&#xff0c;上面有X星球上每一个食物供给点的位置。太好了&#xff0c;XP跳了起来。他决定先把肚子填饱再去寻找其他伙伴。现在已知XP的位置(X, Y)&#xff0c;以及他的…

[算法初阶]第二集 滑动窗口(已完结)

大家好啊,好久没有更新了,最近比较忙,所以来更新初阶算法,正好复习一下,感谢大家的观看,如有错误欢迎指出。 下面我们来看题目吧&#xff01; 1.209. 长度最小的子数组 这题大家想必一眼就看出了解法一暴力法 这个解法很简单 代码如下,不做多的解释 class Solution { publi…

程序《工资分类收税》

学习目标&#xff1a; 使用代码完成完成程序《工资分类收税》 题目&#xff1a; 假设税前工资和税率如下&#xff08;s代表税前工资&#xff0c;t代表税率&#xff09;&#xff1a;s<1000 t0%1000<s<2000 t10%2000<s<3000 t15%3000<s<4000 …

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇&#xff0c;住着一对年轻的恋人&#xff1a;阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样&#xff0c;有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花&#xff08;我们称之为“心之花”&…

大型音频模型:AudioLLMs

大型音频模型&#xff08;Large Audio Models&#xff0c;简称AudioLLMs&#xff09;是近年来人工智能领域的一个重要研究方向&#xff0c;它们基于深度学习和大模型架构&#xff0c;能够处理和理解复杂的音频数据。以下是对大型音频模型的研究综述&#xff1a; 1. 引言 随着…