前言
C++区分大写字符和小写字符。即COUT和cout是不一样的。
#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;
}
如上代码输出结果:
Come up and C++ me some time.
You won't regret it!
C++注释由//标识,#include为预处理器编译指令,int main()为函数头,using namespace为编译指令。函数体用{}括起来,cout为显示工具,return结束main函数。
语句和分号
语句是要执行的操作,为理解源代码,编译器需要知道一条语句何时结束,另一条语句何时开始。C++使用;作为语句结束的标志,即终止符,它是语句的组成部分。在C++中,不能省略分号。
1.作为接口的函数头
函数头描述了函数与调用它的函数之间的接口。函数名前面的部分叫函数的返回类型,描述函数返回给调用它的函数的信息。函数名后括号中的部分叫形参列表或参数列表,描述调用函数传给被调用函数的信息。main()函数被启动代码调用,启动代码是编译器添加到程序中的,是程序和操作系统之间的桥梁。该函数头描述了main()和操作系统之间的接口。
2.为什么main()不能使用其他名称
程序必须包含main(),程序从main()函数开始执行。没有main(),程序将不完整。
存在一些例外情况。例如,在Windows编程中,可以编写一个动态链接库(DLL)模块,这是其他Windows程序可以使用的代码。由于DLL模块不是独立的程序,不需要main().
C++通常使用//进行注释,而/* */是C语言风格的注释。
接下来讲讲C++预处理器和iostream文件,程序包含#include <iostream>语句,则编译器会把iostream文件内容加到程序中,这是典型的预处理操作,在源代码被编译之前,替换或添加文本。iostream文件的内容将取代#include <iostream>,原始文件并没有被修改,而是将源代码和iostream组合成一个新的文件,编译的下一个阶段将使用该文件。编译代码最后生成我们需要的东西也是一个一个步骤生成的,并且中间会生成很多中间过程的文件。
1.名称空间 P15
一.为什么需要名称空间?
阅读本文前,可能需要一点点C++的基础概念。了解类的定义,对象的概念及使用。如下链接:
我们在编写比较大型的程序的时候,不是一次就把整个代码都写好的,而是需要不同的人之间互相合作,最后整合成一个代码,这时候就需要整合各个模块的代码或者各个厂商现有的代码。但是,两个已经封装好的代码,可能都包含一个相同名字的函数。比如,两个代码都包含一个名字为wanda()的函数,如果整合在一个代码里面,我们在使用wanda()函数的时候,编译器将不知道指的是哪个wanda()。所以需要名称空间把产品封装在一个名称空间的单元中,这样可以用名称空间区别使用的是哪个wanda()函数。
例如:百度公司把它的代码放在名字为Baidu的名称空间中,这样wanda()函数的名字为Baidu::wanda(); 同样的,Google公司的wanda()版本为Google::wanda()。这样,程序可以使用名称空间来区别不同的版本。
Baidu::wanda("go dancing?");
Google::wanda("a fish named Desire");
二.名称空间的使用
这里以cout和endl的使用为例,在使用C++的输入输出工具的时候,我们需要加入下面两行代码:
#include <iostream>
using namespace std;
包含以上两句后,在我们使用cout和endl的时候,实际上编译器会帮我们替换成std::cout,而endl实际上是std::endl.另一种用法是不用using编译指令的方式,直接省略using namespace std这句代码,直接在写代码的时候这样写:std::cout<<"Come up and C++me some time."; std::cout<<std::endl;效果是一样的,但这样写比较麻烦,每次用到都要在前面加上std::。所以using编译指令应运而生。using namespace std的意思是,可以使用std名称空间里面定义的名称,不必使用std::前缀。这样std名称空间里的所有名称都可以使用。但是这是一种偷懒的做法,在大型项目的时候可能出现潜在的问题。
更好的写法是,只使所需要的名称可用,这也是通过使用using声明来实现:
using std::cout;
using std::endl;
using std::cin;
这样在需要使用iostream中的除上面的其他名称的时候,需要分别把它们加入using列表中。
三.使用cout进行C++输出
C++ 使用cout显示消息,cout<<"Come up and C++ me some time.";
双引号括起来的部分是要打印的消息,C++用双引号括起来的一系列字符叫做字符串。因为它是由若干字符组合而成的。<<符号表示该语句将把这个字符串发送给cout,改符号指出了信息流动的路径。cout是预定义的对象。知道如何显示字符串、数字和单个字符等(对象是类的特定实例,而类定义了数据的存储和使用方式,不占用存储空间)。
从cout的例子可以看出使用面向对象编程的优点——我们不需要了解对象的内部情况,就可以使用它。cout对象有一个简单的接口,如果string是一个字符串,则cout<<string;将显示该字符串。
接下来解释一下显示的过程,输出是一个流,cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以把右侧的信息插入到流中。所以,它把一个字符串插入到输出流中的说法比程序显示了一条消息更客观贴切。
初识运算符重载
插入运算符是一个运算符重载的例子,通过重载,同一个运算符将有不同的含义。即同一个符号可以有多种含义,而编译器可以根据上下文来确定其含义。
1.控制符endl
cout<<endl;
endl是一个特殊的C++符号,表示一个重要的概念:重起一行。输出流中插入endl将导致屏幕光标移到下一行开头。如endl等对于cout来说有特殊含义的特殊符号被称为控制符。endl也是在头文件iostream中定义的,也位于名称空间std中。
打印字符串时,cout不会自动移到下一行,每一天cout运行后,光标都是留在输出字符串的后面。下一个cout的输出从前一个输出的末尾开始。
2.换行符\n
C++还可以使用换行符\n进行换行。通常显示用引号括起来的字符串的时候,用换行符。其他情况用控制符endl。
3.C++源代码的格式化
C++中即可以把一条语句放在几行上,也可以把几条语句放在同一行上。因为语句的结束都是通过;标识,但是C++不能把空格、制表符或回车放在元素中间,也不能把回车放在字符串中间。
3.1源代码中的标记和空白
一行代码中不可分割的元素叫作标记(token),通常,必须用空格、制表符或回车将两个标记分开。 空格、制表符和回车统称为空白。有些字符(如括号和逗号)是不需要用空白分开标记的。比如return0;是无效的,而return 0; return(0); return (0); 是有效的。如intmain()是无效的,而int main() int main ()是有效的。
虽然C++编码格式自由度很大,但是遵守合理的风格可以让代码看上去更舒服,便于阅读。比如,尽量每条语句占一行,每个函数的开始花括号和结束花括号各占一行。函数花括号里面的语句都相对于花括号进行缩进。和函数有关的圆括号周围没有空白。
2.C++语句P18
C++程序是一组函数,而每个函数又是一组语句。声明语句创建变量,赋值语句给变量赋值。如下代码:
//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;
}
输出结果:
I have 25 carrots.
Crunch,crunch.Now I have 24 carrots.
一、声明变量和语句
计算机是一种精确的、有条理的机器。要把数据存到计算机里面,我们人必须指定信息的存储位置和需要多少内存空间。C++可以用声明的方式来指出存储类型并提供位置标签。比如上面的程序中int carrots;这条语句提供了两项信息:需要的内存和内存单元的名称。具体说,这条程序指出程序需要足够的存储空间存储一个整数,C++中int表示整数。编译器负责分配和标记内存的细节。C++的int类型可以为正,也可以为负,但是大小范围取决于实现。机器总是很傻的,但又可以代替人类进行重复性的复杂或简单工作,所有的指令都是需要我们通过机器可以懂得方式告诉机器需要干什么。
第二是给存储单元指定名称。这个声明语句指出,后面程序将使用名称carrots来标识存储在这个内存单元里的值。很好理解,如果我们直接用数字很明显代码是读不下去的,就像原始的01010,取个名字代表一下可以方便使用。carrots被称为变量,因为它的值是可以修改的。C++中所有变量都必须声明,如果省略了声明,程序要使用carrots的时候,编译器将指出错误。
为什么变量必须声明?
有些语言在使用名称时候直接创建新的变量,不需要声明,但出现一个问题,如果错误拼写变量,那么就是重新创建一个变量。那么我们操作的变量就不是原来我们想操作的变量,而是拼写错误的变量。但是引入声明规则,拼写错误的变量就会被发现,没有声明就不能用,编译器将报错。
因此,声明可以指出要存储的数据类型和程序对存储在这里的数据使用的名称。程序的声明语句叫定义声明语句。这会使编译器为变量分配内存空间。还可能有引用声明,这些声明命令计算机使用在其他地方定义的变量。通常,声明不一定是定义,但是这个例子声明就是定义。
在C语言中,变量声明通常在函数或过程的开始位置,但C++只要在使用变量前声明就可以。
二、赋值语句
赋值语句把值赋给存储单元。C++和C不一样的点在于C++可以连续赋值,即a = b = c = 100;是合法的。
在计算机中,整数25和字符串"25"是不一样的,字符串"25"存储的是字符"2"和"5"的编码,而整数25存储的是25的二进制数。但在打印的时候整数25是会被转换为字符串形式打印出来的。C语言里面需要用printf打印,使用printf的时候需要设置输出的格式t,如d%或s%,非常麻烦,且如果我们要打印一个字符串,设置格式为s%,但是给了一个整数,就会显示一堆乱码。
cout则不需要这么麻烦,这是源于C++的面向对象特性,即函数重载。后面会深入学习。
cout是灵活的,可扩展的,可以重新定义<<运算符,使cout能够识别和显示所开发的新数据类型。
三、类简介
类和对象间的关系,就像类型和变量之间的关系。类定义数据格式和用法,而对象是根据数据格式规范创建的实体。cout是一个ostream类对象。
类描述指定了可对类对象执行的所有操作,要给指定的对象执行这些操作需要给这个对象发送一个消息。C++提供了两种发送消息的方式:一种是使用类方法,一种是重新定义运算符,cin和cout就是这种方式。如语句cout<<"I am not a crook.";使用重新定义的运算符<<将显示消息发送给cout。要显示的字符串就是消息的参数,cout对象显示参数。
四、函数
C++函数分有返回值的和无返回值的。
1.有返回值的函数
有返回值的函数将生成一个值,这个值可以赋给变量或者在其他表达式中使用。参数是发送给函数的信息,返回值是从函数中发送回去的值。
在使用函数前,C++编译器必须知道函数的参数类型和返回值类型。提供这种信息的方式是使用函数原型语句。如sqrt的函数原型是double sqrt(double); 第一个double意思是返回一个double类型的数,第二个double是需要一个double参数。原型结尾的分号表明它是原型,而不是函数头。
不要混淆函数原型和函数定义。原型只描述函数接口,定义包含函数的代码。一般库文件中包含函数的编译代码,而头文件中包含原型。
C++允许在创建变量时对它进行赋值,因此可以用double side = sqrt(area);。这个过程叫初始化。cin知道如何把输入流中的信息转换为double类型,cout知道如何把double类型插入到输出流中。
2.函数变体
函数也可以使用多个参数,参数间用逗号分开。也有不包含任何参数的函数,如double pow(double,double);包含两个参数,再如int rand(void);不接受任何参数。还有有返回值的函数,以及没有返回值的函数,如void bucks(double);没有返回值,int rand(double);有返回值。
3.用户自定义的函数
标准C库常常并不能满足用户的需求,这时候就需要编写自己的函数。如main()函数,用户需要对它进行定义。自定义的函数原型(也就是函数声明)需要放在main函数之前,假如main函数需要调用。
函数格式可以统一为如下格式:
return_type functionname(argumentlist)
{
statements
}
如果是int main()的函数开头,返回的数返回给谁呢?把操作系统看作调用的话,那么返回值是返回给操作系统。很多操作系统都可以使用程序的返回值,如UNIX外壳脚本,Windows命令行批处理文件都被设计成运行程序,并测试它们的返回值。
关键字
关键字是C++专用的,如int、void、return、double。所以return不能用作变量名,也不能把double用作函数名。
4.using编译指令总结
访问名称空间std可总结为以下4种:
4.1 将using namespace std;放在函数定义前,让文件所有函数都可以使用std中的所有元
4.2 将using namespace std;放在特定的函数定义中,让这个函数能使用std里的所有元素
4.3 在特定函数中使用类似using std::cout;这样的编译指令,让该函数可以使用std里指定的元素,如cout
4.4 不使用using,而是在使用std中元素时,使用前缀std::
总结
有多种类型的C++语句,包括下述6种:
1.声明语句
2.赋值语句
3.消息语句,将消息发送给对象,激发某种行为
4.函数调用
5.函数原型
6.返回语句
C++可以使用大量的C库函数,要使用库函数,应该包含提供该函数原型的头文件。
第二章终于结束啦啦啦啦!!!通过cout及cin可以看出C++一定是一门功能很强大的语言,有很多智能化的设计,这些设计都源于实际编程中发现的不易用的缺陷。期待后续的学习!!
文章主要偏向理论学习,但我深知理论学习远远是不够的,需要通过实践不断巩固,慢慢的后续也会出一些实践性的记录文章,自己去调试编写代码,并把链接附在相应的理论学习文章中,加深印象。也方便自己后续的复习。