【C++入门(上)】—— 我与C++的不解之缘(一)

前言:

        学完C语言和初阶数据结构,感觉自己又行了?

接下来进入C++的学习,准备好接受头脑风暴吧。

一、第一个C++程序

        C++ 的第一个程序,梦回出学C语言,第一次使用C语言写代码;这里使用C++写第一个C++代码。

#include<stdio.h>int main()
{printf("Hello,World ! ! !\n");return 0;
}

看到这里,很疑惑?不是第一个C++程序代码吗?怎么使用C语言来写呢?

         这里C++兼容C语⾔绝⼤多数的语法,所以C语⾔代码也可以运行,C++文件后缀为.cpp,vs编译器对后缀为 .cpp的文件就会调⽤C++编译器编译;linux下要⽤g++编译,不再是gcc。

当然呢,C++ 也有自己的输入输出,来看使用C++代码实现第一个C++程序:

#include<iostream>int main()
{cout << "Hello World!!!" << endl;return 0;
}

在接下来的学习中,一一来学习C++这些知识。

二、命名空间

        2.1、命名空间的作用

        在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。

        使用命名空间的目的就是对标识符的名称进行本地化,来避免命名冲突或,namespace关键字的出现就是针对命名冲突这种问题的。

在C语言中,类似与下面程序这样的命名冲突,是一个普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”printf("%d\n", rand);return 0;
}

        2.2、namespace的定义

  1. 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等等。
  2. namespace本质上是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand就不存在冲突(可以解决如上图所示命名冲突问题)。
  3. C++ 中域有函数局部域、全局域、命名空间与和类域;域影响的编译时语法查找一个变量/函数/类型出处(声明和定义)的编辑,所以有了域的隔离,名字冲突问题就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量的生命周期。
  4. namespace只能定义在全局,当然,也可以嵌套定义。
  5. 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
  6. C++ 标准库都放在一个叫 std(standard)的命名空间里。

定义命名空间:

#include<stdlib.h>namespace HL
{int rand = 0;int Add(int x, int y){return x + y;}
}int main()
{printf("%p\n", rand);printf("%d\n", HL::rand);printf("%d\n", HL::Add(1, 2));return 0;
}

嵌套定义:

namespace HL
{namespace H{int rand = 0;int Add(int x, int y){return x + y;}};namespace L{int rand = 1;int Add(int x, int y){return (x + y) * 10;}}
}
int main()
{printf("%d\n", HL::H::rand);printf("%d\n", HL::L::rand);printf("%d\n", HL::H::Add(1,2));printf("%d\n", HL::L::Add(1,2));return 0;
}

多文件定义命名空间:

       多个文件定义同名的namespace,它们会默认合并到一起,就像同一个namespace一样。

        2.3、命名空间的使用

        编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。我们要使用命名空间中定义的变量或者函数是,有以下三方式:

  •  指定命名空间访问,(在项目实践中推荐)。
  •  using将命名空间中某个成员展开,(项目中经常访问的不存在冲突的成员推荐这种方式)。
  •  展开命名空间中的全部成员(项目实现中不推荐,冲突风险大)。

不会主动到命名空间去查找变量/函数

指定命名空间访问

namespace HL
{int a = 1;int b = 0;
}int main()
{printf("%d\n", HL::a);printf("%d\n", HL::b);return 0;
}

展开某个成员

namespace HL
{int a = 1;int b = 0;
}
using HL::a;
int main()
{printf("%d\n", HL::a);//printf("%d\n", HL::b); 这里会提示未定义的标识符‘b’return 0;
}

展开全部成员

namespace HL
{int a = 1;int b = 0;
}
using namespace HL;
int main()
{printf("%d\n", HL::a);printf("%d\n", HL::b);return 0;
}

三、C++输入输出

  1.  <iostream> 是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
  2.  std::cin 是istream类的对象,它主要面向窄字符(narrow character(of type char))的标准输入流。
  3.  std::cout 是ostream类的对象,它主要面向窄字符的标准输出流。
  4.  std::endl 是一个函数,流插入输出时,相当于一个换行字符刷新缓冲区。
  5.  << 是流插入运算符, >> 是流提取运算符。(C语言中为位运算左移和右移)
  6.  使用C++输入输出更方便,不需要像 printf和scanf那样手动指定格式,C++的输入输出可以自动识别变量类型(本质上是通过函数重载实现的),更重要的是C++的流能更好的支持自定义类型对象的输入输出。
  7.  IO流涉及类和对象,运算符重载,继承等很多方面的知识,这些知识在接下来C++的学习中都会学到(这里简单了解一下)
  8.  cout/cin/endl 等都属于C++标准库,C++标准库都放在一个叫std 的命名空间中,所以,我们需要通过命名空间的使用方式来使用它们。
  9.  这里没有包含<stdio.h>,也能够使用printf 和 scanf,在包含<iostream>间接包含了。使用VS编译器是这样的,其他的编译器可能会报错。
