c++入门你需要知道的知识点(上)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

         今日主菜:c++入门

                 主厨:邪王真眼

            所属专栏:c++专栏

              主厨的主页:Chef‘s blog


前言:

咱也是好久没有更新了,继c语言和数据结构之后,今天再开个新坑c++,学c++与C语言有个共同点,那就是要及时写博客,一方面是及时总结知识方便以后回顾复习,一方面也是检验自己当前的学习效果,欧克,那麽今天我们就要踏入c++的大门,今天先来初窥门径。

1. 本节要求

C++ 是在 C 的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉 C 语言对 C++ 学习有一定的帮助,
本节主要目标:
  • 1. C++是如何对C语言设计不合理的地方进行优化的,比如:作用 域方面、IO方面、函数方面、指针方面、宏方面等。
  • 2. 为后续类和对象学习打基础。

2. C++关键字(C++98)

C++ 总计 63 个关键字, C 语言 32 个关键字
我们现在只是看一下 C++ 有多少关键字,不对关键字进行具体的讲解。他们的具体作用后面我们学到一个讲一个。

3. 命名空间

C/C++ 中,变量、函数和后面要学到的类都是大量存在的,将这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多命名冲突,比如不小心给两个函数起了一样的名字。c++是通过使用命名空间来解决这个问题的。
这里就要用namespace 关键字了。(打起精神,第一个关键字来了!!!)

3.1样例

C语言命名冲突如下:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
//我们知道C语言有个叫rand的函数,我们在这里又定义了一个叫rand的变量。
int main()
{printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

3.2 命名空间定义

定义命名空间,需要使用到 namespace 关键字 ,后面跟 命名空间的名字 ,然 后接一对 {} 即可, {}
中即为命名空间的成员。
// sixflower是命名空间的名字。
// 1. 正常的命名空间定义
namespace sixflower
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
 

3.3 命名空间使用

命名空间中成员该如何使用呢?比如:
namespace bit
{// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);
return 0;
}
命名空间的使用有三种方式:

3.3.1.加命名空间名称及作用域限定符

int main ()
{
printf ( "%d\n" , N::a );
return 0 ;    
}

3.3.2.使用using将命名空间中某个成员引入

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

3.3.3.使用using namespace 命名空间名称引入

using namespce N ;
int main ()
{
printf ( "%d\n" , N::a );
printf ( "%d\n" , b );
Add ( 10 , 20 );
return 0 ;    
}

3.4使用原理:

编辑器在找你写的变量,函数,类等时默认在当前域和全局变量中寻找,

对于方案一:其实就是告诉编译器这个a在N里,那么编译器就回去N这个域中找

对于方案二:也是告诉编译器这个b是在N里,与方案一的区别是在之后使用时不用再写为N::b的模式。

对于方案三:就是在默认的基础上,让编译器搜索范围又增加了N域

4. C++输入&输出

请看代码:

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
cout<<"Hello world!!!"<<endl;
return 0;
}

相信你也明白这就是c++的“hello world”,但为什么这样写还听我细细道来。

  • 1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
  • 以及按命名空间使用方法使用std。
  • 2. cout和cin是全局的流对象,cout作用类似于printf,cin作用类似于类似于scanf。endl是特殊的C++符号,现在可以将它看作‘\n’,他们都包含在包含<iostream >头文件中。
  • 3. <<是流插入运算符,>>是流提取运算符,
  • 4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。
  • 注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。

ps:

现在搞不懂cout,cin,>>,<<是正常的,先知道它的作用就行,以后还会细讲。

#include <iostream>
using namespace std;
int main()
{int a;double b;char c;// 可以自动识别变量的类型cin>>a;cin>>b>>c;cout<<a<<endl;cout<<b<<" "<<c<<endl;return 0;
}
// ps:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等
等。因为C++兼容C语言的用法,可以用c语言实现这些要求,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我
们再配合文档学习。
std命名空间的使用惯例:
1. 在日常练习中,建议直接 using namespace std 即可,这样就很方便。
2. using namespace std 展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型 /
/ 函数,就存在冲突问题。该问题在项目开发中代码较多、规模 大,就很容易出现。所以建议在项目开发中使用方案1,2.

