探索c++——了解c++的魅力

前言:c++是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c++该特性的原因是c++是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c, 身具面向过程的特性。 又有本身的面向对象的特性。 

面向对象和面向过程的区别:

我们可以以将大象关进冰箱为例子。 如果是c语言的话。它只会关注将大象关进冰箱的过程——打开冰箱门, 将大象关进冰箱, 关闭冰箱。但如果是c++的话,它会关注解决这个问题的对象——人, 大象, 冰箱。 

然后c语言的函数解决的就是每一步骤如何做才能将大象装进行冰箱。c++的函数就是定义在对象的类里作为成员函数,作为这个对象解决问题的手段, 方法。

目录

命名空间

域操作符

展开命名空间

c++的输入和输出

缺省参数

 函数重载

引用

内联函数

空指针nullptr


命名空间

命名空间解决的是变量重命名的问题。 在c语言中,当我们向定义一个变量, 这个变量的变量名和库中的函数或者其他重复了。

#include<stdlib.h>int main()
{int rand;//这时会和stdlib.h中的rand生成随机数函数重复。 c语言除了将变量名改掉没有办法。return 0;
}

 可能这个问题你认为只要改一下变量名就好了。但是如果是在公司之中。 那个时候许多人共同开发一个程序。 不可避免地会有变量名重复的问题。 如果事先商量好说“谁谁谁这么取名, 谁谁谁那么取名。”或者说如果两个人定义的变量名冲突后就商议一下谁改掉谁的程序中所有的这个变量的变量名。 这个就太烦了。 所以本贾尼大佬针对这个问题就创建出来了命名空间, 有效的解决了这个问题。 

域操作符

namespace name
{int A() {return 1;}
}int main() 
{int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。cout << A << endl;return 0;
}

想要使用命名空间内的函数或者变量。 有两种方法:一种是使用“::”作用域操作符一种是直接将作用域展开。

namespace name
{int A() {return 1;}
}int main() 
{//int A = 0;//因为A函数是在命名空间name中定义的。 所以函数A不会和这里的变量A重命名。name::A();//::前面加作用域, 如果是全局就不写作用域return 0;
}

::前面加作用域, 如果是全局就不写作用域

这里打印的A前面加了域操作符。 且查找的是全局

展开命名空间

我们正常情况下直接包含头文件

#include<iostream>int main() 
{int i = 0;cout << i << endl;//编译不过return 0;
}

这样是编译不过的, 因为cout 和 endl都被包含在std命名空间中。 std命名空间就是c++的标准库命名空间。 

想要使用cout 和endl必须用与操作符在std中寻找使用。 或者直接将std展开

#include<iostream>
using namespace std;//using 就是展开空间int main() 
{int i = 0;cout << i << endl;//此时可以编过return 0;
}

using就是命名空间展开的关键字。 using后面加命名空间就可以将一个命名空间展开。 或者加命名空间中的一个函数或其他成员。 意思就是将其从命名空间中展开到全局。 


#include<iostream>
using std::cout;
using std::endl;int main() 
{int i = 0;cout << i << endl;//编译不过return 0;
}

 这样也可以, 这样只展开了cout和endl。

c++的输入和输出

从上面我们已经看到了输出 对象"cout", 它是标准输出对象终端, 或者说是控制台。 

然后我们再看一下输入 "cin",它是标准输入对象

<< 是流插入操作符。 "cout << 数据" 的意思就是将数据输出到终端, 好处就是自行判断输出数据的类型。 

>> 是流提取操作符。"cin >> 内存"的意思就是将流中的数据输入到内存中, 好处也是自行判断格式,不需要自行判断

endl标识换行输出。 

以上都包含在iostream头文件中的std命名空间中。

缺省参数

#include<iostream>
using namespace std;
int Add(int x = 0, int y = 0) 
{return x + y;
}int main() 
{int a = 1;int b = 1;int ret1 = Add();//输出0int ret2 = Add(a, b);//输出2cout << ret1 << "\n" << ret2 << endl;return 0;
}

当我们调用函数时没有进行传参时, 函数如果定义了缺省参数, 那么这个被调用的函数就会使用缺省参数。 

