C++初级学习:⼊⻔基础

在这里插入图片描述

本文内容:

  • 1.C++参考⽂档:
  • 2.C++第一个程序
  • 3.命名空间
    • 3.1namespace的价值
    • 3.2namespace的定义
    • 3.3命名空间的使用
  • 4.C++输⼊&输出
  • 5.缺省参数
  • 6.函数重载

1.C++参考⽂档:

https://legacy.cplusplus.com/reference/
https://zh.cppreference.com/w/cpp
https://en.cppreference.com/w/
说明:第⼀个链接不是C++官⽅⽂档,标准也只更新到C++11,但是以头⽂件形式呈现,内容⽐较易看
好懂。后两个链接分别是C++官⽅⽂档的中⽂版和英⽂版,信息很全,更新到了最新的C++标准,但是
相⽐第⼀个不那么易看;⼏个⽂档各有优势,我们结合着使⽤。

2.C++第一个程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的helloworld依旧可以运⾏,C++中需要把定义⽂件
代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc

#include <stdio.h>int main()
{printf("%s", "hello world");return 0;
}

当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的helloworld应该是这样写的

#include <iostream>
using namespace std;int main()
{cout << "hello world\n" << endl;return 0;
}

接下来我们来介绍一下这里出现的内容

3.命名空间

3.1namespace的价值

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全
局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名
冲突或名字污染,namespace关键字的出现就是针对这种问题的。
c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决
这样的问题

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

3.2namespace的定义

  1. 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中
    即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  2. namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。
  3. C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/
    类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响
    编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
  4. namespace只能定义在全局,当然他还可以嵌套定义。
  5. 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
  6. C++标准库都放在⼀个叫std(standard)的命名空间中。

正常的命名空间定义:

#include <stdio.h>
#include <stdlib.h>namespace zhangsan
{int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{printf("%p\n", rand); // 这里默认是访问的是全局的rand函数指针printf("%d", zhangsan::rand); // 这里指定zhangsan命名空间中的rand
}

命名空间可以嵌套:

namespace zhangsan
{namespace test01{int rand = 1;int Add(int left, int right){return left + right;}}namespace test02{int rand = 2;int Add(int left, int right){return (left + right) * 10;}}
}int main()
{printf("%d\n", zhangsan::test01::rand);    //1printf("%d\n", zhangsan::test02::rand);    //2printf("%d\n", zhangsan::test01::Add(1,2));//3printf("%d\n", zhangsan::test02::Add(1,2));//30return 0;
}

3.3命名空间的使用

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

  1. 指定命名空间访问,项⽬中推荐这种⽅式。
  2. using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
  3. 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
// 1指定命名空间访问
namespace N
{int a = 10;int b = 100;
}int main()
{printf("%d", N::a);return 0;
}// 2using将命名空间中某个成员展开
using N::b;
int main()
{printf("%d", N::a);printf("%d", b);return 0;
}// 3展开命名空间中全部成员
using namespace N;
int main()
{printf("%d", a);printf("%d", b);return 0;
}

4.C++输⼊&输出

  1. < iostream >是InputOutputStream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。
  2. std::cin 是istream类的对象,它主要⾯向窄字符(narrowcharacters(oftypechar))的标准输⼊流。
  3. std::cout 是ostream类的对象,它主要⾯向窄字符的标准输出流。
  4. std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
  5. <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
  6. 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
  7. IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这⾥我们只能简单认识⼀下C++IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。
  8. cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。
  9. ⼀般⽇常练习中我们可以usingnamespacestd,实际项⽬开发中不建议usingnamespacestd。
  10. 这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含间接包含了。vs系列编译器是这样的,其他编译器可能会报错。
#include <iostream>using namespace std;
int main()
{int a = 0;double b = 0.1;char c = 'x';cout << a << " " << b << " " << endl;std::cout << a << " " << b << " " << endl;scanf("%d%lf", &a, &b);printf("%d %lf\n", a, b);//可以自动识别变量类型cin >> a;cin >> b, c;cout << a << endl;cout << b << " " << c << endl;return 0;
}

5.缺省参数

  1. 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数)
  2. 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
  3. 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
  4. 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值
#include <iostream>using namespace std;
void Func(int a = 0)
{cout << a << endl;
}int main()
{Func();     // 没有传参时,使⽤参数的默认值Func(10);   // 传参时,使⽤指定的实参return 0;
}
#include <iostream>
using namespace std;
// 全缺省void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
// 半缺省void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200, 300);return 0;
}

6.函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的。

#include <iostream>using namespace std;// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

返回值不同不能作为重载条件,因为调⽤时也⽆法区分

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【React】JSX:从基础语法到高级用法的深入解析

文章目录 一、什么是 JSX&#xff1f;1. 基础语法2. 嵌入表达式3. 使用属性4. JSX 是表达式 二、JSX 的注意事项1. 必须包含在单个父元素内2. JSX 中的注释3. 避免注入攻击 三、JSX 的高级用法1. 条件渲染2. 列表渲染3. 内联样式4. 函数作为子组件 四、最佳实践 在 React 开发中…

【C++】19.红黑树模拟实现 set 和 map

我们想要实现STL中的set和map&#xff0c;那么第一步就需要看一下库函数是如何实现的&#xff1a; 通过查看源代码我们发现两个容器都包含了stl_tree.h&#xff0c;因此我们猜测此头文件实现的是红黑树。 但是set和map很显然不是使用同一棵树实现的&#xff0c;那么STL库是怎么…

C# Nmodbus,EasyModbusTCP读写操作