5. 缺省参数

5.1 缺省参数概念

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参
return 0;
}

5.2 缺省参数分类

5.2.1全缺省参数

void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}

5.2.2半缺省参数

void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}
1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给
2. 声明与定义分开时 缺省参数不能在函数声明和定义中同时出现,只能在声明出现
 //a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。
3. 缺省值必须是常量或者全局变量

5. 函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重
载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个
是男足。前者是 谁也赢不了! ,后者是 谁也赢不了!

5.1 函数重载概念

函数重载:是函数的一种特殊情况,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;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

5.2 C++支持函数重载的原理--名字修饰(name Mangling)

为什么 C++ 支持函数重载,而 C 语言不支持函数重载呢?
C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接
这个知识忘了的可以看一下这篇博客:
编译与链接
1. 实际项目通常是由多个头文件和多个源文件构成,而通过 C 语言阶段学习的编译链接,我们
可以知道,【当前 a.cpp 中调用了 b.cpp 中定义的 Add 函数时】,编译后链接前, a.o 的目标
文件中没有 Add 的函数地址,因为 Add 是在 b.cpp 中定义的,所以 Add 的地址在 b.o 中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就
会到 b.o 的符号表中找 Add 的地址,然后链接到一起
3. 那么链接时,面对 Add 函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的
函数名修饰规则。
4.  通过下面我们可以看出 gcc(也就是支持C语言) 的函数修饰后名字不变。而 g++(也就是支持c++) 的函数修饰后变成【 _Z+ 函数长度 + 函数名 + 类型首字母】。 采用 C 语言编译器编译后结果


 
5. 通过这里就理解了 C 语言没办法支持重载,因为同名函数没办法区分。而 C++ 是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载
结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。
注意: 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时函数时编译器没办法直到返回值,所以无法进行区分。

结语:

事实上,这篇博客只完成了本节目标的一半,敬请期待c++入门你需要知道的知识点(下)

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

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

相关文章

Leet code 1658 将x减到0的最小操作数

解题思路&#xff1a;滑动窗口 主要思想&#xff1a;正难逆简 题目需要左找一个数 右找一个数 我们不如直接找中间最长的一连串子数让这串子树和为 数组子树和减去X 找不到就返回 -1 滑动窗口双指针从左端出发&#xff0c;进行 进窗口 判断 出窗口 更新结果四个步骤 代码…

python文件的打开及open方法

打开文件 方法1&#xff1a; 使用try/except/finally 例子&#xff1a; try:data_in open(rD:\TEST\a.txt,encodingutf-8)print(data_in.readlines(),end)except IOError:print(File Error occured!)finally:data_in.close() 结果&#xff1a; [这是一个测试文件。\n, 文…

C++ Qt里如何使用std::thread

本篇博客介绍如何在C++ Qt项目里使用std::thread,以及父子线程之间的交互方法。 怎么编写多线程代码 很多C++开发者困惑如何使用多线程,其实主要是在做项目时是否有多任务的场景,如果没有则不需要使用到多线程,用一个客户端开发的场景来解释一下如何使用多线程,例如开发一…

防火墙中的SNAT 与DNAT

SNAT&#xff1a;让内网机器可以访问外网服务器 DNAT:让外网机器可以访问内网服务器 SNAT的原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由私网IP转换成公网IP 当响应…

JAVA 100道题目(2)

2.创建一个程序&#xff0c;接受用户输入的字符串并检查它是否为回文。 以下是一个简单的Java程序&#xff0c;它接受用户输入的字符串并检查该字符串是否为回文&#xff08;正读和反读都相同的字符串&#xff09;&#xff1a; java复制代码 import java.util.Scanner; public…

with open----bug

