04-c++ primerm 第二章 开始学习C++ 2.1.5——2.1.7-进入C++

难得的闲暇时光,(●'◡'●)多更一期,明天熄灯睡觉写点别的大笑

2.1.5 名称空间

    如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用:

    using namespace std;    
    这叫做using 编译指令。最简单的办法是,现在接受这个编译指令,以后再考虑它(例如,到第九章再考虑它)。但这里还是简要地介绍它,以免大家一头雾水。
   名称空间支持是一项C++特性,旨在让您编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,它还有助于组织程序。一个潜在的问题是,可能使用两个已封装好的产品,而它们都包含一个名为wanda()的函数。这样使用winda()函数时,编译器将不知道指的是哪个版本。名称空间让厂商能够将其产品封装再一个叫做名称空间的单元中,这样就可以用名称空间的名称来指出想使用哪个厂商的产品。因此,Microflop Industries 可以将其定义放到一个名为Microflop的名称空间中。这样,其wanda()函数的全称为Microflop::wanda();同样,Piscine公司的wanda()版本可以表示为Piscine::wanda()。这样,程序就可以使用名称空间来区分不同版本了:
       Microflop::wanda("go dancing?");
       Piscine::wanda("a fish named Desire");
    按照这种方式,类、函数和变量便是C++编译器的标准组件,它们现在都被放置在名称空间std中。仅当头文件没有扩展名h的,情况才是如此。这意味着在iostream中定义的用于输出的cout变量实际上是std::out,而endl实际上是std::endl。因此,可以省略编译指令using,以下述方式进行编码:
    std::cout<<"Come up and C++ me some time.";
    std::cout<<end::endl;    
    然而,多数用户并不喜欢将引入名称空间之前的代码(使用iostream.h和cout)转换为名称空间代码(使用iostream和std::cout),除非它们可以不费力地完成这种转换。于是,using编译指令应运而生。下面的一行代码表面,可以使用std名称空间中定义的名称,而不必使用std::前缀:
      using namespace std;
    这个using 编译指令使得std名称空间中所有名称都可用。是一种偷懒的做法,在大型项目中一个潜在的问题。更好的方法是,只使所需的名称可用,这可以通过使用using声明来实现:
    using std::cout;
    using std::endl;
    using std::cin;
     用这些编译指令替换下述代码后,便可以使用cin和cout,而不必加上std::前缀:
     using namespace std;
     然而,要使用iostream中的其他名称,必须将它们分别加入到using 列表中。本系列首先采用这种偷懒的方法,其原因有两个。首先,对于简单程序而言,采用何种名称空间管理方法无关紧要;其次,本系列的重点是介绍C++的基本方面。本系列后面将采用其他名称空间管理技术。

2.1.6 使用cout进行C++输出

     现在来看一看如何显示信息。myfirst.cpp程序使用下面的C++语句:

    cout<<"Come up and C++ me some time.";
    双括号括起的部分是要打印的消息。在C++中,用双引号括起的一系列字符叫做字符串,因为它是由若干字符组合而成的。<<符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径。cout是什么呢?它是一个预定义的对象,知道如何显示字符串、数字和单个字符等(第一章介绍过,对象是类的特定实例,而类定义了数据的储存和使用方式)。   
    马上就使用对象可能有些困难,因为几章后才会介绍对象。实际上,这演示了对象的长处之——不用了解对象的内部情况,就可以使用它。只需要知道它的接口,即如何使用它。cout对象有一个简单的接口,如果steing是一个字符串,则下面的代码将显示该字符串:
    cout<<string;
    对于显示字符串而言,只需知道这些即可。然而,现在来看看C++从概念上如何解释这个过程。从概念上看,输出是一个流,即从程序输出的一些列字符。cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。请看下面的语句(注意结尾的分号):
    cout<<"Come up and C++ me some time.";
    它将字符串“Come up and C++ me some time.”插入到输出流中。因此,与其说程序显示了一条消息,不如说它将一个字符串插入到了输出流中。不知道为什么,后者听起来更专业一些。
     补充内容:初识运算符重载
        如果熟悉C后才开始学习C++,则可能注意到了,插入运算符(<<)看上去酒席按位左移运算符(<<),这是一个运算符重载的例子,通过重载,同一个运算符将有不同的含义。编译器通过上下文来确定运算符的含义。C本身也有一些运算符重载的情况。例如,&符号既表示地址运算符,又表示按位AND运算符;*既表示乘法,又表示对指针解除应用。这里重要的不是这些运算符的具体功能,而是同一个符号可以有多种含义,而编译器可以根据上下文来确定其含义(这和确定“sound card”中的“sound”与“sound financial basic”中的“sound”的含义是一样的)。C++扩展了运算符重载的概念,允许为用户定义的类型(类)重新定义运算符的含义。
