前言
本文介绍C++的基础内容:类型、变量、表达式、语句、函数。
导入
书店保存有销售记录的档案,每条记录保存了某本书的一次销售记录,包含三个数据项:
ISBN编号 册数 单价
0-201-70353-X 4 24.99
0-314-15926-X 1 13.14
使用C++解决这个问题?
一、编写一个C++程序
1.1 编写一个简单的C++程序
int main()
{
//啥也不干
return 0;
}
- 每个C++程序都包含一个或多个函数,其中一个必须命名为 main ;
- 一个函数包含4个部分:
- 返回类型(return type);
- 函数名(function name);
- 参数列表(parameter list);
- 函数体(function body);
对应上面啥也不干的C++程序:int 为返回类型;main为函数名;( )为参数列表,此处为空;{ } 函数体。
另外,以花括号开始和结束的部分也称语句块,该语句块中只有一条语句return 0;
它是函数的结束,并且返回整数 0
这与返回值为int
类型对应。注意语句必须以分号 ;
结束。
1.1.1 编译、运行
上述啥也不干的程序在编辑器中编写完毕后,还需要编译器编译后才能运行,很多PC机上有集成开发环境(Integrated Developed Envirnment, IDE),它将各种工具包装在一起。程序文件名约定以 .cc .cpp .cxx .cp .C
等后缀结尾,程序文件通常称为源文件。
使用命令行运行编译器
无论是否使用集成IDE,实质都是调用编译器编译程序,假定我们的程序文件名称为main.cpp
,终端命令行形式为:CC main.cpp
,CC
为编译器,例如g++
。
在win系统中,默认生成main.exe
,.\main.exe
可以运行;在UNIX/Linux中,默认生成a.out
,./a.out
可以运行;当然你什么也看不到,因为啥也没干。
1.2 初识输入、输出
C++语言包含了一个标准库iosteam
,包含istream
和 ostream
分别代表输入输出流。一个流就是一个字符出序列,从IO设备读入或者写入到IO设备,术语“流”(stream)想要表达的是,随着时间的推移,字符是顺序生成和消耗。
标准输入和输出对象:
cin
标准输入,是istream
对象;cout
标准输出,是ostream
对象;cerr
标准错误,是ostream
对象;clog
输出程序运行时的一般信息,ostream
对象;
#include <iostream> // 引入头文件iostream
int main()
{
std::cout << "Enter two number: " << std::endl; // std 是命名空间 ::是域运算符
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2; // >>输入运算符 <<输出运算符
std::cout << "The sum of" << v1 << "and" << v2 << "is" << v1 + v2 << std::endl;
return 0;
}
1.3 注释(comments)
- 单行注释
//
双斜杠右边的内容会被编译器忽略 - 多行注释
/* XXX*/
例:
/*
* @function:
* @return:
*@parameter:
*/
void func(){;}
1.4 控制流
1.4.1 while 语句
反复执行一段代码,直到给定条件为假为止。
#include <iostream>
int main()
{
int sum = 0;
int val = 0;
// while 语句
while(val <= 10){
sum += val;
val ++;
}
std::cout << "The sum of 0 to 10 inclusive is: " << sum << "\n";
return 0;
}
// return 55;
while 语句的形式:while (condition) {statement;}
也称为循环语句交替执行condition
和 statement
,直到condition = false
。
1.4.2 for语句
for语句是另一种常用的循环语句
#include <iostream>
int main()
{
int sum = 0;
for(int i = 0; i <= 10; i ++){
sum += i;
}
std::cout << "The sum of 0 to 10 inclusive is: " << sum << "\n";
return 0;
}
// 55
for
的condition
部分有三块,都是非必填的:
- 初始化语句 int i = 0;
- 循环条件 i <= 10;
- 表达式 i ++
执行流程与while
基本一致
编译器会在形式上检查代码的合规性,通常有以下几类错误:
- 语法错误
- 类型错误
- 声明错误
实际编写程序时,应当边写边调,便于及时发现bug(漏洞)
1.4.3 if 语句
C++也支持循环语句
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if(std::cin >> currVal){
int cnt = 1;
while(std::cin >> val){
if(val == currVal){
++ cnt;
}
else {
std::cout << currVal << " occurs "
<< cnt << " times " << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs "
<< cnt << " times " << std::endl;
}
return 0;
}
C++的缩进与格式,关于这个的争议是永无休止的,我们选中一种风格,保持统一即可。
1.5 类简介
类(Class
) 将事物的属性和方法抽象出来的一种类型;一个类定义了一种类型,以及与其关联的一组操作。
1.5.1 Sale_item 类
我解决导入的书店销售问题,我们引入Sale_item
类,考虑以下几个问题:
1)类名是什么? Sale_item
2)它在哪里定义? .h
文件中
3)它支持哪些操作? 如下
Sale_item item;
item
是Sale_item
实例化的一个具体的对象,除此之外Sale_item
类型还可以:
- 调用一个名为isbn函数从
Sale_item
对象中获取一个书号; - 用输入运算符(>>)和输出运算符(<<)读、写
Sale_item
类型对象; - 用 = 号将一个
Sale_item
对象赋值给宁一个Sale_item
对象; - 用 + 号将两个
Sale_item
对象相加,和为两个isbn号相同的的对象的销售册数和销售额的和; - 使用符合运算符(+=)将一个
Sale_item
对象加到宁一个对象上。
1.5.2 属性和方法
属性即类的成员变量,方法即类的成员函数。
1.6 书店程序
//Sale_item.h
#ifndef SALE_ITEM_H
#define SALE_ITEM_H
#include <iostream>
#include <istream>
#include <ostream>
class Sale_item
{
public:
Sale_item();
Sale_item(const string isbn, unsigned int count, double price);
virtual ~Sale_item();
inline const string isbn(){return m_isbn;}
friend istream &operator >> (istream &in, Sale_item &item);
friend ostream &operator << (ostream &out, Sale_item &item);
Sale_item &operator = (Sale_item &item);
friend Sale_item &operator + (Sale_item &item1, Sale_item &item2);
friend Sale_item &operator += (Sale_item &item1, const Sale_item &item2);
protected:
private:
const string m_isbn;
unsigned int m_count;
unsigned double m_price;
};
#endif // SALE_ITEM_H