一.C和C++第一个程序对比

在C语言中,第一个程序为:
#include<stdio.h>int
}
引用头文件stdio.h,并利用printf函数输出。
而在C++中则需要:
#include<iostream>using
}
引用头文件,展开命名空间std,并利用cout函数来输出。
接下来将对C++的基础语法进行一定的讲解。
二.命名空间namespace
style="color:#1f2329">在C/C++中,变量、函数和类都是大量存在的。
而针对这些大量存在的变量、函数和类,重名的情况就会产生歧义甚至是错误。
而为了解决不同函数、不同类中所存在的同名变量、函数的情况,在C++中定义了namespace命名空间来解决这一问题。
如果将重名变量分别定义在全局域和局部域,程序在调用的过程中会优先调用局部域,然后再去调用全局域。
#include<stdio.h>int
printf("%d\n",::rand);//用冒号,表示输出某个特定命名空间的变量
return
}
例如在上述代码中,同时在全局域和局部域定义了rand变量。
如果只利用printf输出rand变量,则会输出局部变量中所定义的rand,输出结果为0.
如果只想输出全局域的rand变量,则需要利用
前不需要加任何东西。
namespace本质是定义了一个独立于全局域和局部域之外的域,不同的命名空间可以定义相同的变量,其使用语法如下
#include<stdio.h>namespace
printf("%d\n",rand);//默认局部变量
//printf("%d\n",::rand);//全局域中的rand,这里会重载
printf("%p\n",::rand);//rand函数的函数指针
printf("%d\n",example::rand);//example的命名空间中
return
}
命名空间的定义类似于结构体的定义法,不同点是最后没有分号;
在主函数中,如果特定输出example域中的rand变量的值,则需要利用双冒号,example::rand,表示定向输出example域中的rand变量的值。
同样如上例所示,引入了头文件stdlib.h,其内部有rand函数,所以在全局域中定义的rand函数会形成重载,程序编译报错。
C++中存在有局部域、全局域、命名空间域和类域。
而有了不同域的隔离,变量名字相同的情况就得到解决,只需要根据实际需求,去相应的域中找相应的变量即可。
同时命名空间域中变量的生命周期和全局变量相同,持续到整个程序运行结束。
命名空间可以进行嵌套,其嵌套和调用的示例如下:
#include<iostream>namespace
}
如这段代码实例,在example的命名空间中,定义了example1和example2的两个命名空间,如果想要输出example1中a的值,则需要example::example1::a。
通过上例也可以看出,命名空间可以定义变量、函数、结构体(类)。
C++的标准库函数定义在std中,所以在用一些标准输入输出函数之前,要了解其具体在什么命名空间中。
例如cout和cin等函数都在std的命名空间中,所以使用时需要
std::cout<<
;
如果在一整个程序中确认不会出现相同名称的情况下,可以利用如下代码进行命名空间的展开来方便输入输出。
usingnamespace
std;
这里的展开和头文件在编译过程中的展开完全不相同:头文件在编译过程中的展开是将头文件中的内容拷贝到此位置;而命名空间的展开则是指将变量\函数可查找的范围在局部域,全局域之外,新增加了一个std域,并没有将其内容拷贝。
但这种方法虽然在学习C++基础输入输出时一般不会出现问题,但如果在之后一个大的项目中,这样全部展开,容易出现不少错误,所以针对此情况,可以针对常用的函数进行展开,如下面代码所示:
usingstd::cout;
std::endl;
这样就可以在程序中直接调用cout、cin和endl。
如果出现了多个相同名称的namespace,程序会认为其是同一个命名空间而将其合并到一起。
二.C++的输入和输出
在C++中,输入和输出定义到
iostream
Stream的缩写,是标准的输入输出流库,输入输出对象。
std
istream
类的对象,主要面向窄字符的标准输入流。
std::cout是ostream类的对象,主要面向找字符的标准输出流。
std::endl是一个函数,实现了换行以及刷新缓冲区的功能。
<<
是流提取运算符。
值得一提的是,C++中的cout和cin可以自动识别类型,方便用户进行输入和输出操作。


