C++的回顾与学习之C++入门基础

目录

1、C++入门

1)C++关键字

2)命名空间

3)C++中的输入输出

4)缺省参数

5)函数重载

6)引用

引用和指针的不同点:

7)auto关键字

8)内联函数

9)指针空值nullptr


1、C++入门

主要介绍C++中新增的一些C语言中没有的内容作为C语言的补充,以便于更加方便地进行编程实现,以及为后期的C++的学习打下基础

1)C++关键字

C++中有98个关键字,而其中32个是C语言中的,我认为对于这些关键字不需要特别地去进行记忆,只需要先做些大概的了解,在后续学习和使用的过程中去逐步地加深理解。

2)命名空间

由于在C语言中时常会出现命名冲突的问题,比如变量名和库冲突、变量名之间的冲突,这会带来很多的不便,于是在C++中就进行了一些优化,使用namespace的关键字,也就是命名空间来设定一个域,实现变量之间的隔离,以此解决冲突问题。几种常见的域:类域、命名空间域、局部域、全局域

//命名空间的定义
namespace A //A为命名空间的名称
{int a;    //命名空间中可以定义变量int add(int x,int y)    //命名空间中也可以定义函数{return x+y;}
}int a=0;    //这是一个全局变量//命名空间可以进行嵌套使用
namespace A
{int a=1;    namespace B{int a=2;}
}

如果有多个相同名称的命名空间会被编译器合并,一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。在使用时,可以通过作用域限定符来进行访问命名空间中的部分成员,也可以使用using来进行展开命名空间中的内容进行使用,还可以通过using namespace来展开整个命名空间域,此时命名空间中的所有成员都可以被使用

namespace A
{int a=1;    
}using A::a;    //使用using来展开命名空间中需要的成员,展开的内容就成为了全局域using namespace A;    //使用using namespace来展开命名空间域,可以访问命名空间内的所有内容int main()
{A::a=10;    //使用作用域限定符来进行使用命名空间中的成员printf("%d",A::a);
}

3)C++中的输入输出

<<为C++中的流插入运算符,可以实现输出

>>为C++中的流提取运算符,可以实现输入

#include<iostream>
using namespace std;
int main()
{int x = 0;int i = 0;int j = 0;cin >> j;    //输入cin >> x>>i;    //可以连续输入,输入值将按照顺序从左向右放在相应的变量中cout << j << endl;    //输出,endl为换行cout << "hello world"  << endl<<x <<" " << i;    //可以连续输出
}

当然由于C++是兼容C语言的,因此在C++中依然可以使用scanf和printf的函数实现输入输出,不过C语言的这两个输入输出函数会对输入输出的内容进行格式限制,即需要使用%d %c等限定类型,而C++中的cout和cin则并没有限制,这也方便了后期自定义类型的使用。

4)缺省参数

缺省参数使用在函数声明或定义时,为函数的参数设定的一个默认值,当调用函数而未传入参数时就会使用缺省参数,当传入了参数时,缺省参数将不会被使用,也就是说缺少参数担任了一个备胎的角色

缺省可以是全缺省也可以是半缺省(即部分变量有缺省值,部分没有,但半缺省必须从右往左依次给出缺省值,不可以间隔给出,也不可以给左不给右)

#include<iostream>
using namespace std;
void Print(int x=1 ,int y=2,int z=3)    //全缺省
{cout << x << " " << y << " "<<z<<" " << endl;
}
void Print1(int x , int y , int z = 10)    //半缺省
{cout << x << " " << y << " " << z << " " << endl;
}/*void Print(int x=1 ,int y,int z)
{cout << x << " " << y << " "<<z<<" " << endl;
}
void Print1(int x , int y=1 , int z)
{cout << x << " " << y << " " << z << " " << endl;
}
这两种缺省方式都是错误的
*/
int main()
{Print();    //全部使用缺省值Print(4);    //为给参数的部分使用缺省值Print1(99,0);    //使用缺省值Print(10,12,16);    //不使用缺省值,使用传入的参数}

注意:缺省参数只能在函数声明时出现,或者函数定义时出现(二者之一均正确),不可以在声明和定义中同时出现

5)函数重载

