Hello大家好,今天通过本篇文章,我们来初步学习C++,C++可以说是对C语言的一个升级,我们会一步一步的由浅入深的学习C++。
目录
1.第一个C++程序
2.命名空间
2.1 命名空间出现的意义
2.2 namespace的定义
2.3 命名空间的使用
3.C++输入&输出
4.缺省参数
5.函数重载
总结:
1.第一个C++程序
大家都知道,每一个语言都有我们的第一个程序,也就是hello world,那么我们C++的helloworld程序应该怎么写呢,我们可以看一下,代码如下。
#include<iostream>
using namespace std;
int main()
{cout << "hello world" << endl;return 0;
}
观察上面的代码,我们可以与C的程序进行比较,我们可以发现,二者比较相似,因为C++就是由C语言发展而来的,C++包含的头文件并不是<stdio.h>,C++的标准头文件是<iostream>,还有namespace命名空间的使用,以及输入输出的不同,我们都会在后面讲到。
大家可能有疑问,为什么C++头文件没有.h后缀呢,这是由于在C++的发展中,最早之前的头文件也是含有.h后缀的,但是之后为了区分新老版本,就在新版本中将头文件的后缀去掉了,如果你在一些比较老的编译器中,还是可以使用<iostream.h>的,只是已经比较少了。
我们接着向下讲C++知识
2.命名空间
我们通过上面的第一个C++程序,或者如果之前见到C++语言,我们都很容易发现都会有这句话
using namespace std;
那么这句话到底是干什么的呢?这就涉及命名空间的知识了。
2.1 命名空间出现的意义
正如名字命名空间描述的一致,命名空间实质上像是一个空间,即一作用域。
我们在之后的C++程序中,会使用到大量的函数和类变量,这些变量都会存在于全局作用域中,可能会导致许多命名冲突,这时如果我们将变量,函数放到不同的命名空间中,我们就能避免这些冲突 ,这就是namespace出现的意义。
举个具体的例子
在后面我会用命名空间,来解决这个问题
2.2 namespace的定义
- 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
如图所示,我们自己创建了一个命名空间lmd,里面可以放变量,函数,以及创建的结构体类型
- namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。
我们可以试着解决一下,刚才函数名和变量名冲突的问题
很显然这个问题以及解决了
同时我们也发现,要使用作用域里的东西,需要在变量名前加 :: 这个符号,标明你所用的变量出自那个作用域
- C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。
- namespace只能定义在全局,当然他还可以嵌套定义。
- 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
多文件种定义同名的namespace会被合并为同一个namespace,并不会发生冲突。
- C++标准库都放在⼀个叫std(standard)的命名空间中。
也就是我们平常使用的using namespace std;
2.3 命名空间的使用
命名空间的使用即使用using namespace + 命名空间的名字
这个操作相当于将命名空间展开
注意:这里的展开与C语言中头文件的展开并不一致
命名空间相当于一个带边界的空间,当我你们使用using时,会将这个边界打开,即命名空间的使用,并不是将namespace中的各中变量拷贝到文件中去。
但是请注意:展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
3.C++输入&输出
- <iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
- std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输入流。
- std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
- <<是流插入运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
在C++中,有许多符号在不同的地方有不同的含义,这里>>和<<就是一个例子
- 使⽤C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输⼊输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。
如图所示,在C++由于可以字段识别类型,可以减少冗杂的代码量,让我们非常的舒适。
- cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使方式去使用他们。
- ⼀般⽇常练习中我们可以using namespace std,实际项目开发中不建议using namespace std
这样可以将std::cin,std::cout直接写为cin和cout非常的方便,但是如果在开发项目中,使用命名空间,可能会导致变量冲突不建议使用。
- 这里我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。
4.缺省参数
什么是缺省参数?
- 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
void Func(int a = 0)
{
cout << a << endl;
}
如图所示即一个缺省参数,当调用Func时,若不给参数,则默认a = 0,若给参数,a就等于所给的参数。
- 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
可以看到不能间隔跳跃给缺省值
- 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
可以看到在调用缺省函数时,不能跳跃给实参。
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
5.函数重载
C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同⼀作用域中出现同名函数的。
以上便是函数重载的一个实例,可以发现函数重载十分方便,能用一个函数名完成多种内部实现
要实现函数重载必须满足一个及以上下面的条件
- 参数类型不同
- 参数个数不同
- 参数类型顺序不同
注意:返回值不能作为重载条件,因为在调用时也无法区分
总结:
以上便是,我们初识C++入门基础的第一章内容,主要讲了命名空间,输入输出,缺省参数及函数重载,希望对你有所帮助。