C++入门(一)

目录

一、命名空间

命名冲突

例如:

定义

作用

例如:隔离

调用

举例

命名空间合并

嵌套使用

选择性释放

二、输入输出

输出流cout

输入流cin

三、缺省参数

定义

全缺省参数

半缺省参数


一、命名空间

命名冲突

我们知道,在C语言中,变量名不能和关键字一样,一个作用域中不能有两个相同的变量名,否则会出现重定义问题

例如:

变量名和函数名冲突

C++入门(一)_第1张图片

定义变量rand,rand是头文件 stdlib.h 下的一个函数,再不包含 stdlib.h 的情况下,正常运行,包含头文件后,会出现重定义的问题。

C语言中没有很好的解决这个问题,因此C++中引用出命名空间来解决冲突变量问题。

定义

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

作用

在全局变量中使用namespace,是在全局变量中隔离出来一片区域,可用来存放变量,函数,结构体,类,也可以嵌套其他命名空间。

例如:隔离

C++入门(一)_第2张图片

用法和结构体类似,但注意结尾没有 " ; " 。

意思是在A这个空间里面存着 rand这个变量

namespace将变量rand和头文件下rand函数隔离开来

打印出来的东西是函数rand的地址。

调用

在项目中,主函数中默认是调用局部变量,没有局部变量再调用隔离空间外的全局变量,那么怎么才能调用命名空间(隔离空间)中的内容呢?

这里就要用到域操作符 " ::"

举例

默认调用局部变量rand=1

C++入门(一)_第3张图片

 没有局部变量时,默认调用除命名空间外的全局变量rand=0

C++入门(一)_第4张图片

当局部变量存在时,怎么调用全局变量呢,用到 “::” 

C++入门(一)_第5张图片

 

调用命名空间中的变量:“命名空间名 + ::+ 空间内容

C++入门(一)_第6张图片

 

命名空间合并

相同的命名空间会进行合并

例如在两个头文件中命名两个相同的空间A

C++入门(一)_第7张图片

测试文件中包含两个头文件

C++入门(一)_第8张图片 

 运行时报错,结构体重定义问题

 说明了命名空间名称相同时,这两个空间进行了合并,变量a,b没有变量冲突问题,但是其中定义的结构体发生了冲突。

那么如何解决这类问题呢?

可进行命名空间的嵌套使用。

嵌套使用

在遇到空间合并时产生的名称冲突问题,可以在命名空间中再进行一次空间命名,嵌套使用

例如:

C++入门(一)_第9张图片

 这样再合并的时候,两个结构体也是再两个命名空间中的独立存在,不会产生命名冲突的问题。

但是多层嵌套的话,往往使用时是很麻烦的

C++入门(一)_第10张图片

 以上述为例

这时我们可以使用

using namespace A;

相当于将命名空间A下的所有内容释放到全局变量中,不再隔离

那么就可以直接省略A::

C++入门(一)_第11张图片

也可以继续释放,例如:

using namespace A;
using namespace data;

C++入门(一)_第12张图片

此时释放了A中的内容,也释放了data中的内容

Node是原来data命名空间中的结构体

能继续释放掉cache命名空间吗?

不行,这样相当于全部释放到了全局变量中

那么命名空间就没有意义了

并且会发生两个结构体重定义的问题

C++入门(一)_第13张图片

 

选择性释放

全部释放时会出现上述:Node不明确,结构体重定义问题。

除了一层一层全部释放的方式,有没有一种方法能有选择性的释放出我们想用的类型呢?

答案是有的。

如:

a,b在原来在两个A中,释放掉A后,a,b彻底暴露在全局变量中,可直接修改

因为先释放了A,再释放了data,因此也可直接使用data中的结构体类型

C++入门(一)_第14张图片

 下来我们有选择性的释放A中data的命名空间

using namespace A::data;

C++入门(一)_第15张图片

此时a,b不能直接修改,n3不能直接定义,因为命名空间A并没有释放掉他们,只是释放了A中的data中的内容,此时n1的结构体类型是原命名空间data中定义的。

再看一个例子:

若释放的是命名空间中的一个内容

直接using+空间名称::释放的类型变量名即可

前面不能加namespace,否则会出错

C++入门(一)_第16张图片

多层嵌套下:

C++入门(一)_第17张图片

 

若释放的是命名空间,即命名空间下所有内容

要加namespace

C++入门(一)_第18张图片

 


二、输入输出

使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。

输出流cout

流插入运算符<<,将要输出的内容插入到控制台中。

在C++的语法中:iostream为头文件,根c中头文件作用一样,std为封C++库的命名空间。

cout(标准输出),endl(换行)就是在std中的。

#include 
using namespace std;
int main()
{
	cout << "hello word" << endl;
	return 0;
}

C++入门(一)_第19张图片

没有用命名空间时,要指定释放cout和endl,才能顺利运行。

C++入门(一)_第20张图片 

输入流cin

cin就相当于键盘输入,通过流提取运算符>>给到变量中。

C++入门(一)_第21张图片

 

输入cin相当于C语言中scanf,输出cout相当于C语言中printf

使用C++输入输出更方便,不需增加数据格式控制

比如:整形--%d,字符--%c

可以多个输入输出


三、缺省参数

定义

缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。

相当给函数的参数加个备胎!!

全缺省参数

全部都给了缺省参数

#include 
using namespace std;

void TestA(int a = 5, int b = 10, int c = 15)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;
}

int main()
{
	TestA();
	TestA(1);
	TestA(1,5);
	TestA(1,5,6);
	return 0;
}

C++入门(一)_第22张图片

 

半缺省参数

缺省部分参数

至少要给定的实参数=未给默认值的形参个数

缺省必须从右往左缺省,并且连续

C++入门(一)_第23张图片

缺省参数不能在函数声明和定义中同时出现

可以声明中给,定义中不给

不能定义中给,声明中不给

你可能感兴趣的:(C++笔记,c++,开发语言,c语言)