从C到C++

二、从C到C++

本章介绍一些C++拓展的非面向对象功能。

  1. 引用(掌握)

1.1 概念

引用从一定程度上讲是一个指针的平替,几乎被所有面向对象编程语言所使用。引用相当于对某一个目标变量起”别名“。

操作引用与操作原变量完全一样。

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

1.2 引用的性质

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

#include <iostream>using namespace std;int main()
{
    int a = 1;
    // b是a的引用
    int &b = a;
    int c = 3;
    b = c; // 3 只是赋值,不是引用,b还是a的引用    cout << a << " " << &a << endl; //3 0x61fe88
    cout << b << " " << &b << endl; //3 0x61fe88
    cout << c << " " << &c << endl; //3 0x61fe84
    return 0;
}

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

#include <iostream>using namespace std;int main()
{
    int a = 1;
//    int &b; // 错误 引用必须要初始化。    cout << a << " " << &a << endl; //3 0x61fe88    return 0;
}

  • 声明引用的时候,不能初始化为null

#include <iostream>using namespace std;int main()
{
    int a = 1;
    // int &b = nullptr; // 错误引用不能初始化为null
//    int &b = null;
    cout << a << " " << &a << endl; //3 0x61fe88    return 0;
}

  • 声明引用的时候,初始化的值可以是纯数值,但是此时要用const关键字修饰引用,表示该引用为常量引用,这样引用的值不可变。

#include <iostream>using namespace std;int main()
{
    const int &a = 1;   // 常量引用
    // a = 2; // 错误常量引用的数值不能被改变    cout << a << " " << &a << endl; //3 0x61fe88    return 0;
}

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

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

  • 可以使用const修饰引用,此时如果原变量的值改变了,引用的值也会改变。

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

1.3 引用的参数

写一个函数,函数有两个参数a和b,函数 的功能是交换两个传入的参数【原来】变量的值。

#include<iostream>
#include <string.h>
using namespace std;// 只是test1内部进行相互交换了
// 不符合需求
void test1(int a,int b)
{int t = a;
    a = b;
    b = t;
}// C语言的指针
void test2(int *a,int *b)
{*= *a^*b;*= *a^*b;*= *a^*b;
}// C++ 编程方式
void test3(int &a,int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}int main()
{int a = 1;int b = 2;test3(a,b);
    cout << a << endl;
    cout << b << endl;return 0;
}

引用作为参数进行定义的时候,在参数传递时,是不会产生副本的,这样会提高运行效率,我们在正常编程中,建议使用引用作为参数进行传递。

引用参数,在不参与计算的情况,我们建议使用const进行修饰。以达到引用安全的目的。

  1. 赋值(熟悉)

通常编程当中使用=进行赋值操作,C++新增了新的赋值语法。

#include<iostream>
#include <string.h>
using namespace std;int main()
{int a(1);   // int a = 1;
    cout << a << endl;int b(a);   // int b = a;
    cout << b << endl;int c(a+b); // int c = a + b;
    cout << c << endl;  // 2return 0;
}

C++11里对上述写法又进行了升级

#include<iostream>
#include <string.h>
using namespace std;int main()
{
    double b = 3.14;
    int b1 = b;
    int b2(b);
    int b3{b};  // C++11新增的 对数据窄化做出警告    cout << b1 << endl; // 3 数据窄化
    cout << b2 << endl; // 3 数据窄化
    cout << b3 << endl; // 3 数据窄化
    return 0;
}

  1. 键盘输入(掌握)

可以使用cin把用户在命令行中输入的内容赋值到变量中。

cin与cout一样,都属于头文件iostream中标准输入输出流。

#include<iostream>
#include <string.h>
using namespace std;int main()
{int a;// C++ 的字符串是string
    string str;    cout << "请输入一个数字和字符串:" << endl;
    cin >> a >> str ; // 接收键盘输入:一个整数和一个字符串,可以连续输入。
    cout << a << endl;
    cout << str << endl;return 0;
}

  1. string 字符串类(掌握)

string 不是C++的基本数据类型,他是一个C++标准库中的字符串类,使用时需要引入头文件,#include<string>,而不是string.h

string在绝大多数情况下,可以替代C语言中字符串,不必担心内存是否足够,和字符串长度等,其中内部还包含了很多字符串处理函数,可以完成各种情况下的字符串处理功能。

string和C语言相同,字符串编码使用ASCII编码,不支持中文。

#include<iostream>
using namespace std;int main()
{
    string str = "helloworld";
    cout << str.size() << endl; // 10字符串长度
    cout << str.length() << endl; // 10字符串长度    cout << str[1] << endl; // e
    cout << str.at(5) << endl; // w    return 0;
}

