C++ Primer Plus 第2章 开始学习C++

2.1 进入C++

C++对大小写敏感,也就是说区分大写字符和小写字符。
C++能够使用printf()、scanf()和其他所有标准C输入和输出函数,只需要包含常规C语言的stdio.h文件。

// 程序清单2.1
// myfirst.cpp -- displays a message
#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;
}

myfirst.cpp示例包含下述元素:
(1)注释,由前缀//标识
(2)预处理器编译指令#include
(3)函数头:int main()
(4)编译指令using namespace
(5)函数体,用{和}括起
(6)使用C++的cout工具显示消息的语句
(7)结束main()函数的return语句

2.1.1 main()函数


1、函数头对函数与程序其他部分之间的接口进行了总结。
(1)描述了函数与调用它的函数之间的接口。
(2)函数返回类型:描述的是从函数返回给调用它的函数的信息。
(3)形参列表/参数列表:描述的是从调用函数传递给被调用函数的信息。空括号意味着函数不接受任何信息。
2、函数体是指出函数应做什么的计算机指令。
3、在C++中,每条完整的指令都称为语句。所有的语句都以分号结束。语句是要执行的操作。
4、main()被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统之间的桥梁。
5、int main()的变体
(1)main():在C语言中,省略返回类型相当于说函数的类型是int
(2)int main(void):在括号中使用关键字void明确地指出,函数不接受任何参数。在C++中,让括号空着与在括号中使用void等效;在C中,让括号空着意味着对是否接受参数保持沉默。
6、如果编译器到达main()函数末尾没有遇到返回语句,则认为main()函数以如下语句结尾:return 0;(这条隐含的返回语句只适用于main()函数,而不适用于其他函数)。
7、C++程序必须包含一个名为main()的函数。
(1)在运行C++程序时,通常从main()函数开始执行。因此,如果没有main(),程序将不完整,编译器将指出未定义main()函数。
(2)例外:在Windows编程中,可以编写一个动态链接库(DLL)模块,这是其他其他Windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main()。用于专用环境的程序——如机器人中的控制芯片——可能不需要main()。

2.1.2 C++注释