1、控制符endl

    现在来看看程序2.1.1中第二个输出流中看起来有些古怪的符号:

    cout<<endl;

     endl是一个特殊的C++符号,表示一个重要的概念:重起一行。在输出流中插入endl将导致屏幕光标移动到下一行开头。诸如endl等对于cout来说有特殊含义的特殊符号被称为控制符。和cout一样,endl也是在头文件iostream中定义的,且位于名称空间std中。
    打印字符串时,cout不会自动移动到下一行,因此在程序2.1.1中,第一条cout语句将光标留在输出字符串的后面。每条cout语句的输出从前一个输出的末尾开始,因此如果省略程序2.1.1中的endl,得到的输出将如下:

     Come up and C++ me some time.You won't regret it;

    从上述输出可知,Y紧跟在句点后面。下面来看另一个例子,假设有如下代码:

   cout<<"The Good, the";
   cout<<"Bad, ";
   cout<<"and the Ukulele";
   cout<<endl;
  其输出将如下:
    The Good, theBad,and the Ukulele

    同样,每个字符串紧接在前一个字符串的后面。如果要在两个字符串之间留一个空格,必须将空格包含在字符串中。注意,要尝试上述输出示例,必须将代码放到完整的程序中,该程序包含一个main()函数头以及起始和结束花括号。

2、换行符

    C++还提供了另一种在输出中指示换行的旧式方法:C语言符号\n:

    cout<<"What's next?\n";

    \n被视为一个字符,名为换行符。

    显示字符串时,在字符串中包含换行符,而不是在末尾加上endl,可减少输入量:

     cout<<"Pluto is a dwarf planet.\n";

    cout<<"Pluto is a dwarf planet."<<endl;

    另一方面,如果要生成一个空行,则两种方法的输入量相同,但对大多数人而言,输入endl更为方便:

    cout<<"\n";
    cout<<endl;

    本系列中显示用引用括起的字符串时,通常使用换行符\n,在其他情况下则使用控制符endl。一个差别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上);而使用“\n”不能提供这样的保证,这意味着在有些系统中,有时可能在您输入信息后才会出现提示。

    换行符是一种被称为“转义序列”的按键组合,转义序列将在第三章做更详细的讨论。

2.1.7 C++源代码的格式化

    有些语言(如FORTRAN)是面向行,即每条语句占一行。对于这些语言来说,回车的作用是将语句分开。然而,在C++中,分号标示了语句的结尾。因此,在C++中,回车的作用就和空格或制表符相同。也就是说,在C++中,通常可以在能够使用回车的地方使用空格,反之亦然。这说明既可以把一条语句放在几行上,也可以把几条语句放在同一行上。例如,可以将myfirst.cpp重新格式化为如下所示:
    #include<iostream>
     int
main
()
    {
        using
namespace std;cout
<<
"Come up and C++ me some time."
;
        cout<<
endl; cout<<
"You won't regret it!"<<
endl;
        return 0;}
    这样虽然不太好看,但仍然是合法的代码,必须遵守一些规则,具体地说,在C和C++中,不能把空格、制表符或回车放在元素(比如名称)中间,也不能把回车放在字符串中间。下面是一个不能这样做的例子:
int ma in()       //不合法
re
trun 0;             //不合法
cout<<"Behold the Beans
 of Beauty!";   //不合法
    然而,C++11新增的原始(raw)字符串可包含回车,这将在第四章简要地讨论。
 1、源代码中的标记和空白
    一行代码中不可分割的元素叫做标记。通常,必须用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白。有些字符(如括号和逗号)是不需要用空白分开的标记。下面的一些示例说明了什么情况下可以使用空白,什么情况下可以省略:
return0;       //无效
return(0);    //有效
return (0);   //有效
intmain();   //无效
int main()   //有效
int main ( ) //有效
2、C++源代码风格
    虽然C++在格式方面赋予了您很大的自由,但如果遵循合理的风格,程序将更便于阅读。有效但难看的代码不能令人满意。多数程序员都使用程序2.1.1所示的风格,它遵循了下述规则。

  • 每条语句占一行。
  • 每个函数都有一个开始花括号和一个结束花括号,这两个括号各占一行。
  • 函数中的语句都行对于花括号进行缩进。
  • 与函数名称相关的圆括号周围没有空白。
    前三条规则旨在确保代码清晰易读:第四条规则帮助区分函数和一些也使用圆括号的C++内置结构(如循环)。在涉及其他指导原则是,我将提醒大家。

猜你喜欢

转载自blog.csdn.net/qq_41200424/article/details/80284279