C站的小伙伴们,大家好呀!我最近开始阅读学习《C++ Primer Plus》这本书,在这里和大家一起分享。
下面是本书的第二章《开始学习C++》
例:
int main ()
{
statements
return 0;
}
这几行代码构成了函数定义
(function definition),该定义由两部分组成:
第一行int main()叫做函数头
(function hesding),花括号中包括的部分叫做函数体
。
函数头对函数和程序的其他部分之间的接口做了总结,函数体是指出函数应该做什么的计算机指令。每条完整的指令都成为语句,所有的语句都以分号结束。main()函数中的最后一条语句叫做返回语句
(return statement),它用来结束该函数。
函数名前面的部分叫做函数返回类型,它描述的是从函数函数给调用它的函数的信息。函数名后括号中的部分叫做形参列表或参数列表,它描述的是从调用函数传递给被调函数的信息。
来看主函数的接口描述,该接口从int开始,可知,main()返回一个整数值。接下来是空括号,表示main()函数不接受任何信息,或者说,main()函数不接受任何参数。
一般也可以写作:
int main (void)
这里使用了关键字void
,明确地指出了函数不接受任何参数。
对于返回语句,C++在main()函数中,可以省略,当编译器到达main()函数末尾时,没有遇到返回语句,则认为main()函数以如下语句结尾:
return 0;
但是这仅仅适用于main()函数,而不适用于其他函数。
C++注释以//
打头,必要的注释解释代码可以增加程序的可读性。
如果程序要使用C++输入(cin
)和输出(cout
)工具,需提供一下这样的两行代码:
#include
using namespace std;//可使用其他程序替换简化程序
预处理器:
C++和C一样,也使用一个预处理器,在该程序进行主编译之前对源文件进行处理。预处理不必执行特殊的操作来调用该预处理器,它会在编译程序时自动运行。
#include 编译指令:
#include
该编译指令导致预处理器将iostream文件
的内容添加到程序中。这是一种典型的预处理器,在源代码被编译之前,替换或添加文本。
#include 编译指令
导致iostream文件中的内容随源代码文件的内容一起被发送给编译器。
实际上,iostream文件的内容将取代程序中的代码行#include
,原始文件没有被修改,而是将源代码文件和iostream组合成一个符合文件,编译的下一个阶段将使用该文件。
像iostream这样的文件叫做包含文件(include file)——由于它们被包含在其他文件中;也叫做头文件(header file)——由于它们被包含在文件起始处。
命名空间是C++的新特性,它能解决命名冲突
问题。
例如,小明定义了一个函数swap(),C++标准库中也存在一个swap()函数,此时,为了区分调用的是哪个swap()函数,可以通过命名空间来标识。
C++中的命名空间包括两种,一种是标准命名空间
,一种是自定义命名空间
。
std
是C++标准命名空间,由于C++标准库几乎都定义在std命名空间中,因此编写的所有C++程序都需要引入下列语句:
using namespace std;
使用namespace
可以自定义命名空间,示例代码如下所示:
namespace lib
{
void fun(){}
}
上述代码中,使用namespace定义了一个名称为lib的命名空间,该命名空间内部定义了一个func()函数。
如果要使用命名空间中定义的元素,有下列三种方式:
1.使用“命名空间::元素”方式指定命名空间中定义的元素。
例如,如果要在屏幕上输出数据,并且在末尾加上换行,就要使用标准命名空间std中的cout和endl,在使用cout和endl时,在cout和endl前面加上命名空间和“::”作用域标识符,示例如下:
std::cout<<"C++"<<std::endl;
2.使用using语句引用命名空间元素。
示例如下:
using std cout;
std::cout<<"C++";
需要注意的是,这种方式只能使用using引入的元素,例如,无法单独使用endl这个元素,但可以通过std::endl的形式使用endl。
3.使用using语句直接引用命名空间
示例如下:
using namespace std;
这样引入std空间后,std中定义的所有元素就都可以被使用了。但是,针对上面我们提出的那个问题,当标准库中有swap()函数,也有自定义的swap函数呢,针对这个问题,我们可以使用“命名空间::元素
”方式指定具体要引用的元素。
cout<<"Come up and C++ me some time.";
<<
符号表示该语句将把这个字符串发送给cout;该符号指出了信息流动的路径。
cout是什么呢?它是一个预定义的对象
,知道如何显示字符串、数字和单个字符等。
从概念上来讲,输出是一个流
,即从程序流出的一系列字符,cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。
对于:
cout<<"Come up and C++ me some time.";
与其说程序显示了一条消息,不如说它是将一个字符串流入到了输出流中。
cout <<endl;
endl
是一个特殊的C++符号,表示一个重要的概念:重启一行。在输出流中插入endl将导致屏幕光标移到下一行开头。
诸如endl等对于count来说有特殊含义的特殊符号被称为控制符
。和cout一样,endl也是在头文件iostream
中定义的,且位于名称空间std
中。
cout <<"What's next?\n";
\n
被视为一个字符,名为换行符。
在显示字符串时,在字符串中包含换行符,而不是在末尾加上endl,可以减少输入量。
例如:
cout <<"Pluto is a dwarf planet.\n";
cout <<"Pluto is a dwarf planet."<<endl;
如果要生成一个空行,则两种方法的输入量相同。
cout<<"\n";
cout<<endl;
在显示字符串时,通常使用换行字符"\n",其他情况下,则使用控制符endl。
两者的区别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上),而使用“\n”不能提供这样的保证,这意味着在有些系统中,有时可能在输入信息之后才会出现显示。
一行代码中不可分割的元素叫做标记
。通常,必须使用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白
,有些字符是不需要空格分开标记。
来看下面的程序:
#include
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;
}
C++中,空行将声明部分与程序的其他部分分开。
要将信息存储在计算机中,必须指出信息的存储位置和所需的内存空间。在C++中,是使用声明语句来指出存储类型并提供位置标签。
例如声明语句:
int carrots;
这条语句提供了两条信息:需要的内存
以及该内存单元的名称
。此后,程序将使用名称carrots来标识存储在该内存单元中的值。
在C++中,所有的变量必须声明。声明通常指出了要存储的数据类型和程序对存储在这里的数据使用的名称。
程序种的声明语句叫做定义声明语句
,简称定义
。这意味着它将导致编译器为变量分配内存空间。通常·,定义不一定是声明,上述例子中定义是声明。
对于声明变量,C++的做法是尽量在首次使用变量前声明它。
赋值语句从右往左
进行。
例:
int steinway;
int baldwin;
int yamaha;
yamaha=baldwin=steinway=88;
首先,88被赋给steinway,然后,steinway的值(现在是88)被赋值给baldwin,然后,baldwin的值(88)被赋值给yamaha。
再如:
carrots=carrots-1;
赋值表达式,从右往左计算,计算算术表达式carrots-1的值即25-1=24赋值给carrots。赋值表达式将这个新值存储到变量carrots对应的内存单元中。
对于printf(),输出数字或者字符串必须使用格式空字符%d和%s,来指出要打印出来的是字符串还是整数。如果让printf()打印字符串,而错误的提供了整数(%d),printf根本发现不了错误,它将继续处理,显示一堆乱码。
而C++插入运算符<<将根据其后的数据类型相应地调整其行为。
来看下面的程序:
#include
int main()
{
using namespace std;
int carrots;
cout<<"How many carrots do you have ?"<<endl;
cin>>carrots;
cout<<"Here are twwo more."<<endl;
carrots=carrots+2;
cout<<"Now you have "<<carrots<<" carrots."<<endl;
return 0;
}
程序的运行情况:
How many carrots do you have?
12
Here are two more.
Now you have 14 carrots.
上面的输出表明,从键盘输入的值(12)最终被赋给变量carrots。
cin>>carrots;
从上面的语句可知,信息从cin流向carrots。就像C++将输出看作是流出程序的字符流一样,它也将输入看作是流入程序的字符流。iostream文件将cin定义为一个表示这种流的对象。输出时,<<运算符将字符串插入到输出流中;输入时,cin使用>>运算符从输入流中抽取字符。通常,需要在运算符右侧提供一个变量,以接收信息。(符号<<和>>被选择用来指示信息流的方向。)
与cout一样,cin也是一个智能对象。
cout<<"Now you have "<<carrots<<" carrots."<<endl;
等同于:
cout<<"Now you have ";
cout<<carrots;
cout<<" carrots";
cout<<endl;
也可以将一条语句放在四行上:
cout<<"Now you have "
<<carrots
<<" carrots";
<<endl;
当代码很长,限制输出显示的时候,这种做法很方便。
类是用户定义的类型一种数据类型。类描述了一种数据类型的全部属性(包括可使用它执行的操作),对象就是根据这些描述创建的实体。
类的定义格式如下:
class 类名
{
权限控制符:
成员;
};
成员变量
(也称为属性)和成员函数
(也称为方法),成员变量用于描述对象的属性,成员函数用于描述对象的行为。public
、protected
和private
,这三种权限控制符的权限依次递减。class Student
{
public:
void study();
void exam();
private:
int age;
string name;
};
学生类Student中有两个成员变量age和name,它们是类的私有成员。此外,该类中还定义了study()和exam()两个函数。它们是类的公有成员。
通常情况下,类的成员函数在类中声明,在类外实现。
在类外实现成员函数,必须在返回值之后、函数名之前加上所属的类作用域
,即“类名::”
,表示函数属于哪个类。
void Student::study()
{
cout<<"学习C++"<<endl;
}
void Student::exam()
{
cout<<"C++考试成绩100分"<<endl;
}
现在来看cout,它是一个ostream类对象,ostream类定义(iostream文件的另一个成员)描述了ostream对象表示的数据以及可以对它执行的操作,如将数字或字符串插入到输出流中。同样,cin是一个istream类对象,也是在iostream中定义的。
类描述指定了可对类对象执行的所有操作。
要对特定对象执行这些允许的操作,需要给该类对象发送一条消息。例如,希望cout对象显示一个字符串,应向它发送一条消息,告诉它,“对象!显示这些内容!”
C++中提供了两种发送消息的方式,一种方式是使用类方法
(即上面的成员函数),另一种方式是重新定义运算符
,cin和cout采用的就是这种方式。
cout<<"I am not a crook."
这条语句使用重新定义的<<运算符将"显示消息"发送给cout。