在C++中的同一作用域中可以声明和定义几个功能类似的同名函数,这些函数的形参列表(参数类型、参数个数、参数顺序)不同,但功能类似且函数名相同,那么就构成函数重载

#include<iosteam>
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()
{cout << Add(1,2) << endl;cout << Add(1.1, 2.2) << endl;f();f(10);f(10,'a');f('a',10);return 0;
}

如果两个函数名称相同、形参相同但返回值不同,则不构成函数重载

那么为什么重载在C语言中不能实现,而在C++中可以实现呢,这是因为在链接的过程中,C语言是通过函数名来查找函数地址的,因此不允许有同名的函数,而C++查找时并不是单纯通过函数名来查找,而是使用了函数名修饰规则,使用参数来进行修饰,同时返回值并没有被用于修饰规则中

6)引用

C语言中的指针的使用较为复杂且易错,因此C++中采用了一种新的方式,即为引用,引用也就是取别名,引用并没有开辟新的空间来存放变量,而是对已经存在的变量取了一个新的名字,因此引用变量与原变量公用一块内存空间,引用不可以改变指向。

比如:西游记中的猴子,可以叫他悟空,也可以叫他齐天大圣

int main()
{int a = 6;int& b = a;//注意:引用类型必须和引用实体是同种类型的cout << b << endl;    //打印出b的值和a的值一样b++;cout << a;    //由于a、b使用的是同一块空间,因此++时会同时++}

引用的特性:1、引用在定义时必须初始化 2、一个变量可以有多个引用 3、引用一旦引用一个实体,再不能引用其他实体

#include<iostream>
using namespace std;
int main()
{//一个变量可以有多个引用int a=0;int& b=0;int& c=b;//引用在定义时必须初始化//int& d;  报错//引用一旦引用一个实体,再不能引用其他实体int x=10;c=x;//x的值赋值给c,c依旧是a/b对象别名
}

引用的使用场景:1、作为参数(基本任何场景都可以用引用传参)2、作为返回值(要谨慎,如果函数调用结束后,引用的变量已经被销毁,那么该引用相当于野指针,不可以引用返回,除非是静态变量等不被销毁的情况下才可以使用)

引用和指针的不同点:

1、引用概念上定义一个变量的别名,指针存储一个变量地址

2、引用在定义时必须初始化,指针没有要求

3、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

4、没有NULL引用,但有NULL指针

5、在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)

6、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7、有多级指针,但没有多级引用

8、访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9、引用比指针使用起来相对更安全

7)auto关键字

auto会根据表达式的类型自动推导出类型,当类型很长时使用auto会比较方便

#include<iostream>
using namespace std;int main()
{int a=0;int b=a;auto c=a;//根据右边的表达式自动推导c的类型auto d=1+1.11;//根据右边的表达式自动推导d的类型cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//打印变量的类型
}

注意:auto不能作为函数的参数,也不能直接用来声明

auto可以用于for循环,会比较方便,但是for循环的范围一定要是确定的

#include<iostream>
using namespace std;int main()
{int a[]={1,2,3,4,5,6,7,8,9,10};//适用于数组//范围for 语法糖(访问数组)//依次取数组中数据赋值给e//自动迭代,自动判断结束for(auto e : arr){cout << e << " ";}cout << endl;//修改数据for(auto& e : arr){e *=2;}for(auto e :arr){cout << e << " ";}cout << endl;
}

8)内联函数

在进行函数调用时会有一些消耗,比如建立函数栈帧这些,C语言中可以通过使用宏函数来解决,但是宏函数比较容易出错,因此C++中采用了内联函数来解决问题,在调用的函数返回值之前加上关键字inline,即成为内联函数,内联函数会在函数调用的地方展开,则没有函数调用了,所以内联函数不需要建立栈帧,不复杂,不容易出错,可读性强,可以调试

#include<iostream>
using namespace std;
//内联函数
inline int Add(int x,int y)
{return (x+y)*10;
}int main()
{for(int i=0;i<10000;i++){cout << Add(i,i+1) << endl;}return 0;
}

但是宏函数和内联函数都只适用于短小的频繁调用的函数,如果用于较长的函数则会导致代码膨胀,因此当在编写代码时使用了inline只会作为一种建议,最终运行时将会由编译器决定是否将函数设为内联函数

