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.rhkb.cn/news/463529.html

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

相关文章

Vuex的基本使用

文章目录 一、Vuex概述1.是什么2.使用场景3.优势4.注意二、如何构建vuex多组件共享数据环境1.创建项目2.创建三个组件3.源代码三、vuex 的使用 - 创建仓库1.安装 vuex2.新建 `store/index.js` 专门存放 vuex3.创建仓库 `store/index.js`4 在 main.js 中导入挂载到 Vue 实例上5.…

WPF+MVVM案例实战(二十一)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

揭开广告引擎的神秘面纱:如何在0.1秒内精准匹配用户需求?

目录 一、广告系统与广告引擎介绍 &#xff08;一&#xff09;广告系统与广告粗分 &#xff08;二&#xff09;广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 &#xff08;一&#xff09;一般概述 &#xff08;二&#xff09;核心功能架构图 三、标…

[论文阅读]A Survey of Embodied Learning for Object-Centric Robotic Manipulation

Abstract --以对象为中心的机器人操纵的Embodied learning是体现人工智能中一个快速发展且具有挑战性的领域。它对于推进下一代智能机器人至关重要&#xff0c;最近引起了人们的极大兴趣。与数据驱动的机器学习方法不同&#xff0c;具身学习侧重于通过与环境的物理交互和感知反…

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目

自 NFTScan Site 上线以来&#xff0c;它迅速成为 NFT 市场中的一支重要力量&#xff0c;凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性&#xff0c;为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…

指数分布的原理和应用

本文介绍指数分布&#xff0c;及其推导原理。 Ref: 指数分布 开始之前&#xff0c;先看个概率密度函数的小问题&#xff1a; 问题描述&#xff1a;你于上午10点到达车站&#xff0c;车在10点到10:30 之间到达的时刻 X 的概率密度函数如图&#xff1a; 则使用分段积分&#xff0…

Javase——正则表达式

正则表达式的相关使用 public static void main(String[] args) {//校验QQ号 System.out.println("3602222222".matches("[1-9][0-9]{4,}"));// 校验18位身份证号 System.out.println("11050220240830901X".matches("^([0-9]){7,18}…

安装中文版 Matlab R2022a

下载安装包 压缩包有点大&#xff0c;大概20G 百度网盘&#xff1a;下载链接 提取码&#xff1a;rmja 安装 解压后打开目录&#xff0c;右键以管理员身份运行 setup.exe 选择输入安装秘钥 输入秘钥&#xff1a; 50874-33247-14209-37962-45495-25133-28159-33348-18070-6088…

SICTF Round #4|MISC

1.派森 腐乳昂木 奥普瑞特儿 阴坡尔特 艾克斯奥尔 腐乳昂木 提克有第爱慕 阴坡尔特 ⭐ 弗拉格 等于 布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉 印刻 等于 左中括号右中括号 佛儿 唉 因 梯软者左括号 零&#xff0c;楞左括号弗拉格右…

保研考研机试攻略:python笔记(2)

&#x1f428;&#x1f428;&#x1f428;宝子们好呀&#xff0c;今天我们继续来学习N诺提供的python笔记&#xff0c;fighting&#xff01;( •̀ ω •́ )✧ 对这个系列感兴趣的宝子欢迎关注保研考研机试攻略专栏哦 ~ 目录 &#x1f428;&#x1f428;&#x1f428;4进制转…

Hyper-V 安装 KylinOS V10【图文教程】

文章目录 下载 KylinOSHyper-V 安装 KylinOS新建虚拟机配置虚拟机启动虚拟机并配置下载 KylinOS KylinOS 没有直接提供下载地址,需要在页面上点试用,填写个人信息后,才能看到下载地址。 https://www.kylinos.cn/support/trial.html?trial=425887 试用地址:产品试用申请国…

LeetCode 0685.冗余连接 II:并查集(和I有何不同分析)——详细题解(附图)

【LetMeFly】685.冗余连接 II&#xff1a;并查集&#xff08;和I有何不同分析&#xff09;——详细题解(附图) 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection-ii/ 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&…

mysql查表相关练习

作业要求&#xff1a; 单表练习&#xff1a; 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监&#xff0c;和…

GHuNeRF: Generalizable Human NeRF from a Monocular Video

研究背景 研究问题&#xff1a;这篇文章要解决的问题是学习一个从单目视频中泛化的人类NeRF模型。尽管现有的泛化人类NeRF已经取得了令人印象深刻的成果&#xff0c;但它们需要多视图图像或视频&#xff0c;这在某些情况下可能不可用。此外&#xff0c;一些基于单目视频的人类…

Linux - grep的正则用法

新建u.txt&#xff0c;文本内容如图&#xff1a; 搜寻特定字符串 利用中括号[]搜寻集合字符 行首与行位字符^$ 任意一个字符.与重复字符*限定连续RE字符范围{} 总结:

项目模块十五:HttpResponse模块

一、模块设计思路 存储HTTP应答要素&#xff0c;提供简单接口 二、成员变量 int _status; // 应答状态码 unordered_map<string, string> _headers; // 报头字段 string _body; // 应答正文 bool _redirect_flag; // 是否重定向信息 stri…

从零开始的c++之旅——继承

1. 继承 1.继承概念及定义 继承是面向对象编程的三大特点之一&#xff0c;它使得我们可以在原有类特性的基础之上&#xff0c;增加方法 和属性&#xff0c;这样产生的新的类&#xff0c;称为派生类。 继承 呈现了⾯向对象程序设计的层次结构&#xff0c;以前我们接触的…

6.1、实验一:静态路由

源文件获取&#xff1a;6.1_实验一&#xff1a;静态路由.pkt: https://url02.ctfile.com/f/61945102-1420248902-c5a99e?p2707 (访问密码: 2707) 一、目的 理解路由表的概念 会使用基础命令 根据需求正确配置静态路由 二、准备实验 1.实验要求 让PC0、PC1、PC2三台电脑…

logback日志级别动态切换四种方案

生产环境中经常有需要动态修改日志级别。 现在就介绍几种方案 方案一&#xff1a;开启logback的自动扫描更新 配置如下 <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"60 seconds" debug…

Qt字符编码

目前字符编码有以下几种&#xff1a; 1、UTF-8 UTF-8编码是Unicode字符集的一种编码方式(CEF)&#xff0c;其特点是使用变长字节数(即变长码元序列、变宽码元序列)来编码。一般是1到4个字节&#xff0c;当然&#xff0c;也可以更长。 2、UTF-16 UTF-16是Unicode字符编码五层次…