C++基础入门

前言:哈喽小伙伴们,从这篇文章开始,博主将开启新篇章的讲解——C++语言,那么C++是一门怎么样的语言呢???它的语法又是怎么样的呢???这篇文章将给你一一解答。


目录

一.C++是什么

二.C++关键字

三.命名空间

 四.C++输入/输出

五.缺省参数

六.函数重载

七.引用

 八.内联函数

九.auto关键字

十.基于范围的for循环

十一.指针空值nullptr

总结


一.C++是什么

C++是在祖师爷本贾尼·斯特劳斯特卢普 的带领下,在C语言的基础上,对C语言进行各种各样的优化设计,最终所诞生的一门新型的计算机编程语言。

C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

C++完全兼容C语言这意味着一个C++文件可以完全用C语言来写,但是C语言文件却写不了C++的独特语法,在后边的讲解中,我们会时不时的将这两种语言进行对比。


二.C++关键字

 C++中有很多关键字都来自于C语言,同时也有部分关键字是C++所独有的,这些关键字我们在这里不做过多解释,重要的关键字后边都会一一讲到。


三.命名空间

我们知道在C语言中,在同一个域内不能定义两个相同名字的变量

比如说我们定义了两个全局变量a,它们都处于全局域中,就会报出重定义的错误

但是在不同的域中却可以定义相同名字的变量

并且会根据就近原则来输出变量。

但是在C++中,存在一个命名空间的概念,可以让两个同名变量处在同一作用域中

 

如上图所示,命名空间的创建需要使用关键字namespace,我们在全局域中建立了两个命名空间,并分别命名为a1、a2,它们两个都存放名为a的变量

想要使用这两个变量,需要用到域作用限定符“::”在其前边加上命名空间的名字,便可访问对应命名空间中的变量了。

如果不使用域作用限定符,则默认只会在局部域搜索,局部域没有则搜索全局域

值得注意的是,存放的命名空间中的变量虽然定义在全局域,但是如果不使用域作用限定符,是无法对其进行调用的

除了变量之外,函数,结构体等等都可以在命名空间中定义。

值得注意的是,当两个命名空间同名时,并不会发生冲突,而是会将它们合并。如果合并之后存在同名的变量,则会报错。 

但是命名空间也会存在一些问题,如下:

如果我们的命名空间中同时有很多个变量都需要被访问,那么我们需要不断地使用域作用限定符,这样就会显得有些繁琐,所以我们可以通过如下代码:

using namespace 命名空间名;

将命名空间按照类似于头文件的使用方法展开,这样命名空间中的变量就又变成全局变量了,不会收到命名空间的限制

当然,我们也可以选择仅将命名空间中的若干个变量展开

将命名空间展开虽然方便,但无疑可能又会导致命名冲突所以不建议在很大的域中使用,仅建议在一个小域中图方便使用

命名空间也可以嵌套使用:

要注意的是域作用限定符也需要嵌套使用。 


 四.C++输入/输出

cout<<        流输出       

cin>>          流输入

想要使用它们需要使用头文件#include<iostream>,以及展开C++的标准库命名空间std

using namespace std;

C++的输入输出可以摆脱格式化的输入输出方式

 能够看出cin和cout的输入输出不需要%d、%c等格式化方式能够自动识别类型

但是我们发现这么多变量的输出之间都没有间隔,这是因为cout的输出默认都是连着的,所以我们需要自己添加间隔


五.缺省参数

我们先来看一段代码:

#include<iostream>
using namespace std;
int add(int x = 1, int y = 2)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int sum1 = add(a, b);
	int sum2 = add();
	cout << sum1 << endl;
	cout << sum2 << endl;
	return 0;
}

能够看到,以前在C语言中,add函数的形参我们都是没有初始化过的,但是在C++中,函数的参数都是可以初始化的,像这样初始化形式参数的函数,就叫做缺省函数

sum1对应的函数有实际参数,而sum2对应的函数没有实际参数,它们的结果分别是什么呢??

能够看出,初始化了实际参数的sum1的结果为30,而未初始化实际参数的sum2的结果为3

这能够说明,如果缺省函数有实参,则会将实参带入,反之则带入形参

我们也可以在有多个参数的情况下,只传若干个实际参数

这样也默认只会接收一个实参

上述函数的两个形参我们都进行了初始化,这样的函数称为全缺省函数,当然也存在半缺省函数,也就是函数的部分形参初始化,但是没有初始化的参数必须靠左:

#include<iostream>
using namespace std;
int add(int x, int y = 2)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int sum1 = add(a, b);
	int sum2= add(a);
	cout << sum1 << endl;
	cout << sum2 << endl;
	return 0;
}

如上代码,半缺省函数我们只能让x不初始化,而不能将x初始化而y不初始化,因为实参的传入默认是从左向右的,所以如果y不初始化且没有实参传入时,就会报错了


六.函数重载