两种方式都可以,但是在C++中更推荐你使用at函数。原因时at函数更加安全。at函数的运行效率慢。[ ]效率更高。

#include<iostream>
using namespace std;int main()
{
    string str = "helloworld";
    cout << str.size() << endl; // 10字符串长度
    cout << str.length() << endl; // 10字符串长度    // cout << str[100] << endl; // 什么都不输出,也不报错,不安全
    cout << str.at(100) << endl; // 安全的,越界会报异常。    return 0;
}

string 类支持多种遍历方式

  • 普通循环(for循环)
  • for each循环 C++11

#include<iostream>
using namespace std;int main()
{
    string str = "helloworld";
    // 以for循环的方式遍历输出字符串
    for(int i = 0; i <str.size(); i++)
    {
        cout << str.at(i);
    }
    cout << endl;    // for each的方式进行循环遍历字符串
    for(char i : str)
    {
        cout <<i;
    }    return 0;
}

  1. 函数

5.1 内联函数(掌握)

内联函数用于取代C语言中宏定义的函数。内联函数的正确使用可以提升程序的执行效率。内联函数在编译的时候,直接把函数体展开到主函数中编译,在运行期间可以减少调用的开销。(以空间换时间)

通常将具有以下性质的函数写为内联函数:

  • 代码长度5行以内。
  • 不能包含复杂的控制语句。
  • 被频繁调用

#include<iostream>
using namespace std;// 声明成-内联函数
inline void show(string str)
{
    cout << str << endl;
}int main()
{
    show("nihao");
    return 0;
}

内联函数关键字:inline

后续学习的成员函数都默认添加了inline修饰。

但是我们手动添加的inline关键字,将函数声明称内联函数。这个不是我们能决定的。我们只是给编译器提一个建议,编译器有自己的判断准则。具体是否能变成内联函数,还是编译器自己决定的。

5.2 函数重载 overload(重点)

C++中允许多个函数使用同一个名称,这种写法就是函数重载。函数重载要求函数名称相同,但是参数不同(类型或者数量)或者前后顺序不同。与返回值和其他因素无关。

#include <iostream>
using namespace std;void print_show(int i,double d)
{
    cout << "调用了int重载" << i << endl;
}//void print_show(double d)
//{
//    cout << "调用了double重载" << d << endl;
//}//void print_show(float f)
//{
//    cout << "调用了float重载" << f << endl;
//}void print_show(string str)
{
    cout << "调用了string重载" << str << endl;
}int main()
{
    print_show(6,5.4);
    return 0;
}

5.4 哑元函数(熟悉)

函数的参数只有类型,没有名称,有这样的参数的函数就是哑元函数。

#include <iostream>
using namespace std;// 哑元函数
void print_show(int)
{
    cout << "调用了int重载" << endl;
}void print_show(string str)
{
    cout << "调用了string重载" << str << endl;
}int main()
{
    print_show(6);  // 尽管函数内不用参数,但是还是需要传递参数
    return 0;
}

作用1:哑元函数用来区分函数重载。

作用2:运算符重载中会用到。

#include <iostream>
using namespace std;// 哑元函数
void print_show(int i,int)
{
    cout << "调用了int1重载" << endl;
}void print_show(int i)
{
    cout << "调用了int2重载" << endl;
}void print_show(string str)
{
    cout << "调用了string重载" << str << endl;
}int main()
{
    print_show(6,1);  // 尽管函数内不用参数,但是还是需要传递参数
    return 0;
}

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

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

相关文章

12 单口RAM IP核

RAM IP 核简介 RAM 是随机存取存储器&#xff08;Random Access Memory&#xff09;的简称&#xff0c;它是一种易失性存储器&#xff0c;RAM 工作时可以随时从任意一个合法地址写入或读取数据。 Vivado 软件自带的 Block Memory Generator IP 核&#xff08;缩写为 BMG&#…

linux centos7.9改dns和ip

vi /etc/sysconfig/network-scripts/ifcfg-ens32 &#xff1a;wq后 重启网络服务 systemctl restart network —————————————————————————— 篇外话题 软件下载 xshell可以从腾讯软件中心下载

哈登谈失利:这是我们所有人的责任 不能在主场领先18分然后输球

nba直播吧地址&#xff1a;www.gznuqsxy.cn 2月29日讯 今天结束的一场NBA常规赛&#xff0c;快船在主场112比116被湖人逆转。赛后哈登接受了媒体的采访。 哈登谈到了这场失利&#xff1a;“这是我们所有人的责任。这是一场令人失望的失利。你不能在主场领先18分然后让出一场胜…

T - SQL使用事务 及 在Winform使用事务

事务适用场景 1 事务使用在存储过程中&#xff0c;直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl&#xff1a;使用事务转账操作的实例 一般都会找一个变量记录错误的个数&#xff0c;error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…

逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例

补充知识&#xff1a;进行AES解密需要知道四个关键字&#xff0c;即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的&#xff0c;m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文&#xff1a; 一般思…

5G网络介绍

目录 一、网络部署模式 二、4/5G基站网元对标 三、4/5G系统架构对比 四、5G核心单元 五、边缘计算 六、轻量化&#xff08;UPF下沉&#xff09; 方案一&#xff1a;UPF下沉 方案二&#xff1a;UPF下沉 方案三&#xff1a;5GC下沉基础模式 方案四&#xff1a;…

浅谈 Linux 网络编程 socket

文章目录 socket 介绍 socket 介绍 socket 被翻译成 网络套接字&#xff0c;这个名字实在是不好理解&#xff0c;我更愿意称为"插槽"。 忽略 socket 的中文名&#xff0c;先无脑记住两个规则&#xff1a; ① 记住&#xff0c;一个文件描述符(fd) 指向一个 socket&…

力扣550 游戏玩法分析 IV

目录 题目描述 思路整理 1. 首次登录日期 2. 第二天登录 3. 计算比率 实现思路 完整代码及解释 题目描述 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | ev…

雾锁王国Enshrouded服务器CPU内存配置怎么选择?

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

代码随想录训练营第32天 | LeetCode 122.买卖股票的最佳时机 II、LeetCode 55.跳跃游戏、LeetCode 45.跳跃游戏 II

目录 LeetCode 122.买卖股票的最佳时机 II 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机 II_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 55. 跳跃游戏 文…

Keepalived介绍、架构和安装

Keepalived介绍、架构和安装 文章目录 Keepalived介绍、架构和安装1.Keepalived&#xff08;高可用性服务&#xff09;1.1 Keepalived介绍1.2 Keepalived 架构1.3 Keepalived 相关文件 2.Keepalived安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙…

DPU是什么?

问题描述&#xff1a; DPU是什么&#xff1f; 解答&#xff1a; DPU&#xff08;Data Processing Unit&#xff09;是以数据为中心构造的专用处理器&#xff0c;采用软件 定义技术路线支撑基础设施层资源虚拟化&#xff0c;支持存储、安全、服务质量管理等 基础设施层服务。…

基于x86架构的OpenHarmony应用生态挑战赛等你来战!

为了更快速推进OpenHarmony在PC领域的进一步落地&#xff0c;加快x86架构下基于OpenHarmony的应用生态的繁荣&#xff0c;为北向应用开发者提供一个更加便捷的开发环境&#xff0c;推动OpenHarmony北向应用开发者的增加&#xff0c;助力OpenHarmony在PC领域实现新的突破&#x…

buuctf_N1BOOK_粗心的小李

题目&#xff1a; 看完题目&#xff0c;git下载文件&#xff1f;然后将.git文件传到线上环境&#xff1f;&#xff08;which 会造成git泄露的安全威胁&#xff09;<这个背景抱歉我不太了解哈&#xff0c;可能后续有补充> 这里主要记录做法过程&#xff1a; 工具&#xf…

javaWeb个人学习02

会话技术 会话: 用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中包含多次请求和响应 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一个浏览器,以便在同一次会话的多次请求之间共享数据 会话跟踪方案: …

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

React中使用useActive

1.引入 import { useActivate } from "react-activation";2.React Activation 在React中使用react-activation,其实就是类似于Vue中的keep-alive&#xff0c;实现数据的缓存&#xff1b; 源码&#xff1a; import { ReactNode, ReactNodeArray, Context, Component…

数据库的基本操作

数据库的基本操作 1创建数据库与查看数据库 创建数据库之前&#xff0c;先查看数据库&#xff1a; 然后使用命令行创建数据库&#xff1a; 再次查看数据库&#xff0c;发现多了一个数据库&#xff1a; 查看数据库基本信息&#xff1a; 2修改数据库 注意&#xff0c;修改…

Git自动忽略dll文件的问题

检查了半天发现是sourcetreee的全局忽略文件导致&#xff0c; 从里面删除dll即可。 我是干脆直接删了全局忽略&#xff0c;太恶心了&#xff0c;如下&#xff1a; #ignore thumbnails created by windows Thumbs.db #Ignore files build by Visual Studio *.exe .vsconfig .s…

使用全局事件总线实现任意组件间的通讯

本文以vue2中爷孙组件通讯为例&#xff0c;需求是点击孙组件的按钮&#xff0c;实现关闭爷组件的弹窗。 全局事件总线是通过Vue实例的事件系统来实现组件之间的通讯&#xff0c;可以方便地在任何组件中进行事件的触发和监听。 以下是使用全局事件总线实现爷孙组件通讯的步骤&a…