1、C++注释以双斜杠(//)打头,到行尾结束。
2、注释是程序员为读者提供的说明,通常标识程序的一部分或解释代码的某个方面。
3、编译器忽略注释。
4、注释可以位于单独的一行上,也可以和代码位于同一行。
5、C++也能够识别C注释,C注释包括在符号/* */之间。C-风格注释以 */结束,而不是到行尾结束,因此可以跨越多行。

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

1、如果程序要使用C++输入或输出工具,请提供这样两行代码:

#include <iostream>     // 该编译指令导致预处理器将iostream文件的内容添加到程序中
using namespace std;

2、预处理器
(1)在进行主编译之前对源文件进行处理,在编译程序时自动运行
(2)处理名称以#开头的编译指令
(3)典型的预处理器操作:在源代码被编译之前,替换或添加文本
3、使用cin和cout进行输入输出的程序必须包含文件iostream

2.1.4 头文件名

1、像iostream这样的文件叫做包含文件——由于他们被包含在其他文件中;也叫做头文件——由于他们被包含在文件起始处。
2、头文件命名约定
(1)C语言的传统是,头文件使用扩展名h
(2)C++对老式C的头文件保留了扩展名h
(3)C++头文件没有扩展名
(4)有些C头文件被转换为C++头文件,这些文件被重新命名,去掉了扩展名h,并在文件名称前面加上前缀c
在这里插入图片描述

2.1.5 名称空间

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

// 第一种
using namespace std;   // using编译指令,使得std名称空间中的所有名称都可用
cout << "Come Up and C++ me some time." << endl;
// 第二种
std::cout << "Come Up and C++ me some time." << std::endl;
// 第三种
using std::cout;   // using声明,只声明所需名称
using std::endl;
cout << "Come Up and C++ me some time." << endl;

1、名称空间支持是一项C++特性,旨在让您编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,它还有助于组织程序。
2、名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以用名称空间的名称来指出想使用哪个厂商的产品。

2.1.6 使用cout进行C++输出

1、在C++中,用双引号括起的一系列字符叫做字符串,因为它是由若干字符组合而成的。
2、<<符号表示该语句将把这个字符串发送给cout,该符号指出了信息流动的路径。
3、cout是一个预定义的对象,知道如何显示字符串、数字和单个字符等。
4、输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。
5、运算符重载:通过重载,同一个运算符将有不同的含义。编译器通过上下文来确定运算符的含义。
例:<<:插入运算符/按位左移运算符
6、控制符endl
(1)表示重起一行
(2)在输出流中插入endl将导致屏幕光标移动到下一行开头
(3)诸如endl等对于cout来说有特殊含义的特殊符号被称为控制符
7、换行符
C++还提供了另一种在输出中指示换行的旧方法:C语言符号\n,\n被视为一个字符,名为换行符

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

2.1.7 C++源代码的格式化

1、在C++中,回车的作用就和空格或制表符相同。
2、在C和C++中,不能把空格、制表符或回车放在元素(比如名称)中间,也不能把回车放在字符串中间。
3、一行代码中不可分割的元素叫做标记,必须使用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白。有些字符(如括号和逗号)是不需要用空白分开的标记。
在这里插入图片描述
4、C++源代码风格
(1)每条语句占一行
(2)每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行
(3)函数中的语句都相对于花括号进行缩进
(4)与函数名称相关的圆括号周围没有空白

2.2 C++语句

// 程序清单2.2 carrots.cpp -- food processing program
// uses and displays a variable

#include <iostream>

int main()
{
    using namespace std;

    int carrots;

    carrots = 25;
    cout << "I have ";
    cout << carrots;
    cout << " carrots.";
    cout << endl;
    carrots = carrots - 1;
    cout << "Crunch, crunch. Now I have " << carrots << " carrots." << endl;
    return 0;
}

2.2.1 声明语句和变量

1、要将信息项存储在计算机中,必须指出信息的存储位置和所需的内存空间。使用声明语句来指出存储类型并提供位置标签。
2、int是基本的数据类型,表示整数。
3、声明通常指出了要存储的数据类型和程序对存储在这里的数据使用的名称。
4、程序中的声明语句叫做定义声明语句,简称为定义。这意味着它将导致编译器为变量分配内存空间。在较为复杂的情况下,还可能有引用声明。这些声明命令计算机使用其他地方定义的变量。通常,声明不一定是定义。
在这里插入图片描述
5、C++在首次使用变量前声明它。

2.2.2 赋值语句

1、赋值语句将值赋给存储单元。
2、符号=叫做赋值运算符,可以连续使用赋值运算符。

int yamaha;
int baldwin;
int baldwin;
yamaha = baldwin = steinway = 88; // 赋值将从右向左进行

2.2.3 cout的新花样

1、cout可用于数字和字符串。在打印之前,cout将整数形式的数字转换为字符串形式。
2、cout的智能行为源自C++的面向对象特性。C++插入运算符(<<)将根据其后的数据类型相应地调整其行为。也可重新定义<<运算符,使cout能够识别和显示所开发的新数据类型。

2.3 其他C++语句

// 程序清单2.3 
// getinfo.cpp -- input and output
#include <iostream>

int main()
{
    using namespace std;

    int carrots;

    cout << "How many carrots do you have?" << endl;
    cin >> carrots;  //信息从cin流向carrots
    cout << "Here are two more. ";
    carrots = carrots + 2;
    cout << "Now you have " << carrots << " carrots." << endl;

    return 0;
}

2.3.1 使用cin

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

2.3.2 使用cout进行拼接

2.3.3 类简介

1、类是用户定义的一种数据类型。
2、要定义类,需要描述它能够表示什么信息和可对数据执行哪些操作。
3、类之于对象就像类型之于变量。类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。
4、cout是一个ostream类对象。ostream类定义描述了ostream对象表示的数据以及可以对它执行的操作;cin是一个istream类对象。ostream类和istream类都是在iostream文件中定义的。
5、类可以来自类库。ostream和istream类就属于这种情况。从技术上说,它们没有被内置到C++语言中,而是语言标准指定的类。这些类定义位于iostream文件中,没有被内置到编译器中。
6、C++提供了两种发送消息的方式
(1)使用类方法
(2)重新定义运算符

2.4 函数

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

2.4.1 使用有返回值的函数

1、有返回值的函数将生产一个值,而这个值可赋给变量或在其他表达式中使用。
在这里插入图片描述
在这里插入图片描述
2、在使用函数之前,C++编译器必须知道函数的参数类型和返回值类型。C++提供这种这种信息的方式是使用函数原型语句
3、C++程序应当为程序中使用的每个函数提供原型。
4、函数原型之于函数就像变量声明之于变量——指出涉及的类型(返回值类型、参数的个数和类型)。
5、原型结尾的分号表明它是一条语句,这使得它是一个原型,而不是函数头。
6、函数原型只描述函数接口,描述的是发送给函数的信息和返回的信息;函数定义包含了函数的代码。
7、C++库函数存储在库文件中。库文件中包含了函数的编译代码,而头文件中则包含了原型。
8、应在首次使用函数之前提供其原型。通常的做法是把原型放到main()函数定义的前面。

// 程序清单2.4 sqrt.cpp -- using the sqrt() function

#include <iostream>
#include <cmath>      

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;

    return 0;
}