with open(os.path.join(output_path, "closed_rel_paths.jsonl"), "w") as f: # 打开文件&#xff0c;准备写入闭合关系路径for head in tqdm(rdict.rel2idx): # 遍历头部关系paths set() # 初始化路径集合if head "None" or "inv_&q…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

在Java中如何将十进制转换为二进制,八进制,十六进制以及它们之间的互相转换

目录 一、算法实现进制之间的转换 &#xff08;1&#xff09;十进制转换为二进制 &#xff08;2&#xff09;二进制转换成十进制 二、Java中的API实现进制转换 &#xff08;1&#xff09;十进制转换为二进制 &#xff08;2&#xff09;十进制转换为八进制 &#xff08;3…

OJ_点菜问题(背包问题)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;int main() {int c, n;scanf("%d%d", &c, &n);int p[101];int v[101];for (int i 0; i < n; i){scanf("%d%d", &p[i],…

Android Studio实现内容丰富的安卓宠物用品管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

47、C++/引用,函数重载,类相关学习20240312

一、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show()。 代码&…

oppo前端开发一面

提问&#xff1a; 1. 谈谈你怎么实现响应式布局 2. 谈谈你对weback的了解&#xff0c;vite和webpack的区别&#xff0c;webpack loader 3. 你项目怎么用CI/CD&#xff08;不懂&#xff0c;只知道自动化部署了&#x1f62d;&#xff09; 4. ts中type和interface区别 5. axi…

html5cssjs代码 008 名画欣赏

html5&css&js代码 008 名画欣赏 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;展示了名画欣赏的内容。主要包括页面的标题、样式定义和主体内容。其中&#xff0c;样式定义使用了CSS来控制页面的布局和外观&#xff0c;主体内容使用了结构化的HTML标签来展…

旅游市场游客满意度调查报告

民安智库开展游客满意度调查主要通过问卷调查的方式进行&#xff0c;在设计问卷时&#xff0c;应确保问题覆盖游客在某省旅游过程中可能遇到的各个方面&#xff0c;包括交通、住宿、餐饮、旅游景点、导游服务等。此外&#xff0c;还可以设置一些开放性问题&#xff0c;让游客提…

架构设计-复杂度来源:高性能

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集成电路计算机&#xff0c;运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集…

C++常用容器总结

容器分为三类&#xff0c;顺序容器&#xff0c;关联容器和适配器。顺序容器又分为连续的容器&#xff08;vector&#xff0c;array&#xff09;&#xff0c;顺序容器中的离散容器&#xff08;list&#xff0c;slist&#xff0c;forward_list&#xff09;&#xff0c;离连形的de…

[uni-app] 小程序码转为二维码, 小程序解析此码获取数据

小程序码缩小后太细, 不好扫, 还是改成二维码扫 记录解析该二维码 onLoad(e) {if (e.shareTimeline) { // 以单页面启动-朋友圈分享出的单页面this.shareTimeline e.shareTimeline;let param {certId: e.certId,uid: e.uid,unionid: e.unionid,openid: e.openid,}this.initD…

Html+threejs数字孪生三维场景实现

程序示例精选 Htmlthreejs数字孪生三维场景实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Htmlthreejs数字孪生三维场景实现》编写代码&#xff0c;代码整洁&#xff0c;规则&#xf…

第十四届蓝桥杯省赛真题 Java 研究生 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 特殊日期试题 B: 与或异或试题 C: 棋盘试题 D: 子矩阵试题 E : \mathrm{E}: E: 互质数的个数试题 F: 小蓝的旅行计划试题 G: 奇怪的数试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现宝藏 前些天发现了一个巨牛的人…

讲述微信小程序宿主环境

上文 科普编程中 宿主环境(host environment) 基础概念 带大家科普了一下宿主环境的基本概念 那么 本文 我们就来说说小程序的一个宿主环境 首先 小程序的 宿主环境 肯定是 手机微信 安卓手机 只能安装安卓微信 IOS 系统 也只能安装IOS 系统的 微信 这是软件的宿主环境 但 微…