c++的学习之路:2、入门(1)

一、 C++关键字

c++的关键字要比c语言要多31个足足有63个,这里我只是了解了下每个有啥作用,具体使用方法以及更多的知识将在后续学习中,慢慢扩展使用,下方表格就是c++的63个关键字

asmdoifreturntryauto
doubleinlinetypedefdynamic_castinttypeid
publicbreakelselongsizeoftypename
throwcaseenummutablestaticwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructfriendclass
externoperatorswitchregisterconstfalse
privatetemplatetrueconst_castprotectedthis
whiledeletegotoreinterpret_castshortfor
boolsignedunionusingfloatvolatile
voidvirtualcontinue

二、命名空间

在刚学习c语言的时候,我遇到过定义了重复的变量名或者函数名,那时候喜欢都定义成a、b这些经常出现重定义,要不就是和库函数相同了,但是在c++中,提出了命名空间这个概念,他的大概意思就是把一块函数或者变量封存在一起,例如下方代码演示,就会出现如图所示的错误,这是就可以使用命名空间。

#include <iostream>
using namespace std;
int a = 0;

int a = 1;

int main()
{
    cout << a << endl;
    return 0;
}

如下图就是命名空间的最简单使用,说白了就是相当于重新建立了一个范围,并且把这块空间的变量啊函数啊等等的都包含在这里面,相当于一个库函数,但是不通过:: 这个符号的访问会找不到,这个符号前面就是需要寻找的空间名,也就是namespace命名的空间,如代码中LY1就是一个命名,这个命名可以自定义,我比较喜欢用我的名字缩写,所以之后的命名空间不出意外应该都是这样类型的。

#include <iostream>
using namespace std;
namespace Ly1
{
    int a = 0;
}

namespace Ly2
{
    int a = 1;
}

int main()
{
    cout << Ly1::a << endl;
    cout << Ly2::a << endl;
    return 0;
}

好了上文讲了为啥会有命名空间,那么接下来将讲下命名空间的三种用法 

1、加命名空间名称及作用域限定符

如上文中代码 cout << Ly1::a << endl;cout << Ly2::a << endl;这两句就是访问LY1和LY2进行打印输出两个空间a的数值就是加加命名空间名称及作用域限定符的使用方法,就不过多讲了,一般会用就可以。

2、使用using进行全部展开

如上文代码using namespace std;这个就是全部展开,这样我在下面使用cout和endl时就不需要再加上作用域限定符。

3、使用using部分展开

这个就如下代码和测试结果就是部分展开的使用,展开了所以a在使用中就不需要加上作用域限定符了,而b加上了,c没加上所以就报错了,没有找到c,为什们会有全展开和部分展开,因为在使用过程中,如果每一步都加上作用域限定符会显得很麻烦,所以在确定某个函数或者变量经常使用又不会出现重复时就可以进行部分展开或者全部展开方便进行使用。

namespace Ly1
{
    int a = 0;
    int b = 1;
    int c = 2;
}
using Ly1::a;
int main()
{
    cout << a << endl;
    cout << Ly1::b << endl;
    cout << c << endl;
    return 0;
}

命名空间是可以进行嵌套的,如下方代码 和测试结果就是找不到b变量,那是因为在Ly1这个空间里是Ly2并不是b所以要想a变量那要嵌套访问才能找到。

namespace Ly1
{
    namespace Ly2
    {
        int a = 0;
        int b = 1;
        int c = 2;
    }
}
int main()
{
    cout << Ly1::Ly2::a << endl;
    cout << Ly1::b << endl;
    return 0;
}

三、 C++输入&输出

输入和输出这是每个编程语言都会有的,例如c语言的scanf和printf,c++的就是cout和cin,他就是控制台输出和控制台输入,是一种流输入输出,就像c语言的文件管理时,要先调用file,想要使用文件就先要打开流一样,这里c++的输入与输出是可以自动识别类型的,这点就比c语言要人性一点,代码使用与测试结果如下,如图就是这个输入输出的使用,endl就是换行,值得一提是,他的流入与流出就是>><<这两个,这个在c语言中是位移操作,这里是向左就是流入,向右就是流出。

int main()
{
    int a = 1;
    double b = 2.22;
    cout << a << endl;
    cout << b << endl;
    cin >> a;
    cin >> b;
    cout << a << endl;
    cout << b << endl;
    return 0;
}                                    

四、 缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,这个最能体现的就是当时我学数据结构时,有个单链表用数组组成的,当时有个容量,我是在初始化就开辟了一点空间,但是只有4个字节,如果我想要存入100个int型的数据就要先开辟,那么这个缺省参数就可以很好的解决这个问题,因为当我知道有100个需要存储的数据,就可以直接给定100,直接开辟,省了很多消耗,下面我将讲下缺省参数的几种使用方式以及注意事项。

