本文使用的编译器是VS2017,教材是C++ primer plus(第六版)。
我将在blog上记录C++学习的过程与问题,以供他人参考与自己查漏补缺。
2.1 第一个C++程序:
#include<iostream>
int main()
{
using namespace std;//make definitions visible
cout << "Hello world!";
cout << endl;
return 0;
}
如果需要窗口一直打开直到按任意键,可以在return语句前加上cin,get();
注意,这虽然是最简单的C++程序,其中包括了
- 注释,由前缀//标识
- 预处理器编译指令#include
- 函数头:int main()
- 编译指令using namespace
- 函数体,和{}括起
- 使用C++语句的cout工具显示消息的语句
- 结束main函数的return语句
下面将分开介绍
2.1.1.main()函数
main()函数的基本结构如下
int main()
{
statements
return 0;
}
语句是要执行的操作。在C++中,不能省略分号。
C++\语法要求main函数的定义从int main()开始。
a.作为接口的函数头
函数头描述了函数与调用它的函数之间的接口。位于函数前面的部分叫做函数返回类型,它描述的是从函数返回它的调用函数的信息。函数名后括号中的部分叫做形参列表或参数列表,它描述的是调用函数传递给被调用函数的信息。
经典的C函数头main()&省略返回语句的void main()都是被淘汰的。
有个使用标准语法 int main()。
如果main()到结尾都没有返回语句,则认为main函数以return 0;结尾。
b.为什么main不使用别的名称
C++程序中必须包含一个名为main()的函数。
存在一些特殊情况,编写一个动态链接库(DLL模块)。由于DLL不是独立程序,因此不需要main()。
2.1.2 C++注释函数
C++注释以双斜杠(//)打头,与C语言一致。
2.1.3 C++预处理器和iostream文件
如果需要使用到C++的输入输出工具,请提供这两行代码:
#include<iostream>
using namespace std;
#include<iostream>该编译指令导致预处理器将iostream文件的内容添加到程序中。这涉及到程序与外部环境的通信。
注意:使用cin与count进行输入与输出的程序必须包括iostream
2.1.4 头文件名
像iostream这样的文件叫做包含文件,也叫头文件。这是纯粹C++风格的头文件,去掉h以后可以包含名称空间。
2.1.5 名称空间
using namespace std;
这个叫做using编译指令。先接受它,以后再考虑。
名称空间可以区分不同代码组成的程序里相同命名的函数。
类,函数,变量便是C++编译器的标准组件,它们都存放再名称空间std里。
2.1.6 使用cout进行C++输出
cout << "Hello world!";
如果对象是字符串,cout的接口十分简单
cout << string;
它将一个字符串插入到了输出流中。
1.控制符endl
endl是一个特殊的C++字符,它代表一个重要的概念:重起一行。在输出流将光标移到下一行开头。
2.换行符
C++还提供一种在输出中代表换行的旧式方法:C语言符号\n
换行符是一种被称为“转义序列”的按键组合
2.1.7 C++源代码的格式化
C++中一条语句的结束是;,这代表一条语句可以分开几行,也可以几条语句放在同一行。
1.源代码中的标记与空白
2.C++源代码的风格
- 每条语句占一行
- 每个函数都有一个开始的花括号和一个结束的花括号,两个花括号各占一行
- 函数中的语句都相对于花括号进行缩进
- 与函数名称相关的圆括号周围没有空白
2.2 C++语句
C++程序是一组函数,函数是一组语句。C++中有好几种语句。下面程序提供了新的语句。声明语句创建变量,赋值语句给变量提供一个值,另外,该程序演示了cout的新功能。
#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.";
return 0;
}
2.2.1 声明语句与变量
要存储信息在计算机中,必须指出信息的存储位置和所需的内存空间。如下列语句:
int carrots;
这条语句提供了两项信息:需要的内存以及该内存单元的名称。。其次,它给存储单元指定了名称。变量的声明可以有效防止编程时的拼写错误。
这里程序中的声明是定义声明,简称为定义。在较为复杂的情况下,会有引用声明。可以命令计算机在其它地方定义的变量。
2.2.2 赋值语句
carrots = 25;
符号=叫做赋值运算符。
C++和C有一项不寻常的特性——可以连续使用赋值运算符。
例如:
int a;
int b;
int c;
a=b=c=88;
赋值从右到左进行。
carrots = carrots - 1;
可以对变量的值进行修改。
2.2.3 cout的新花样
cout << carrots;
此程序没有打印carrots,而是打印储存在carrots的数值。经笔者测试:
cout << "Crunch,crunch.Now I have " << carrots-1 << " carrots.";
直接把运算式放入cout也是可以跑出来的。
cout与printf()的区别:
printf()不够精细,如果打印字符串又错误提供了一个整数,会显示一堆乱码。而cout能识别和显示所开发的新数据类型。如果喜欢printf()的精细控制,可以使用更高级的cout达到同一效果。
2.3 其他C++语句
#include<iostream>
int main()
{
using namespace std;
int carrots;
cout << "How many carrots do you have?" << endl;
cin >> carrots;
cout << "Here are two more. ";
carrots = carrots + 2;
//the next line concaten output
cout << "Now you have" << carrots << "carrots." << endl;
return 0;
}
该程序包含两个特性:用cin来读取键盘输入以及将四条输出语句组合成一条。
2.3.1 使用cin
cin>>carrots;
C++将输入看作是流入程序的字符流。iostream文件将cin定义为一个表示这种流的对象。与cout类似,cin也是一个智能对象。它可以将通过键盘输入的一系列字符转为接受信息的变量能够接受的形式。
2.3.2 使用cout进行拼接
cout << "Now you have" << carrots << "carrots." << endl;
这样可以把字符串输出和整数输出合并为同一个语句。与C++自由格式的规则间标记间的换行符和空格看作是可相互替换的。
2.3.3 类简介
类是C++面向对象编程(opp)的核心概念。
类定义的描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。例如:
int carrots;
此时定义了一个类型为int的变量。
cout,它是一个ostream类对象。其类定义描述ostream表示的数据以及对它执行的操作。
cin是一个istream,也在iostream中定义。
类是用户定义的类型。类描述指定了可对类对象执行的所有操作。要对特定对象执行这些操作,需要给该对象发送一条消息。C++提供了两种方法:
- 方式使用类方法
- 重新定义运算符(如cin与cout)
2.4 函数
2.4.1 使用返回值的函数
有返回值的函数将生成一个值,这个值可以赋给变量或其它表达式中使用。
在使用函数之前,C++编译器必须知道函数类型与返回值类型。C++提供这种信息的方式是使用函数原型语句。
例如,在使用sqrt()时,也必须提供原型。有两种方法
- 在源代码文件中输入函数原型
- 包含头文件cmath(老系统为math.h),其中定义了原型。
第二种办法更好,头文件更有可能使原型正确。
不要混淆函数定义与函数原型。原型只描述函数接口。也就是说,它描述的是发送给函数的信息和返回的信息。而定义包含了函数的代码。
#include<iostream>
#include<cmath>
int main()
{
using namespace std;
double area;
cout << "Enter the floor area,insquare 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;
}
由于sqrt处理的是double值因此只要这里将变量声明为这种类型,声明double变量的句法与声明int的相同。
2.4.2 函数变体
有些函数需要多项信息。这些函数使用多个参数,参数间用,隔开。
例如:
answer=pow(5.0,8.0);
另外一些函数不接受任何函数。
例如
int rand(void);
还有一些函数没有返回值
void bucks(double);
2.4.3 用户定义的函数
当预定义函数不满足要求时。用户可以编写自己的函数:通常原型放在main()函数之前,代码放在main()之后。
#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 touch your toes " << n << "times." << endl;
}
1.函数格式
simon函数的定义与main函数的格式是一样的。首先是有个函数头;然后是花括号中的函数体。统一为:
type functionname(argumentlist)
{
statemnets;
}
2.函数头
void simon(int n);
这表示simon没有返回值,因此调用simon()不会生成再main()中将其赋给变量的数字。括号中int表明,使用simon时,应该赋予一个int参数。
int main();
开头的int表示需要返回一个int值,所以有了结尾的
return 0;
2.4.4 用户定义的有返回值的函数
#include<iostream>
int stonetolb(int);
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;
return 0;
}
int stonetolb(int sts)
{
return 14*sts;
}
在main中,程序用cin给整型变量stone提供一个值。这个值被赋予sts,在经过运算后返回了函数。
函数stonetolb()虽然短小,简单,但包含了函数的全部特性。
- 有函数体与函数头
- 接受一个参数
- 返回一个值
- 需要一个原型
可以把stonetolb函数看成标准函数设计格式。
2.4.5 在多函数程序中使用using编译指令
#include<iostream>
using namespace std;
void simon(int n);
int main()
{
simon(3);
cout <<"Pick an integer: ";
int count;
cin >> count;
simon(count);
cout << "Done! " << endl;
return 0;
}
void simon(int n)
{
cout << "Simon says touch your toes " << n << " times." << endl;
}
当using放在函数外时,两个函数都可以访问名称空间std。只让需要访问名称空间std的函数访问它是最好的选择。
总结
一共有一下C++语句:
- 声明语句
- 赋值语句
- 消息语句
- 函数调用
- 函数原型
- 返回语句