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云手机是一款…

JeecgBoot入门

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

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 代码生成快捷键 本篇完 写…

windows与windows文件共享

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

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

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

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

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

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

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

Move Dev Meetup@Beijing圆满结束,发掘Move生态新机会

Sui、Aptos 、Rooch 和 zkMove等为代表的 Move 生态在 2024 年展现出强劲的生命力和发展速度。随着技术的持续演进&#xff0c;Move 语言的独特优势吸引了大量优质项目、开发者、投资者和爱好者的参与&#xff0c;共同推动生态建设和创新应用。新一轮技术革新已经开启&#xff…

Python | Leetcode Python题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution(object):def isValidBST(self, root):"…

数字经济赋能新质生产力数据集-dta格式(2012-2022年)

数据简介&#xff1a;新质生产力以新发展理念为思想指引&#xff0c;驱动数字经济创新发展动力、推动区域协调发展、转变发展方式、拓宽国际市场、共享数据要素&#xff0c;为数字经济高质量发展提供强大 动力支持。数字经济在发展过程中可能会存在关键性技术创新能力不足、传统…

Oracle视频基础1.4.3练习

15个视频 1.4.3 できない dbca删除数据库 id ls cd cd dbs ls ls -l dbca# delete a database 勾选 # chris 勾选手动删除数据库 ls ls -l ls -l cd /u01/oradata ls cd /u01/admin/ ls cd chris/ ls clear 初始化参数文件&#xff0c;admin&#xff0c;数据文件#新版本了…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff0c;简称JVM栈&#xff0c;又称Java方法栈&#xff09;是 JVM 运行时数据区的一部分&#xff0c;主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

Axure大屏可视化模板:赋能各行各业的数据展示与管理

如何高效、直观地展示和分析数据&#xff0c;成为企业和机构面临的重要挑战。Axure大屏可视化模板作为一种先进的数据展示工具&#xff0c;凭借其强大的交互性和直观性&#xff0c;在多个领域内得到了广泛应用。从农业生产的智能化管理到城市发展的精细化管理&#xff0c;再到企…

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景&#xff1a; Redis 数据类型及其应用场景 String&#xff08;字符串&#xff09; 特点&#xff1a;简单的值存储&#xff0c;支持二进制数据。应用场景&#xff1a; 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

java项目之洗衣店订单管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的洗衣店订单管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot的洗衣…