C++:第一个程序

C++的第一个程序为一个向控制台输出向世界问好的程序,源码如下,其程序文件名可为HelloWorld.cpp:

#include <iostream>//包含进含输入输出内容的头文件
using namespace std;//表示将在程序中引入标准命名空间std中的成员,如此方可在下面的程序中如普通变量般使用成员cout和endl;
int main(int argc, char** argv)
{
  cout<<"Hello World!"<<endl;
  return 0;
}

程序主要由三部分组成,分别为:包含头文件(#include指令)、使用命名空间(using声明)和程序的主函数main。下面分别对这三部分进行介绍。

(1)头文件

语句#include中的中的iostream就是被include语句包含的头文件。在原来的C语言中,头文件都是以x.h的形式存在的。而在C++语言中,头文件只有名字,而没有扩展名.h,如iostream就是一个没有扩展名.h的C++头文件。原有的C语言体系的头文件部分仍然以x.h的形式存在,部分头文件被升级到C++体系中而不复存在,这部分均在原有名字的前面添加字符c来加以标志(表示此头文件是升级原C语言头文件而来的),如cmath,ctring。

头文件的功能主要是将源程序片段收集到一起,形成一个提供给编译程序的文件。一般情况下,头文件中只包含各种声明、常量定义(注意这是常量)、预编译、注释、类型定义、模板定义等。常规的函数定义、数据定义、导出的模板定义等不应该出现在头文件中。

使用头文件主要是为了提供类、函数、变量的声明,从而可以方便地使用这些类、函数、变量等。

(2)命名空间:namespace

所谓命名空间,为一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。namespace是定义命名空间的关键字,如:namespace ns1{ int a;double b; } ,为定义一个命名空间的例子,其中ns1是命名空间的名称。

在命名空间名称的后面是一对括有内容的花括号,其为声明块,在声明块中声明的实体成为命名空间成员(namespace member),如,在上述定义的命名空间ns1中,就声明了两个命名空间成员,分别为变量a和b(注意:a与b,是两个隐藏在指定命名空间ns1中的全局变量)。

命名空间的主要作用在于:建立一些互相分割的作用域,把一些全局实体分隔开来。根据需要,可以在程序中设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名,命名空间中的成员也不能同名(这样的规则解决了名字冲突问题)。如此,可以把不同的库中的实体放到不同的命名空间中,或者说,用不同的命名空间把不同的实体隐蔽起来。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用 namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。

在声明一个命名空间时,由花括号组成的声明体中,不仅可以包括变量,还可以包括如下的内容:(1)变量(可是带有初始化),(2)常量,(3)函数,(4)结构体,(5)类,(6)模板,(7)命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。如下,为有一个定义命名空间的例子:

namespace ns2//定义一个名为ns2的命名空间
{ 
    double a;//(1)变量
    const int PI=3.14;//(2)常量
    int fun1(){ ... return 0;} //(3)函数
    typedef struct Mat{int b[][];}Mat;//(4)结构体
    Class A{ public: ... protect: ... private: ... };//(5)类
    template <typename T>//(6)函数模板
    int fun2(T c){ ... return 0;}  
    namespace ns3{int d;}//(7)嵌套的命名空间
} 

命名空间成员的使用方式(以引用上述的命名空间ns2为例):

(1)using namespace ns2; ... a=5;//先说明使用命名空间ns2,即可在程序中像使用寻常变量一般使用变量命名空间中的成员a;
(2)using ns2::PI; ... double z=PI*2*2;//先说明使用命名空间中的某一成员,如常量PI,即可如常使用命名空间中的成员;
(3)double y=ns2::a*18;//在未声明使用命名空间,或使用命名空间中的成员的情况下使用命名空间中的成员,需在变量名的前面加上所属命名空间名称ns2和作用域操作符“::”,如“ns2::a”,方可在程序中引用命名空间ns2中的成员a;

标准命名空间std:为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间 std中定义的。std是standard(标准)的缩写,表示这是存放标准库的有关内容的命名空间,含义请楚,不必死记。这样,在程序中用到C++标准库时,需要使用std作为限定。如std::cout<<”OK.”<<endl;

(3)C++程序中的主函数main

执行C++程序,即执行编译C++程序后产生的可执行文件,编译C++源文件会产生两种类型的文件,一类为可执行文件,一类为供其他程序调用的库文件,而唯有含main函数的C++源文件方可编译成可执行文件,且一个C++程序(或一个C++工程)也只能有一个含main函数的源文件。

C++ main函数的签名有如下几种:

(1)int main(int argc,char** argv);
(2)int main(int argc,char* argv[]);
(3)int main();
(4)void main();

由以上的main函数签名可知,main函数可以有返回值,且这个返回值的类型为int,也可以没有返回值。此外,main函数可以有输入参数,也可以没有输入参数,且在有输入参数时,只能有两个参数,而这两个参数的第一个为argc(argument count):表示传入mian函数的数组元素个数,为int类型,第二个参数为argv(argument vertor):表示传入main函数的一维字符指针数组,为char**,或char* []类型,数组的第一个元素argv[0]是可执行文件的路径(包括可执行文件的名称),由用户输入的字符串参数将会存在argv[1],argv[2],…中,即数组至少有一个参数,而argc在没有参数输入时,也会等于1,表示数组有一个参数。

一般情况下,编译器会默认使用argc和argv这两个名称作为main函数的参数,但这两个参数的命名不是规定的,程序设计这可以用任何符合C++语言命名规范的变量名指定这两个参数,只要保证第一个参数的类型为int,第二个的为char或char* []即可,如“int main(int argc,char argv);”可改为“int main(int count,char** input_parameters);”。

main函数的返回值被用来指示状态。返回值0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型。

如下为C++的一个入门级程序:HelloWorld.cpp,其中带有一些代码注释,功能为在控制台输出字符串:”Hello World!“:

#include <iostream>
//实现用using关键字声明使用标准命名空间std中的成员cout和endl,以便在程序中可以如同普通变量一般使用成员cout和endl;
using namespace std::cout;
using namespace std::endl;

int main(int argc, char** argv)
{
  cout<<"Hello World!"<<endl;
  return 0;
}

函数传参:由于main函数在程序中不能被其它函数所调用,所以在程序中不可能通过调用main函数以给main函数传参。那么,如何为main函数传参呢?其实,main函数的参值数是在操作系统的命令行处获得的。

(1)在Windows系统中,打开命令行窗口,定位于可执行程序所在目录,输入如下命令:”program_name.exe pram1 pram2“,则运行可执行程序program_name.exe,并给main函数传入了三个参数,其中,第一个默认为可执行程序所在路径,第二,第三个则分别为”pram1“和”pram2“。

(2)在Ubuntu系统的KDevelop集成开发环境中,依次点击:run(运行)——configure launches(配置启动器)——选中要运行的可执行程序,然后再在右侧的参数栏中输入对应的main参数即可,多个参数用空格分开。设置如下图所示,表示选择c+±test可执行程序运行,并输入main参数:pram1和pram2:
main函数传参
如下为一个在Ubuntu上的集成开发环境KDevelop上编辑的程序,功能为获取命令行中输入的main参数并输出:

#include <iostream>
int main(int argc, char **argv) {
  //cout和endl对象都为标准命名空间std中的成员,使用它们时,如果没有事先用关键字using声明使用标准命名空间std,则需在使用它们时,在其前面加上”std::“以限定其属于标准命名空间std;
  std::cout<<"main参数的个数为:"<<argc<<std::endl;
  std::cout<<"第一个main参数为:"<<argv[0]<<std::endl;
  std::cout<<"第二个main参数为:"<<argv[1]<<std::endl;
  std::cout<<"第三个main参数为:"<<argv[2]<<std::endl;
  return 0;
}

实验结果如下图所示:
实验结果

猜你喜欢

转载自blog.csdn.net/yiminghd2861/article/details/82938465