Nmodbus读写 两个Button控件分别为 读取和写入 分别使用控件的点击方法 ①引用第三方《NModbus4》2.1.0版本 全局 public SerialPort port new SerialPort("COM2", 9600, Parity.None, 8, (StopBits)1); ModbusSerialMaster master; public Form1() port.Open();…

Beam Search 原理详解

文章目录 1. 前言2. 原理3. 举例4. 参考 1. 前言 Beam Search 是一种启发式图搜索算法&#xff0c;用于在图或树的搜索过程中寻找最有可能的路径。它常用于自然语言处理&#xff08;NLP&#xff09;中的序列生成任务&#xff0c;如机器翻译、语音识别和文本生成等。与穷举搜索…

渲染技术如何帮助设计内容实现从平面到立体的转换

随着数字艺术和视觉特效的飞速发展&#xff0c;三维建模与渲染技术在影视、游戏、广告、工业设计、建筑可视化等多个领域展现出了其不可或缺的重要性。这一技术不仅实现了从平面到立体的跨越&#xff0c;还极大地丰富了视觉表达的层次感和真实感。 三维建模&#xff1a;构建虚…

一站式企业服务平台有哪些特点和优势!

随着我国经济的快速发展&#xff0c;各地方政府及产业园区为了能够吸引投资和优质企业入驻&#xff0c;纷纷在营商环境优化上大下功夫&#xff0c;这是因为当下企业已经不再满足于基础服务&#xff0c;而是更看重利于企业发展的软环境&#xff0c;随之建设“一站式企业服务平台…

flex/lex使用和学习

flex/lex用于生成解析配置文件的C代码&#xff0c;我们可以不用自己手动去做解析的工作&#xff0c;交由他们生成的代码去做。 假设&#xff0c;我有如下一个配置文件config.xml 配置文件中定义了三种channel,分别为SSIF, IPMB, NET&#xff0c;每一种channel都有4个int属性&a…

PyTorch基础(24)--torch.multinomial()方法

&#x1f449;torch.multinomial的源码见https://github.com/dongjinkun/PyTorch/tree/main/torch 一、前言 torch.multinomial()方法多出现在需要采样的场景中&#xff0c;如强化学习。具体讲&#xff0c;当使用强化学习解决旅行商问题时&#xff0c;针对某一个instance&…

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发&#xff08;30小时精通C和外挂实战&#xff09; 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1&#xff0c;修改内存中的数据 2&#xff0c;更改内存中…

外文文献去哪个网站查找下载又快又准

今天收到好多同学的文献求助&#xff0c;大部分都是外文文献。那么外文文献去哪里查找下载比较好呢&#xff1f;本文小编就讲解一下自己平时是在什么网站上查找获取文献的&#xff0c;下面就用几篇求助文献演示一下获取过程&#xff1a; 第一篇、OVID数据库&#xff1a;A Crit…

录音教程分享:电脑在线录音,7款录音软件免费版公开!

在我们的日常生活中&#xff0c;不可避免地会遇到需要在电脑上录制各种系统内音频的场景。无论是记录一次讲座、一段对话&#xff0c;或者录制某个重要网站上的音频&#xff0c;这种需求变得愈发重要且广泛。然而&#xff0c;对许多人来说&#xff0c;在电脑上在线录音可能是一…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础&#xff0c;开始学习微服务的同学&#xff0c;我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快&#xff0c;会记录demo演算和中间件的使用过程&#xff0c;至于细节的理论…

Spark_Oracle_II_Spark高效处理Oracle时间数据:通过JDBC桥接大数据与数据库的分析之旅

接前文背景&#xff0c; 当需要从关系型数据库&#xff08;如Oracle&#xff09;中读取数据时&#xff0c;Spark提供了JDBC连接功能&#xff0c;允许我们轻松地将数据从Oracle等数据库导入到Spark DataFrame中。然而&#xff0c;在处理时间字段时&#xff0c;可能会遇到一些挑战…

计算机网络知识-面试点1

1. 三握四挥 定义&#xff1a; 在计算机网络中&#xff0c;特别是TCP/IP协议中&#xff0c;“三握”指的是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;而“四挥”则指的是四次挥手&#xff08;Four-way Handshake&#xff09;。这两个过程分别用于TCP连接…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别&#xff1a;Hash为默认模式&#xff0c;url中包含一个#符号的哈希部分。优势&#xff1a;兼容性好&#xff0c;不需要后端服务器的特殊配置。缺点&#xff1a;不够美观&#xff0c;搜索引擎优化较差。History模式使用的浏览器的His…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

leetcode日记(55)二进制求和

将短的字符串前面补充0&#xff0c;使两字符串对其再进行加法&#xff1a; class Solution { public:string addBinary(string a, string b) {int na.size();int mb.size();if(n>m) b.insert(0,n-m,0);else if(m>n) a.insert(0,m-n,0);string c;int jw0;for(int imax(n,…

【C++指南】类和对象(上)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注

PostgreSQL的pg-collector工具

PostgreSQL的pg-collector工具 pg-collector 是一个用于 PostgreSQL 数据库的监控和数据收集工具。它主要用于收集 PostgreSQL 实例的性能指标、查询统计和日志信息&#xff0c;以便进行数据库性能分析和故障排查。通过收集这些数据&#xff0c;管理员可以更好地了解数据库的运…

减少 95% 资源的向量搜索 | 使用云搜索的 DiskANN

当前尖端的向量近邻搜索算法&#xff0c;主要以图搜索算法为主&#xff0c;此类算法为了能够最大化搜索的速度与准确度&#xff0c;需要将对应的索引结构和原始数据存放在内存中&#xff0c;显然这不仅大大提高了成本&#xff0c;还限制了数据集的大小。例如在当前主流的内存型…