C++学习笔记(1)

来源:互联网 发布:诺基亚5300软件 编辑:程序博客网 时间:2024/06/16 16:20
      今天开始学习C++语言。
      先来看一段程序:
     
#include <iostream>
using namespace std;
 
void read() { cout << "read()/n"; }
void sort() { cout << "sort()/n"; }
void compact() { cout << "compact()/n"; }
void write() { cout << "write()/n"; }
 
int main()
{
      read();
      sort();
      compact();
      write();
      return 0;
}
 
      这段程序的功能是输出四个字符串以证明四个函数起作用。其中函数的定义部分不用额外说明,就说两个问题。
      1. #include <iostream>
      2. using namespace std;
 
      第一个问题中,我们惊奇地发现,在iostream后面什么也没有,而传统的C语言会有“.h”的后缀。在C++规范里,所有的“.h”头文件都去掉了。但是编译器生产商为了向前兼容,使标准出台以前的程序都能用,仍然提供了“.h”头文件。所以,凡是有“.h”的头文件都不在C++标准之列,在实际工作中要避免使用。
      第二个问题与第一个问题紧密相关。在C++中引入了一个namespace的概念,叫“命名空间”,其目的在于避免和减少命名冲突。由于在大型项目中会有多人合作,传统的C语言只能通过人为方法来解决命名冲突的问题(如长文件名),这样,程序员在写程序的时候就受到了限制。采用命名空间就可以避免这一问题。
 
      如果我们把程序中的"using namespace std"一行去掉,会有什么样的结果呢?编译会出错,并提示:cout : undeclared identifier,即未定义的标识符。这是因为cout是一个iostream对象,也就是一个输出流对象。它的确在iostream中定义了。但是,它的全称应该写成std::cout。这个std就是一个namespace,所有标准库里的东西都被封装在std这个namespace里。所以,编译器在这里就不能认出cout,因为它不在全局名字空间里。
      于是我们可以把"using namespace std"一行去掉,并把程序中的cout改成std::cout,就可解决这个问题。
 
      当然,如果不想这么麻烦,就留着"using namespace std"一行,下面直接用cout。
 
      还有一种解决办法就是,把"using namespace std"换成"using std::cout",这样更纯洁,只用了std空间的cout方法。
 
      但是,一定不要用<iostream.h>,这样不符合C++规范,也污染了全局空间。
 
      为了进一步巩固命名空间的概念,我们来分析下面这个程序。
#include <iostream>
#include <string>
 
using namespace std;
 
namespace myown1{
string UserName="myown1";
}
 
namespace myown2{
string UserName="myown2";
}
 
int main()
{
cout << "/n" << "Hello," << myown1::UserName << "...and goodbye!/n";
cout << "/n" << "Hello," << myown2::UserName << "...and goodbye!/n";
return 0;
}
 
      这个程序包含了两个头文件:iostream和string,并使用了一个std的命名空间。在这之后,又定义了两个用户命名空间,其中的变量名是相同的,只是用户空间不同。在主函数体中,通过显式调用来访问各自命名空间的变量。
 
      还可以做如下修改。
int main()
{
using namespace myown1;
cout << "/n" << "Hello," << UserName << "...and goodbye!/n";
using namespace myown2;
cout << "/n" << "Hello," << myown2::UserName << "...and goodbye!/n";
return 0;
}
 
     通过使用程序开头的预编译指示器来使用命名空间的变量,从而不用显式地调用;但是第二个变量就只能用显式调用,因为程序无法区分是哪个命名空间的变量。
原创粉丝点击