using namespace std;
int main()
{int a = 0;double d = 1.1;cout << a << endl;cout << d << endl;//输入cin >> a;cin >> d;cout << a << " " << d << endl;//C输入scanf("%d%lf", &a, &d);printf("%d %lf\n", a, d);return 0;
}

C++是兼容C语言的,也可以加上以下代码让C++不在兼容C语言,提高C++ IO效率

#include<iostream>
using namespace std;
int main()
{// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码// 可以提⾼C++IO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;
}

四、缺省参数

  1.         缺省参数是声明或定义函数时为函数的参数指定了一个缺省值。再调用该函数时,如果没有指定实参则采用该形参的缺省值,否则就使用指定的实参,缺省参数分为全缺省和半缺省参数(有些地方把缺省参数也叫做默认参数)。
  2.         全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
  3.         带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
  4.         函数声明和定义分离时,缺省参数不能在函数声明和定义中重复出现,规定函数声明给缺省参数。

缺省参数:

using namespace std;void test1(int a = 0)
{cout << a << endl;
}int main()
{test1();test1(9);return 0;
}

全缺省参数:

//全省参数
void test2(int a = 0, int b = 1, int c = 2)
{cout << "a= " << a << endl;cout << "b= " << b << endl;cout << "c= " << c << endl;cout << endl;}int main()
{test2();test2(11);test2(11, 22);test2(11, 22, 33);return 0;
}

半缺省参数:

//半缺省参数
void test3(int a, int b = 1, int c = 2)
{cout << "a= " << a << endl;cout << "b= " << b << endl;cout << "c= " << c << endl;cout << endl;
}int main()
{test3(11);test3(11, 22);test3(11, 22, 33);return 0;
}

五、函数重载

        C++支持在同一作用域中出现同名函数,但是要求这些函数的形参不同,可以是参数个数不同或者参数类型不同;这样C++函数调用就表现了多态行为,使用更加灵活。(C语言是不支持同一作用域中出现同名函数的)

函数参数类型不同:

//参数类型不同
int Add(int x, int y)
{cout << "Add(int x,int y)" << endl;return x + y;
}
double Add(double x, double y)
{cout << "Add(double x,double y)" << endl;return x + y;
}int main()
{cout << Add(1, 2) << endl;cout << Add(1.1, 2.2) << endl;return 0;
}

函数参数个数不同:

void fun()
{cout << "If you never leave." << endl;
}
void fun(int a)
{cout << "I will live and die together." << endl;
}
int main()
{fun();fun(1);return 0;
}

        这里有一个需要注意的点,如果只有参数,而且给了缺省参数,(如果这是还有一个与其命名相同的函数(没有参数),调用时就会报错)

参数类型顺序不同:

//参数的类型顺序不同
void Test(int a, char c)
{cout << "If you never leave." << endl;
}void Test(char c, int a)
{cout << "I will live and die together." << endl;
}int main()
{Test('x', 1);Test(1, 'x');return 0;
}//参数的类型顺序不同
void Test(int a, char c)
{cout << "If you never leave." << endl;
}void Test(char c, int a)
{cout << "I will live and die together." << endl;
}int main()
{Test(1, 'x');Test('x', 1);return 0;
}

感谢各位支持

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

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

相关文章

对优先级队列(堆)的理解

目录&#xff1a; 一. 优先级队列&#xff1a; 二. 优先级队列的模拟实现&#xff1a; 三.常用接口介绍: 一. 优先级队列&#xff1a; 1 概念&#xff1a; 队列是一种先进先出的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时…

Linux系统目录结构

Linux系统下一切皆文件 &#xff01;&#xff01;&#xff01; 系统启动必须: /boot : 存放启动Linux时所需的内核文件&#xff0c;包括压缩后的内核镜像文件(vmlinuz)、虚拟文件系统镜像文件(initrd.img)、启动引导grub的配置文件。/etc : 系统全局配置文件&#xff0c;会影…

从Excel高手到SQL大师-解锁数据分析的无限潜力 -10分钟读懂职场必备技能