第一种就是如图这样不给函数参数就直接使用函数的形参

第二种就是给定参数,这时函数就使用实参的值,如图所示

接着就是第三种再有很多个形参时,是怎么使用,如图就是当有三个参数时,怎么使用,他还是有参数传递过来时使用实参的值,没有还是使用形参,但是这里要注意必须从右到左省略,不能传了a和c不传b,也不能传传后面不传a的,具体为啥,我也不知道,这就是c++规定的,而且还不能同时定义形参的值,就是不能在函数里定义了缺省参数,却又在声明时有定义一遍,c++也规定了只能在声明中定义,也就是当有声明时 ,只能在定义中声明,不能在函数中定义。


五、 函数重载

函数重载这个也是个很方便的,在c语言中如果有两个同样函数名的函数时也会报错,他在编译时会找不到使用那个函数,但是c++不一样,假如我定义两个ADD函数,一个加整数,一个加小数,就可以这样使用,代码与测试结果如图,就可以同时使用,这里就可以看出c++支持函数重名。

int ADD(int a, int b)
{
    return a + b;
}

double ADD(double a, double b)
{
    return a + b;
}

int main()
{
    int a = 1, b = 2;
    double c = 1.1, d = 2.2;
    cout << ADD(a, b) << endl;
    cout << ADD(c, d) << endl;
    return 0;
}

但是这个使用也是有限制:
1、参数类型不同

参数类型不同这个很好理解就如上文代码就是参数类型不用,int和double就是不同的类型。

2、参数个数不同

参数个数不同这个如下代码,一个两个一个三个就是参数类型不同,当然具体几个没有要求

int ADD(int a, int b)
{
    return a + b;
}

int ADD(int a, int b,int c)
{
    return a + b+c;
}

int main()
{
    int a = 1, b = 2,c=3;
    cout << ADD(a, b) << endl;
    cout << ADD(a,b,c) << endl;
    return 0;
}

3、参数类型顺序不同

参数顺序不同就是怎么说呢,直接上代码,这种就是参数类型不同,第一个就是double在前,第二个就是double在后,这种也是可以使用函数重载。

void Print(double a, int b)
{
    cout <<a << endl;
    cout << b << endl;
}

void Print(int a, double b)
{
    cout << a << endl;
    cout << b << endl;
}

int main()
{
    Print(6.66, 6);
    Print(6, 6.66);
    return 0;
}

还有一点就是函数重载他是在编译的时候找到对应函数的地址如下图汇编代码,两个call就是对应函数的地址。

这个函数在编译的时候是把函数名称提换成别的名字,如下图就是在Windows环线中编译报错提示找不到这个函数,也就是这个函数替换后的名字,具体怎么命名的我也不太清楚,Linux后期学了,会放Linux的命名规则图的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode题练习与总结:接雨水

一、题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

【MySQL】3.1MySQL索引的介绍

目录 一、索引的概念 数据库索引 索引的作用 索引的副作用 索引创建的原则&#xff08;应用场景&#xff09; 适合建立索引 二、索引的分类和创建 1.普通索引 创建普通索引 1.1直接创建 1.2修改表结构的方式创建普通索引 1.3创建表时创建普通索引 2.唯一索引 2.1…

如何在Android设备上运行深度网络

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; 下一篇&#xff1a; 介绍 在本教程中&#xff0c;您将了解如何使用 OpenCV 深度学习模块在 Android 设备上运行深度学习网络。教程是为 Android Studio 2022.2.1 编写的。…

实时数仓之实时数仓架构(Doris)

目前比较流行的实时数仓架构有两类,其中一类是以Flink+Doris为核心的实时数仓架构方案;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对Flink+Doris架构进行介绍,这套架构的特点是组件涉及相对较少,架构简单,实时性更高,且易于Lambda架构实现,Doris本身可以支…

c++编写菱形图和计算100~200之间的素数

c编写菱形图 #include <stdio.h> int main() {int i,j,k,n;printf("请输入n:\n");scanf("%d",&n);for(i1;i<n;i){for(k1;k<n-i;k)printf(" ");for(j1;j<2*i-1;j)printf("*");printf("\n");}for(i1;i<…

【Charles如何对手机APP进行抓包和弱网测试】

一、Charles对APP抓包 1、前提条件&#xff1a; 1&#xff09;电脑上必须安装Charles工具&#xff0c;如没有安装可参考&#xff1a;【Charles抓包工具下载安装详细操作步骤】-CSDN博客 2&#xff09;手机和电脑必须在同一个局域网内&#xff08;连接同一个WiFi&#xff09;…

