【C++ Primer Plus(6)】CH2 开始学习C++

2.1 进入C++

2.1.1 main()函数

int main(void)
{
    return 0;
}

C++句法要求main( )函数的定义以函数头int main( )开始。函数名后括号中的部分叫做形参列表(argument list)或参数列表(parameter list),它描述的是从调用函数传递给被调用的函数的信息。C++程序必须包含一个名为main( )的函数,函数名需区分大小写不可以是Main( )、MAIN( )或mane( )。在Windows编程中,可以编写一个动态链接库(DLL)模块,这是其他Windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main( )。有些编程环境提供一个框架程序,该程序调用一些非标准函数,如_tmain( )。在这种情况下,有一个隐藏的main( ),它调用_tmain( )。但常规的独立程序都需要main( ),书中讨论的都是这种程序。

2.1.2 C++注释

C++注释以双斜杠(//)打头。//为C风格注释,在C++中亦可以使用。

2.1.3 C++预处理器和iostream文件

#include <iostream>

该编译指令导致预处理器将iostream文件的内容添加到程序中。这是一种典型的预处理器操作:在源代码被编译之前,替换或添加文本。

2.1.4 头文件名

像iostream这样的文件,由于它们被包含在其他文件中,所以叫做包含文件(include file),由于它们被包含在文件起始处,所以也叫头文件(header file)。C++编译器自带了很多头文件,每个头文件都支持一组特定的工具。C语言的传统是,头文件使用扩展名h,将其作为一种通过名称标识文件类型的简单方式。例如,头文件math.h支持各种C语言数学函数,但C++的用法变了。现在,对老式C的头文件保留了扩展名h(C++程序仍可以使用这种文件),而C++头文件则没有扩展名。有些C头文件被转换为C++头文件,这些文件被重新命名,去掉了扩展名h(使之成为C++风格的名称),并在文件名称前面加上前缀c(表明来自C语言)。例如,C++版本的math.h为cmath。

2.1.5 命名空间

名称空间支持是一项C++特性。如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用:

using namespace std;

这叫做using编译指令,该编译指令使得std名称空间中的所有名称都可用。这是一种偷懒的做法,在大型项目中一个潜在的问题。更好的方法是,只使所需的名称可用,这可以通过使用using声明来实现:

using std::cout; // nake cout available
using std::endl; // make endl available
using std::cin; // make cin available

2.1.6 使用cout进行C++输出

cout << "Come up and C++ me some time."

上述代码中双引号括起的部分是要打印的消息。在C++中,用双引号括起的一系列字符叫做字符串,因为它是由若干字符组合而成的。<<符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径。cout是是一个预定义的对象,知道如何显示字符串、数字和单个字符等。
从概念上看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符<<,它可以将其右侧的信息插入到流中。

  1. 控制符endl
    endl是一个特殊的C++符号,和cout一样,endl也是在头文件iostream中定义的,且位于名称空间std中,表示重起一行。
  2. 换行符
    C++还提供了另一种在输出中指示换行的旧式方法:C语言符号\n。显示字符串时,在字符串中包含换行符,而不是在末尾加上endl,以减少输入量.

2.1.7 C++源代码的格式化

在C++中,分号标示了语句的结尾。因此,在C++中,回车的作用就和空格或制表符相同。也就是说,在C++中,通常可以在能够使用回车的地方使用空格,反之亦然。这说明既可以把一条语句放在几行上,也可以把几条语句放在同一行上。
C++源代码风格遵循了下述规则。

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

2.2 C++语句

C++程序是一组函数,而每个函数又是一组语句。

2.2.1 声明语句和变量

要将信息项存储在计算机中,必须指出信息的存储位置和所需的内存空间。在C++中,完成这种任务的一种相对简便的方法,是使用声明语句来指出存储类型并提供位置标签。

int carrots;

这条语句提供了两项信息:需要的内存以及该内存单元的名称。指出程序需要足够的存储空间来存储一个整数,在C++中,编译器负责分配和标记内存的细节。
程序中的声明语句叫做定义声明(defining declaration)语句,简称为定义(definition)。这意味着编译器为变量分配内存空间。在较为复杂的情况下,还可能有引用声明(reference declaration)。
对于声明变量,C++的做法是尽可能在首次使用变量前声明它。

2.2.2 赋值语句

赋值语句表示将值赋给存储单元。符号=叫做赋值运算符。C++(和C)有一项不寻常的特性—可以连续使用赋值运算符。例如:

int steinway;
int baldwin;
int yamaha;
yamaha = baldwin = steinway = 88;

赋值将从右向左进行。

2.2.3 cout的新花样

cout是可扩展的(extensible)。也就是说,可以重新定义<<运算符,使cout能够识别和显示所开发的新数据类型。

2.3 其他C++语句

cin来读取键盘输入以及使用cout将多条输出语句组合成一条。示例:

// getinfo.cpp -- input and output
#include <iostream>

int main()
{
    using namespace std;
    int carrots;
    
    cout << "How many carrots do you have?" << endl;
    cin >> carrots;                // C++ input
    cout << "Here are two more. ";
    carrots = carrots + 2;
// the next line concatenates output
    cout << "Now you have " << carrots << " carrots." << endl;
	// cin.get();
	// cin.get();
    return 0;
}

2.3.1 使用cin

iostream文件将cin定义为一个表示这种流的对象。输出时,<<运算符将字符串插入到输出流中;输入时,cin使用>>运算符从输入流中抽取字符。通常,需要在运算符右侧提供一个变量,以接收抽取的信息(符号<<>>被选择用来指示信息流的方向)。
cout一样,cin也是一个智能对象。它可以将通过键盘输入的一系列字符(即输入)转换为接收信息的变量能够接受的形式。

2.3.2 使用cout进行拼接

cout能够将字符串输出和整数输出合并为一条语句。得到的输出与下述代码生成的相似:

cout << "Now you have " 
	 << carrots 
	 << " carrots." 
	 << endl;

2.3.3 类简介

类是C++中面向对象编程(OOP)的核心概念之一。
**类是用户定义的一种数据类型。**要定义类,需要描述它能够表示什么信息和可对数据执行哪些操作。类之于对象就像类型之于变量。也就是说,**类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。**换句话说,如果说类就好比所有著名演员,则对象就好比某个著名的演员,如蛙人Kermit,表示演员的类中包括该类可执行的操作的定义,如念某一角色的台词,表达悲伤、威胁恫吓,接受奖励等。如果了解其他OOP术语,就知道C++类对应于某些语言中的对象类型,而C++对象对应于对象实例或实例变量。
**类描述指定了可对类对象执行的所有操作。**要对特定对象执行这些允许的操作,需要给该对象发送一条消息。C++提供了两种发送消息的方式:一种方式是使用类方法(本质上就是稍后将介绍的函数调用);另一种方式是重新定义运算符,cin和cout采用的就是这种方式。

2.4 函数

C++函数分两种:有返回值的和没有返回值的。

2.4.1 使用有返回值的函数

有返回值的函数将生成一个值,而这个值可赋给变量或在其他表达式中使用。例如,标准C/C++库包含一个名为sqrt( )的函数,它返回平方根。
简而言之,参数是发送给函数的信息,返回值是从函数中发送回去的值。在使用函数之前,C++编译器必须知道函数的参数类型和返回值类型。
函数原型之于函数就像变量声明之于变量—指出涉及的类型。原型结尾的分号表明它是一条语句,这使得它是一个原型,而不是函数头。如果省略分号,编译器将把这行代码解释为一个函数头,并要求接着提供定义该函数的函数体。
原型只描述函数接口。也就是说,它描述的是发送给函数的信息和返回的信息。而定义中包含了函数的代码。
应在首次使用函数之前提供其原型。通常的做法是把原型放到main( )函数定义的前面(或前面的头文件中):
示例:

// sqrt.cpp -- using the sqrt() function

#include <iostream>
#include <cmath>    // or math.h

int main()
{
    using namespace std;
   
    double area;
    cout << "Enter the floor area, in square feet, of your home: ";
    cin >> area;
    double side;
    side = sqrt(area);
    cout << "That's the equivalent of a square " << side 
         << " feet to the side." << endl;
    cout << "How fascinating!" << endl;
	// cin.get();
	// cin.get();
    return 0;
}

2.4.2 函数变体

有些函数需要多项信息。这些函数使用多个参数,参数间用逗号分开。例如,数学函数pow( )接受两个参数,返回值为以第一个参数为底,第二个参数为指数的幂。

double pow(double, double); // prototype of a function with two arguments

在有些语言中,有返回值的函数被称为函数(function);没有返回值的函数被称为过程(procedure)或子程序(subroutine)。C++与C一样,这两种变体都被称为函数。

2.4.3 用户定义的函数

函数的格式统一为如下:

type functionname(argumentlist)
{
	statements
}

在这里插入图片描述
main不是关键字,由于它不是语言的组成部分。然而,它是一个必不可少的函数的名称。

2.4.4 用户定义的有返回值的函数

示例:convert.cpp

// convert.cpp -- converts stone to pounds
#include <iostream>
int stonetolb(int);     // function prototype
int main()
{
    using namespace std;
    int stone;
    cout << "Enter the weight in stone: ";
    cin >> stone;
    int pounds = stonetolb(stone);
    cout << stone << " stone = ";
    cout << pounds << " pounds." << endl;
	// cin.get();
    // cin.get();
    return 0;
}

int stonetolb(int sts)
{
     return 14 * sts;
}

上述例子表明,函数原型描述了函数接口,即函数如何与程序的其他部分交互。参数列表指出了何种信息将被传递给函数,函数类型指出了返回值的类型。

2.4.5 在多函数程序中使用using编译指令

示例:采用另一种方法让两个函数都能够访问名称空间std,即将编译指令放在函数的外面,且位于两个函数的前面。

#include <iostream>

using namespace std;

void simon(int);    // function prototype for simon()
int main()
{
    // using namespace std;
    simon(3);       // call the simon() function
    cout << "Pick an integer: ";
    int count;
    cin >> count;
    simon(count);   // call it again
    cout << "Done!" << endl;
	// cin.get();
    // cin.get();
    return 0;
}

void simon(int n)   // define the simon() function
{
    // using namespace std;
    cout << "Simon says touch your toes " << n << " times." << endl;
}                   // void functions don't need return statements

2.5 总结

C++程序由一个或多个被称为函数的模块组成。程序从main( )函数(全部小写)开始执行,因此该函数必不可少。函数由函数头和函数体组成。函数头指出函数的返回值(如果有的话)的类型和函数期望通过参数传递给它的信息的类型。函数体由一系列位于花括号({})中的C++语句组成。
有多种类型的C++语句,包括下述6种。

  • 声明语句:定义函数中使用的变量的名称和类型。
  • 赋值语句:使用赋值运算符(=)给变量赋值。
  • 消息语句:将消息发送给对象,激发某种行动。
  • 函数调用:执行函数。被调用的函数执行完毕后,程序返回到函数调用语句后面的语句。
  • 函数原型:声明函数的返回类型、函数接受的参数数量和类型。
  • 返回语句:将一个值从被调用的函数那里返回到调用函数中。

类是用户定义的数据类型规范,它详细描述了如何表示信息以及可对数据执行的操作。对象是根据类规范创建的实体,就像简单变量是根据数据类型描述创建的实体一样。

C++提供了两个用于处理输入和输出的预定义对象(cin和cout),它们是istream和ostream类的实例,这两个类是在iostream文件中定义的。为ostream类定义的插入运算符(<<)使得将数据插入到输出流成为可能;为istream类定义的抽取运算符(>>)能够从输入流中抽取信息。cin和cout都是智能对象,能够根据程序上下文自动将信息从一种形式转换为另一种形式。

C++可以使用大量的C库函数。要使用库函数,应当包含提供该函数原型的头文件。

2.6 复习题

  1. C++程序的模块叫什么?
    答:函数。
  2. 下面的预处理器编译指令是做什么用的?
    #include <iostream>
    
    答:包含iostream,将头文件内容添加到源代码中。
  3. 下面的语句是做什么用的?
    using namespace std;
    
    答:using是预编译器指令,使用std命名空间。
  4. 什么语句可以用来打印短语“Hello,world”,然后开始新的一行?
    答:
    std::cout << "Hello world!" << std::endl;
    
  5. 什么语句可以用来创建名为cheeses的整数变量?
    答:
    int cheeses;
    
  6. 什么语句可以用来将值32赋给变量cheeses?
    答:
    cheeses = 32;
    
  7. 什么语句可以用来将从键盘输入的值读入变量cheeses中?
    答:
    int cheeeses;
    std::cin >> cheeses;
    
  8. 什么语句可以用来打印“We have X varieties of cheese.”,其中X为变量cheeses的当前值。
    答:
    std::cout << "We have " << cheeses << " varieties of cheese.";
    
  9. 下面的函数原型指出了关于函数的哪些信息?
    int froop(double t);
    void rattle(int n);
    int prune(void);
    
    答:
    (1)函数名叫froop,带有一个参数t,参数类型double类型,并且函数返回一个整型值
    (2)函数名叫rattle,带有一个参数n,参数类型是int类型,该函数无返回值
    (3)函数名叫prune,不带参数,该函数无返回值
  10. 定义函数时,在什么情况下不必使用关键字return?
    答:当函数返回值类型为void时。
  11. 假设您编写的main( )函数包含如下代码
cout << "Please enter your PIN: "

而编译器指出cout是一个未知标识符。导致这种问题的原因很可能是什么?指出3种修复这种问题的方法。
答:未使用std命名空间。
(1) using namespace std;
(2) using std::cout;
(3) std::cout << "Please enter your PIN: "

2.7 编程练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值