目录 Excel 和 SQL&#xff1a;看似相似却大不相同的数据处理利器Excel vs SQL&#xff1a;表面相似&#xff0c;本质迥异Excel&#xff1a;直观但受限的电子表格SQL&#xff1a;强大而灵活的数据库查询语言 从 Excel 到 SQL&#xff1a;跨越鸿沟Excel 数据筛选SQL 数据筛选 结…

基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构&#xff0c;而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求&#xff0c;多年来&am…

论文阅读:Most Probable Densest Subgraphs

摘要 本文提出了一种在不确定图中发现最有可能稠密子图&#xff08;MPDS&#xff09;的新方法。不确定图中的每条边都有存在概率&#xff0c;使得计算稠密子图变得複杂。作者定义了稠密子图概率&#xff0c;并证明了计算该概率是#P难的。为了解决这个问题&#xff0c;设计了基…

数据科学 - 数据预处理 (数据清洗,结构化数据)

1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来&#xff0c;数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量&#xff0c;保证数据集的一致性&#xff1b;促进数据分析与挖掘&#xf…

【大数据开发语言Scala的入门教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪁Scala 🪡Scala是一种功能丰富且具有强大表达能力的静态类型…

【2024蓝桥杯/C++/B组/传送阵】

题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …

成为git砖家(8): 使用 git log 查询范围内的 commit

文章目录 1. 查询 git log 的文档2. 不带任何参数: git log 啥意思&#xff1f;3. git log 最主要功能是什么&#xff1f;4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …

ubuntu sudo命令不需要密码

sudo vim /etc/sudoers1、注释掉 %sudo ALL(ALL:ALL) AL 2、添加 用户名 ALL(ALL:ALL) NOPASSWD:ALL保存&#xff0c;退出即可

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…

链式二叉树的实现

文章目录 &#x1f3af;引言&#x1f453;链式二叉树的实现1.链式二叉树的结构2.链式二叉树相关操作实现2.1源码展示2.2函数实现详解2.2.1前中后序遍历2.2.2二叉树的其他方法实现2.2.3二叉树的层序遍历和判断是否是完全二叉树 &#x1f947;结语 &#x1f3af;引言 欢迎来到Ha…

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…

全球氢钎焊市场规划预测:未来六年CAGR为3.4%

随着全球制造业的持续发展和消费者对高质量产品的需求增加&#xff0c;氢钎焊作为一种高效的焊接技术&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析氢钎焊行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场趋势的演变】 1. 市场规模与增长&#…

C++自定义接口类设计器之可对称赋值三

关键代码 QStringList newLines;for (const auto& line : lines) {auto equalIndex line.indexOf("");if(-1 ! equalIndex) {// a b; 赋值auto var line.mid(0, equalIndex).trimmed();auto value line.mid(equalIndex 1).trimmed();if(value.endsWith(&quo…

【网络安全】副业兼职日入12k,网安人不接私活就太可惜了!

暑假来了&#xff0c;很多同学后台私信我求做兼职的路子&#xff0c;这里&#xff0c;我整理了一份详细攻略&#xff0c;请大家务必查收&#xff0c;这可能会帮你把几个学期的生活费都赚够&#xff01; Up刚工作就开始做挖漏洞兼职&#xff0c;最高一次赚了12k&#xff0c;后面…

STM32Cubemx在FreeRTOS中使用面向对象的方式使用串口

文章目录 前言一、创建FreeRTOS工程二、创建文件对串口进行封装三、代码编写总结 前言 本篇文章将带大家来学习使用面向对象的方式在FreeRTOS中使用串口&#xff0c;使用面向对象的方法非常适合编写可移植性强的代码&#xff0c;那么这篇文章就带大家来看一下这个代码要怎么写…

模型 正态分布(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。随机世界的规律&#xff0c;大自然里的钟形曲线。 1 正态分布的应用 1.1 质量管理之六西格玛 六西格玛是一种旨在通过识别和消除缺陷原因来提高制造过程或业务流程质量的管理策略。我们先来了解下六…

CX32L003F8P6T芯片解密程序破解

CX32L003F8P6T可替代N76E003 CX32L003是一款内嵌32位ARM Cortex-M0内核的超低功耗、Low Pin Count和宽电压工作范围(2.5V~5.5V)的微控制器&#xff0c;最高可运行在24MHz&#xff0c;内置32K/64K字节的嵌入式Flash&#xff0c;4K字节的SRAM&#xff0c;集成了12位1Msps高精度SA…

C++ 初探(13课)

#include<iostream> using namespace std; int main() {cout<<"Helloworld"<<endl; } 函数:一段能够被反复调用的代码,可以接收输入,进行并行处理或者产生输出; ——返回类型:表示函数返回结果的类型,可以为void ——函数名称:用于函数的…