9、double类型存储带小数的值。将看起来是整数的值赋给double变量时,将以实数形式存储它,其中的小数部分为.0。

2.4.2 函数变体

1、有些函数需要多项信息,这些函数使用多个参数,参数间用逗号分开。
2、有些函数不接受任何参数。关键字void明确指出,该函数不接受任何参数。如果省略void,让括号为空,则C++将其解释为一个不接受任何参数的隐式声明。在C++中,函数调用必须包括括号,即使没有参数。
3、有些函数没有返回值。

2.4.3 用户定义的函数

// 程序清单2.5 ourfunc.cpp -- defining your own function
#include <iostream>

void simon(int);

int main()
{
    using namespace std;
    simon(3);
    cout << "Pick an integer: ";
    int count;
    cin >> count;
    simon(count);
    cout << "Done!" << endl;

    return 0;
}

void simon(int n)
{
    using namespace std;
    cout << "Simon says youch your toes " << n << " times." << endl;
}

1、C++不允许将函数定义嵌套在另一个函数定义中。
2、对于有返回值的函数,应使用关键字return来提供返回值,并结束函数。
3、main()的返回值返回给操作系统。通常的约定是,退出值为0则意味着程序运行成功,为非零则意味着存在问题。
4、关键字是计算机语言中的词汇,关键字都是C++专用的,因此不能用作他用。main不是关键字。不能在同一个函数中同时将cout用作对象名和变量名。

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

// 程序清单2.6 convert.cpp -- converts stone to pounds
#include <iostream>
int stonetolib(int);
int main()
{
    using namespace std;
    int stone;
    cout << "Enter the weight in stone: ";
    cin >> stone;
    int pounds = stonetolib(stone);
    cout << stone << " stone = ";
    cout << pounds << " pounds." << endl;

    return 0;
}

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

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

让程序能够访问名称空间std的方法:
(1)将using namespace std;放在函数定义之前,这让文件中所有的函数都能够使用名称空间std中所有的元素。
(2)将using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素。
(3)在特定的函数中使用类似using std::cout;这样的编译指令,让该函数能够使用制定的元素,如cout。
(4)完全不适用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::。

2.5 总结

C++程序由一个或多个被称为函数的模块组成。程序从main()函数开始执行,因此该函数必不可少。函数由函数头和函数体组成。函数头指出函数的返回值的类型和函数期望通过参数传递给他的信息的类型。函数体由一系列位于花括号({})中的C++语句组成。
有多种类型的C++语句,包括以下6种:
(1)声明语句:定义函数中使用的变量的名称和类型。
(2)赋值语句:使用赋值运算符(=)给变量赋值。
(3)消息语句:将消息发送给对象,激发某种行动。
(4)函数调用:执行函数。被调用的函数执行完毕后,程序返回到函数调用语句后面的语句。
(5)函数原型:声明函数的返回类型、函数接收的参数数量和类型。
(6)返回语句:将一个值从被调用函数那里返回到调用函数中。
类是用户定义的数据类型规范,它详细描述了如何表示信息以及可对数据执行的操作。对象是根据类规范创建的实体,就像简单变量是根据数据类型描述创建的实体一样。
C++提供了两个用于处理输入和输出的预定义对象(cin和cout),它们是istream和ostream类的实例,这两个类是在iostream文件中定义的。为ostream类定义的插入运算符(<<)使得将数据插入到输出流中成为可能。为istream类定义的抽取运算符(>>)能够从输入流中抽取信息。cin和cout都是智能对象,能够根据程序上下文自动将信息从一种形式转换成另一种形式。
C++可以使用大量的C库函数。要使用库函数,应当包含提供该函数原型的头文件。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值