注意:inline函数不能声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

9)指针空值nullptr

在C语言中我们通常认为NULL就为空指针,但是NULL其实是一个宏定义,NULL就为0

#include<iostream>
using namespace std;
void f(int)
{cout << "f(int)" << endl;
}void f(int*)
{cout << "f(int*)" << endl;
}int main()
{f(0);f(NULL);
}

因此当我们在运行以上代码时会发现只调用了f(int)函数,由于NULL被当做是0而无法调用f(int*)这一函数,为了解决这一问题,在c++中使用nullptr来表示空指针

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

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

相关文章

【使用Android Studio调试手机app时候手机老掉线问题】

如果你各种方式都尝试失败了&#xff0c; 请看这里 连接时候通过logcat查看你手机Android的平台去SDK下载所有对应的平台SDK重新连接尝试

二叉树题解——验证二叉搜索树【LeetCode】前序遍历

98. 验证二叉搜索树 &#x1f50d; 题目目标 判断一棵二叉树是否为有效的二叉搜索树&#xff08;BST&#xff09;&#xff0c;定义如下&#xff1a; 左子树所有节点 < 根节点 右子树所有节点 > 根节点 且左右子树也必须是二叉搜索树 一、算法逻辑&#xff08;逐步通…

Javaweb - 10.3 Servlet 生命周期

目录 生命周期简介 生命周期测试 load-on-startup 补充&#xff1a;defaultServlet Servlet 的继承结构 1. 顶级的 Servlet 接口 2. 抽线的类 GenericServlet 3. HttpServlet 抽象类 4. 自定义 Servlet 补充&#xff1a; 完&#xff01; 生命周期简介 什么是生命周…

RSA数字签名方案的C语言实现(带测试)

RSA 算法的 C语言实现通常比较复杂&#xff0c;但已经有许多密码算法库实现了 RSA 算法&#xff0c;例如OpenSSL、Libgcrypt​ 和 Botan ​等。我们可以在这些库的基础上进行配置或移植&#xff0c;从而快速实现密码算法。但这些库主要面向大量设备进行优化&#xff0c;如通用计…

创客匠人视角:知识变现与创始人 IP 打造的破局之道

当知识付费从流量红利期进入精耕细作阶段&#xff0c;为何专业能力强的内容创作者反而难以变现&#xff1f;创客匠人通过 1500 案例陪跑发现&#xff1a;缺乏 IP 思维的知识输出如同雾中航行&#xff0c;而创始人 IP 打造正是连接知识价值与商业变现的核心桥梁。一、定位重构&…

结构分析设计软件 SCIA Engineer 25.0 x64

详情 Nemetschek SCIA Engineer是一家从事多项目编程、分析和软件设计的公司。该软件具有广泛的不同功能。该软件可用于以简单的方式设计建筑物、工业工厂和桥梁。 Nemetschek SCIA Engineer软件的特点和功能&#xff1a; BIM模型人 使用网格和故事 3D风 自由负载 互联网…