如图中

 这个int x = 0, int y = 0就是缺省参数定义的方式。 

然后, 当我们传参时如果没有传参, 就像图中的第一次调用

这个时候就会使用缺省参数。 x 为0, y 也是0。所以计算出来的就是0。

上面定义的是全缺省参数定义缺省参数时也可以半缺省

#include<iostream>
using namespace std;
int Add(int x, int y = 0) 
{return x + y;
}int main() 
{int a = 1;int b = 1;int ret1 = Add(a);//输出1cout << ret1 << endl;return 0;
}

半缺省参数是从右向左定义的 ,向这个图中的Add函数就是定义的y为半缺省。 注意不能定义x为半缺省。定义半缺省要从右向左!

 函数重载

c++函数重载是很重要的一个知识点。就是说可以同时存在多个同名的函数。只要他们的参数个数不同或者参数的类型不同,或类型顺序不同这时, 这些函数就构成函数重载。

#include<iostream>
using namespace std;
int Add(int x, int y) //这两Add函数构成函数重载
{return x + y;
}double Add(double x, double y) //
{return x + y;
}int main() 
{int ret1 = Add(1, 2);double ret2 = Add(1.1, 2.2);cout << ret1 << " " << ret2 << endl;return 0;
}

这串代码中两个Add函数就构成了函数重载。 因为他们的参数类型不同。

注意:编译器这里分辨不同函数不是通过返回类型。 而是通过参数类型 参数个数不同类型参数顺序。它的分辨本质就是将函数转函数一种符号表的形式。 

假如

转化后就类似于:Addii  ,这里的Add是函数名。 ii是标识两个类型。i是int首字母。

这个就转换为Adddd, Add同样是函数名, dd是两个类型。 d是double首字母

这里的具体转换规则是什么我并不清楚。 只是意思就是这个意思。 有兴趣的话可以去查找相关资料

引用

大件来了!

引用, 为了避免使用指针而创造出来的一个类似于指针的语法。

引用就是一个变量的别名。 

 引用是变量的别名。 我们可以想象a 和 b共同代表着一个空间a的数据改变。 b也就改变了。

有了引用后, 我们交换函数就有了另一种定义方法:

这里形参x 是a的别名,语法上x就是ay是b的别名,语法上y就是b。所以交换x和y的值, 就交换了a和b的值。 

内联函数

内联函数inline + 函数定义

内联函数宏定义函数对应。 

宏定义在预处理阶段通过代码替换。来达到简单的函数的作用,提高行能。但是宏也有没有类型检查无法调试等缺点。

内敛函数在拥有着宏定义的优点:同样不用调用函数,直接将代码在原调用位置展开,提高性能。 

内联函数是在编译阶段,将函数体在原调用位置展开。 

内联函数不能将声明和定义定义在不同的文件之中。 否则可能报错。 

对于内联函数, 一般建议函数规模较小不是递归不是频繁调用。 否则编译器可能不会将内联函数展开, 而是直接调用内联函数

空指针nullptr

空指针nullptr是为了弥补NULL的错误。 

NULL可能标识空地址。 但是也有可能标识0.但是nullptr只有一种含义:无类型的地址0。

注:nullptr是c++11引入的关键字。 不需要包含头文件。 

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

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

相关文章

软考高级:UML 图 结构图、行为图和交互图 概念和题目

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Vue3+Vue Router使用<transition>过渡动画实现左右分栏后台布局

摘要 利用Vue3及其配套的Vue Router实现后台管理系统中的页面过渡动画。文章首先简要介绍了Vue3的特性和Vue Router的基本用法&#xff0c;利用Vue3提供的组件以及Vue Router的路由钩子函数来实现页面过渡效果。 代码结构 在 components 里有4个组件&#xff0c;其中 Layout…

笔记本上使用usb蓝牙适配器

注意 必须先禁用笔记本上原来的蓝牙功能 禁用笔记本原来的蓝牙功能 使用usb蓝牙适配器

LVS集群---二

1.LVS工作模式和相关命令 1.1LVS集群工作模式 - lvs-nat&#xff1a;修改请求报文的目标IP,多目标IP的DNAT- lvs-dr&#xff1a;操纵封装新的MAC地址&#xff08;直接路由&#xff09;- lvs-tun&#xff1a;隧道模式 1.1.1 LVS的NAT模式 lvs-nat&#xff1a;本质是多目标IP的…

