入门C++必备知识
引入:C与C++
我们原来就知道,C语言是一个面向过程的编程语言,
而C++是一个面向对象的编程语言。
C++是在C语言的基础之上产生与发展的,它的语法与功能对C语言进行了优化与增加,丰富了我们的编程工具。下面,我们正式打开C++的大门
1.命名空间域
1.1概念
我们知道在C语言中,定义变量不同那个的变量的名字不能冲突;但在实际工程中,一个项目往往需要多人协作完成,这是每个人所命名的变量不可避免的会冲突,甚至个人定义的变量名会和库中的变量函数名起冲突。C++中为了解决这些问题,引入了命名空间的概念。
什么是命名空间?
命名空间就是对标识符(变量、函数)的名称进行本地化,避免命名冲突的空间。
1.2命名空间的定义
我们定义命名空间需要用到C++库里的一个关键字:
namespace
命名空间域的语法规则:
namespace Zhao
{
//定义变量
int a;
int b;
//定义结构体
struct A {
int I;
int LOVE;
int YOU;
};
//定义函数
int ADD(int x, int y)
{
return x+y;
}
//命名空间的嵌套
namespace little_Zhao
{
int a;
//.....
}
}
命名空间的特点:
1.命名空间内部可定义变量、函数、类型…
2.命名空间支持嵌套。
我们了解了命名空间域的基本特性,不妨来回忆一下C语言学习期间的作用域的概念。
我们之前知道:作用域有——全局域,局部域;
今天的命名空间也属于作用域,我们定义了一个命名空间就是定义了一个新的作用域。
1.3命名空间的使用
那我们如何访问到命名空间域呢?
我们知道,当不指定空间,编译器搜索时会按以下步骤进行:
1.现在局部域中进行搜索
2.全局域中进行收索;
那定义了一个命名空间域编译器能否自动去命名空间域去寻找呢,我们不妨做一下实验:
说明编译器并不会自动去命名空间中搜索。
那我们指定想要的作用域搜索要如何做呢?
这就不得不介绍域作用限定符——::
域作用限定符的作用就是指定直接在某作用域中搜索
因此我们有了第一种使用命名空间的方式:空间的名称+作用限定符。
例如:我们访问Zhao空间中的a变量。
特例:那嵌套的空间中的变量又该如何访问呢?
由此可见,域作用限定符也可嵌套使用。
我们每访问一次域名空间都要适用于限定符有些麻烦,因此在C++中我们还用两种访问/使用命名空间域的方式——直接将命名空间或内部的变量进行展开,我们又需要用到新的关键字:
using
方法二:展开某一个域名空间
方法三:展开指定域名空间中的命名空间
注意展开的只能是命名空间*不能为其他。*不然编译器会报错
最后,命名空间还需注意使用using展开后就相当于作用在全局域(或局部域),所以使用using展开时需要谨慎处理。
2.C++版本的输入与输出
还记得当初第一次学习C语言时,我们第一次认识的程序便是在屏幕上打印字符串“hello world”。
那C++同样我们从打印开始学起,下面我们一起来看一个代码:
iostream :是一个头文件,cout流被包含在其中;
std: 其实是所有C++库中的命名空间,所以红色圈起来的代码表示:展开所有C++库中的命名空间;
cout :其实是一个输出流,同时我们还有输入流——cin
<<: 大家是不是很眼熟?没错它是C语言中的左移运算符,但在此处他有另外的含义:流插入并自动识别类型,在这它是一个流插入运算符。C++中我们不用控制变量类型进行打印,<<就能自动识别类型。同时 >> 就是一个流提取操作符。
endl :相当于“\n”.
至此,我们初步就能读一些C++代码了
3.缺省参数
3.1缺省参数的概念
缺省参数其实是在声明和定义函数时指定一个缺省值,如下:
如图中实验可看出:
调用函数时若没有指定相应的实参,那调用时使用形参的缺省值,
若指定了实参则直接调用实参的值,形参缺省值此时不起作用。
3.2缺省参数的分类
当一个函数有多个参数时,缺省参数可分为半缺省与全缺省参数。
全缺省参数
半缺省参数
缺省参数的调用同样不能间隔调用,只能从左往右调,这一点对全缺省与半缺省都一样。
3.3声明与定义分离的缺省参数
在实际工程中,函数的声明与定义往往在两个文件(头文件与cpp文件)中,那此时缺省参数要放在哪呢?
如图所示,缺省参数在声明与定义中都出现编译器会报错。
那缺省参数应该写到哪呢?
要深刻认识这个问题我们不妨再来回忆一下编译器的翻译过程:
当找不到函数的定义时,编译器将会报链接的错误:
那编译器底层调用函数的实质是什么呢?
我们通过汇编代码来进行浅略分析:
以上过程说明函数在声明过程已经定性,因此当声明与定义分离时缺省函数应该在声明时出现。