在C语言中,同样不能存在同名的函数,但是在C++中,我们仍然可以实现,这就叫函数重载

那么在C++中,函数重载的条件是什么呢???

  • 参数类型不同
  • 参数数量不同
  • 参数顺序不同

 以上展示的函数重载方式均可以实现。


七.引用

所谓引用,又叫起别名,就是给一个变量起一个新的名字

类型& 新名 = 原名

给变量a起一个别名b,当a改变时,b也随之改变,说明两者就是一个变量的不同名字。 

这样能够看出,引用在C++中就相当于是C语言的指针

我们知道,在swap交换函数中,如果想要实现两个参数值的真正交换,需要传参数的地址并用指针去接收

但是在C++中,我们可以直接用别名做形参

这样的写法比指针简单的多,需要顾虑的细节也少了。

在使用引用时,我们需要注意以下三点:

  • 引用必须初始化(别名必须有主)
  • 引用定义后,不能改变指向(一个别名不能被多个人使用)
  • 一个变量可以有多个引用(一个人可以有多个别名)

虽然引用比指针好用,但是它并不能完全取代指针,因为它不能改变指向,所以对于链表,二叉树的操作就无法完成。 


 八.内联函数

我们知道,在C语言中,某些简单的函数可以使用写宏函数来代替,这是因为宏函数的使用不需要创建函数栈帧能够加快代码的效率。但是宏函数同时也有很多缺点,比如宏不方便调试,代码的可读性差,可维护性差等等。

而在C++中,存在内联函数的定义,能够在保证函数形式不变的前提下,达到宏函数不创建栈帧而加快代码效率的效果,这需要使用到关键字inline

#include<iostream>
using namespace std;
inline int add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);
	cout <<"sum = "<< sum << endl;
	return 0;
}

内联函数的作用和宏一样,都是将函数内的代码替换函数的调用,这就存在着和宏一样的问题:

函数的代码过多以及函数的调用次数过多就会导致整体代码量过大,从而加重代码效率等等,所以内联函数虽然优化了一些宏函数的问题,但同时我们也不能将所有的函数都当做内联函数来使用


九.auto关键字

auto称为自动识别类型关键字用auto定义的变量能够自动识别其所访问的变量的类型作为自己的类型

    int a = 10;
    auto b = a;

如上述代码,用auto定义的变量b访int型变量a,则变量b的也行即为int

但是单纯的这样写好像也没有什么大用处,实际上这样确实没有用处,但是如果变量b要访问的是一个函数指针类型

void(pf*)(void,void);

这种类型的书写过于复杂,所以我们就可以使用auto:

int add(int x, int y)
{
    return x + y;
}

auto b = add(x,y);


十.基于范围的for循环

在C++中,for循环有一种新的用法,如果我们已知要循环的范围大小,就可以用一种新的方式来进行迭代循环,这里以数组为例,因为对数组而言,其范围是确定的

其中int是数组类型e是作为一个临时拷贝参数来拷贝数组的元素并打印。 这样的for循环写法能够不断进行迭代,将数组元素赋值给e,并自动判断结束


十一.指针空值nullptr

在C语言中,如果要将一个指针置空,我们知道要使用NULL,但是在C++中,NULL在底层代码中被宏替换为了0,也就是说在C++中,NULL实际上就是0

而在C++中如果要将指针置空,需要使用新的关键字nullptr


总结

关于C++的入门基础知识到这里就分享完啦,希望能够对刚刚学习C++的小伙伴们有所帮助。

喜欢博主文章的小伙伴们记得一键三连哦,我们下期再见!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 00:30:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 00:30:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 00:30:01       87 阅读
  4. Python语言-面向对象

    2024-01-31 00:30:01       96 阅读

热门阅读

  1. Mysql学习笔记第七章—事务

    2024-01-31 00:30:01       50 阅读
  2. Spring WebSocket实现实时通信

    2024-01-31 00:30:01       56 阅读
  3. springboot请求406、500问题

    2024-01-31 00:30:01       58 阅读
  4. DC-证书颁发机构(23国赛真题)

    2024-01-31 00:30:01       52 阅读
  5. 多语言游戏网站

    2024-01-31 00:30:01       71 阅读
  6. Bean

    2024-01-31 00:30:01       54 阅读
  7. 20240129 大模型快讯

    2024-01-31 00:30:01       66 阅读
  8. Vue2 悬浮球

    2024-01-31 00:30:01       54 阅读
  9. Springboot整合mqtt采用注解进行监听(第二篇)

    2024-01-31 00:30:01       68 阅读
  10. 2.1写一个梅林dynv6插件(上)

    2024-01-31 00:30:01       71 阅读
  11. 为什么Vue3双向绑定使用Proxy

    2024-01-31 00:30:01       71 阅读
  12. 飞往前端的第二天

    2024-01-31 00:30:01       50 阅读
  13. SpringMVC初始化源码学习

    2024-01-31 00:30:01       51 阅读