【java多线程】线程基础知识笔记

目录 1、多线程介绍 2、线程 3、线程的调度 4、线程的生命周期 5、线程的并行与并发 6、程的同步与异步 1、多线程介绍 多线程&#xff1a;指的是这个程序&#xff08;一个进程&#xff09;运行时产生了不止一个线程&#xff0c;是Java语言的重要特性&#xff0c;大量应用于…

[Linux开发工具]——gcc/g++的使用

Linux编译器——gcc/g的使用 一、快速认识gcc/g二、程序的翻译过程2.1 预处理&#xff08;.i文件&#xff09;2.2 编译&#xff08;.s文件&#xff09;2.3 汇编&#xff08;.o文件&#xff09;2.4 链接&#xff08;生成可执行文件或库文件&#xff09; 三、认识函数库3.1 静态库…

一大波新型勒索病毒来袭(更新)

目前勒索病毒仍然是全球最大的威胁&#xff0c;最近一年针对企业的勒索病毒攻击越来越多&#xff0c;大部分勒索病毒是无法解密的&#xff0c;一定要保持高度的重视&#xff0c;近期又有一大波新型勒索病毒来袭...... HildaCrypt勒索病毒 加密后的文件后缀名HCY&#xff0c;如…

qt 置顶窗口崩溃无法退出解决,停止运行快捷键设置

有时置顶窗口调试崩溃需要快捷键进行关闭&#xff0c;如下设置即可 这样就可以通过全局快捷键退出了&#xff0c;避免置顶崩溃无法关闭程序的问题。

《系统架构设计师教程(第2版)》第7章-系统架构设计基础知识-02-基于架构的软件开发方法

文章目录 1. 基于架构的软件设计&#xff08;ABSD&#xff09;1.1 概述1.2 ABSD方法的3个基础 2. 概念与术语2.1 设计元素2.2 视角与视图2.3 用例和质量场景 3. ABSD模型4. 体系结构需求4.1 需求获取4.2 标识构件4.3 架构需求评审 5. 体系结构设计5.1 体系结构设计5.2 软件体系…

8 克隆虚拟机

后期集群我们需要使用多台服务器&#xff0c;此处我们先克隆三台&#xff0c;master,slave01,slave02. 1.先关闭模版虚拟机。再选择 模版虚拟机hadoop100右击--》管理 --》克隆 2.下图中特别注意&#xff1a;建议使用集群的名字作为虚拟机名称。目前克隆主机master. 以上步骤完…

Django数据库查询

聚合查询 分组查询 F与Q查询 默认情况下,用Q包裹的两个条件,用逗号分割也是and关系 choices参数 只要某个字段的可能性是完全可以列举出来的,可以采取choices参数 该gender字段存的还是数字,但是如果数字在上面的元组列举范围内,该怎么获取对应的值,如果不在范围内,会怎…

Java学习笔记(20)

可变参数 输入的参数数量不确定 底层就是把输入的参数放进一个数组里 只能写一个可变参数如果还有其他形参&#xff0c;可变参数要放在最后写 可变参数在底层就是一个数组 Collections Addall shuffle 练习 package exercise;import java.util.ArrayList; import java.util.C…

Nacos详解,从安装到服务部署,及nginx反向代理

Nacos 安装 Windows安装 下载 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载页&#xff1a;https://github.com/alibaba/nacos…

更新数据库表中的数据

目录 update 加上各种限制条件 update update 表名set 列名1xx,列名2xx 指定更新某列数据如果不添加where子句,则为全列更新 也可以在原有基础上更新: 注意,mysql语法里不支持,必须是列名列名数值 加上各种限制条件 比如加上order by子句,where子句,limit等 这些条件对于up…

Flutter 运行 flutter doctor 命令长时间未响应

由于 Flutter 运行 flutter doctor 命令&#xff0c;会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载&#xff0c;如果没有配置国内镜像&#xff0c;可能会由于其服务器在国外导致资源下载慢或者下载不下来&#xff0c;所以出现了运行 flutter doctor 命令…

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…

算法复杂度的介绍

算法复杂度简介 复杂度也叫渐进复杂度&#xff0c;包括时间复杂度和空间复杂度&#xff0c;用来分析算法执行效率与数据规模之间的增长关系&#xff0c;可以粗略地表示&#xff0c;越高阶复杂度的算法&#xff0c;执行效率越低。常见的复杂度并不多&#xff0c;从低阶到高阶有…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 Date常用方法&#xff1a; public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…