openssl3.2 - exp - 产生随机数

文章目录 openssl3.2 - exp - 产生随机数概述笔记END openssl3.2 - exp - 产生随机数 概述 要用到openssl产生的随机数, 查了资料. 如果用命令行产生随机数, 如下: openssl rand -hex -num 6 48bfd3a64f54单步跟进去, 看到主要就是调用了一个RAND_bytes(), 没其他了. 官方说…

人工智能在信息系统安全中的运用

一、 概述 对于企业和消费者来讲&#xff0c;人工智能是非常有用的工具&#xff0c;那又该如何使用人工智能技术来保护敏感信息?通过快速处理数据并预测分析&#xff0c;AI可以完成从自动化系统到保护信息的所有工作。尽管有些黑客利用技术手段来达到自己的目的&#xff0c;但…

华为数通方向HCIP-DataCom H12-821题库(多选题:101-120)

第101题 下面关于Network-Summary-LSA描述正确的是 A、Network-Summary-LSA中的Metric被设置成从该ABR到达目的网段的开销值 B、Network-Summary-LSA中 的Netmask被设置成目的网段的网络掩码 C、Network-Summary-LSA中的Link State ID被设置成目的网络的IP地址 D、Network-Sum…

【AI视野·今日Robot 机器人论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 6 Mar 2024 Totally 30 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;SpaceHopper,外星探索多功能三足机器人 (from Robotic Systems Lab, ETH Zurich) Daily Robotics Papers A Safety-Criti…

JavaSE——基础小项目-模拟ATM系统(项目主要目标、技术选型、架构搭建、具体实现、完整代码注释)

目录 项目主要目标 技术选型 面向对象编程 使用集合容器 程序流程控制 使用常见API 系统架构搭建与欢迎页设计 Account ATM Test 用户开户功能实现 录入账户名称与性别 录入账户密码与取现额度 生成新卡号 存入账户 登录功能实现 登录后操作实现 退出账户 存…

每日学习总结20240306

每日总结 20240306 1. 断言测试判断 #include <iostream> #include <assert.h> #include <cassert> #include <stdio.h>#define STR_OK "[\x1b[1;32m OK \x1b[0m]" #define STR_FAIL "[\x1b[1;31mFAIL\x1b[0m]"…

Open3D 生成空间3D椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 设椭圆在 X O Y XOY XO

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

短视频矩阵系统技术开发商--支持技术资质核验(自研独立saas框架开发)

短视频矩阵系统是一种能够帮助用户快速制作、发布和推广短视频的系统。 &#x1f347;&#x1f347;它通常包括以下部分&#xff1a; 短视频矩阵系统#短视频矩阵系统源头#短视频矩阵系统源头开发#短视频矩阵系统软件#短视频矩阵系统技术#2024互联网风口项目短视频矩阵系统带动…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

css-通用样式按钮加号

1.实现 2.代码 html <div class"addF">&#xff0b;</div> css .addF{width:40px;font-size:25px;font-weight:600;background-color:rgb(64, 158, 255);text-align:center;color:white;height:34px;border-radius:3px;line-height:34px; }

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…

航天民芯一级代理 MT3608 MT3608L 升压转换器 1.2MHZ

MT3608/MT3608L是恒定频率的6引脚SOT23电流模式升压转换器&#xff0c;适用于小型、低功耗应用。MT3608在1.2MHz&#xff0c;允许使用微小、低成本的频率高度不超过2mm的电容器和电感器。内部软启动可实现较小的浪涌电流和延长电池寿命。MT3608具有自动切换到脉冲的功能轻负载下…

Echarts 配置项 series 中的 data 是多维度

文章目录 需求分析 需求 如下图数据格式所示&#xff0c;现要求按照该格式进行绘制折线图 分析 在绘制折线图时&#xff0c;通常我们的 series 中的 data 数据是这样的格式 option {title: {text: Stacked Area Chart},tooltip: {trigger: axis,axisPointer: {type: cross…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…