怎么处理[TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark

这个错误说明 Elasticsearch 的磁盘空间严重不足&#xff0c;已触及最高级别&#xff08;flood-stage&#xff09;的水位线。作为自我保护机制&#xff0c;Elasticsearch ​自动将受影响的索引设置为只读模式 (read-only-allow-delete)​&#xff0c;从而阻止写入操作&#xff…

pytorch学习-11卷积神经网络(高级篇)

2.线性模型 3.梯度下降算法 4.反向传播(用pytorch算梯度) 5.用pytorch实现线性回归 6.logistic回归 7.处理多维特征的输入 8.加载数据集 9.多分类问题 10.卷积神经网络(基础篇) 11.卷积神经网络&#xff08;高级篇&#xff09;_哔哩哔哩_bilibili 11.1 GoogleNet Google…

ubuntu 安装QT

在 Ubuntu 系统上安装 Qt 可以通过以下步骤完成&#xff0c;以下是详细的安装指南 &#xff1a; 1. 安装前的准备工作 在开始安装 Qt 之前&#xff0c;需要确保你的 Ubuntu 系统已经更新到最新版本&#xff0c;并且安装了一些必要的依赖。 1.1 更新系统 首先&#xff0c;打…

CppCon 2018 学习:RAPID PROTOTYPING OF GRAPHICS SHADERS IN

这段内容在讲**着色器&#xff08;Shader&#xff09;**的基础概念&#xff0c;尤其是它在现代 GPU&#xff08;图形处理单元&#xff09;中的作用。以下是逐条解释与理解&#xff1a; “Depicting depth perception in 3D models or illustrations by varying levels of darkn…

Angular v20版本正式发布

过去几年对 Angular 来说很具变革性,我们推出了像 Signals 这样的反应性功能和 Zoneless 应用的强大能力。我们希望这些功能可以帮助 Angular 社区构建下一代的 Web 应用,实现快速上市和强大的性能。 我们的旅程才刚刚开始!Angular v20 是最新的发布版本,我们花费了无数个小…

Oracle如何使用序列 Oracle序列使用教程

Oracle序列&#xff08;sequence&#xff09;是一种数据库项&#xff0c;能够生成一个整数序列。通常用于填充数字类型的主键列。 Oracle序列 Oracle序列使用教程&#xff1a; 1、创建序列&#xff1a; CREATE SEQUENCE sequence_name[START WITH start_num][INCREMENT BY incr…

深入探索 Vanna:让数据库交互更智能

深入探索 Vanna&#xff1a;让数据库交互更智能 在数字化时代&#xff0c;与数据库进行高效交互是许多开发者、数据分析师和企业面临的挑战。传统的 SQL 查询编写不仅需要对数据库结构有深入的了解&#xff0c;还需要花费大量的时间和精力来调试和优化。Vanna&#xff0c;一个…

C#上位机之网口通信与协议!

文章目录前言一、网口通信概念二、使用网口通信准备三、使用步骤前言 C#上位机之网口通信与协议&#xff01; 一、网口通信概念 定义 &#xff1a;Socket 可以理解为一个通信端点&#xff0c;它提供了应用程序与网络之间的接口&#xff0c;使得应用程序能够在网络上发送和接收…

Android Studio 创建类时如何自动添加类注释

打开IDEA或AS&#xff0c;点击菜单栏File——Settings——Editor——File and Code Templates。 点击右边Tab页的Includes&#xff0c;选择File Header&#xff0c;修改类头模版&#xff0c;如图&#xff1a; 记得选中Project&#xff0c;否则默认是整个AS都会进行设置

C++11:shared_ptr的设计哲学(原理+源码):内存安全和性能的架构权衡

0.简介 在C编程世界中&#xff0c;内存管理是一把双刃剑&#xff0c;手动管理带来了极致的内存控制能力&#xff0c;但也带来了像内存泄漏&#xff0c;野指针等问题&#xff1b;自动垃圾回收虽然安全&#xff0c;但却会带来一定的性能损耗。本文将介绍C11引入shared_ptr&#…

Mysql EXPLAIN 执行计划

EXPLAIN SELECT SQl。。。。界面filtered储引擎返回的数据在经过服务器层 WHERE 条件过滤后&#xff0c;剩余数据占总行数的百分比估计值rows * filtered/100 越接近100%效率越高rowspossible_keys 可能选择的索引key最终决定选择的行partitions问了哪些分区select_type查询…

力扣刷题记录【1】146.LRU缓存

前言&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&…

西门子S7-1200 PLC主流通信方法及应用

一、通信基础 1. 网络术语与设备 - 关键设备&#xff1a;交换机、路由器、网关等。 - 物理接口&#xff1a;RS-485&#xff08;支持多点通信&#xff09;、RS-232C&#xff08;点对点串行通信&#xff09;。 2. OSI参考模型 - 核心框架&#xff1a;理解协议分层&…

MySQL实现任意级子目录的主要方案以及区别

常见的实现方案及区别 1. 邻接表&#xff08;Adjacency List&#xff09; 方案描述&#xff1a; 每条记录存储一个节点的父节点ID。 表结构大致&#xff1a; id INT PRIMARY KEY, name VARCHAR(...), parent_id INT -- 指向父节点的ID&#xff0c;根节点为NULL或0优点&…