C++学习准备知识

166 阅读3分钟

C++学习准备知识

(本博客C++部分均为《C++ primer(第五版)》学习笔记)

编写一个简单C++程序

每个C++程序都包含一个或多个函数(function),其中必须包含一个main函数,操作系统通过调用main函数来运行C++程序,以下是一个非常简单的main函数,它什么也不干。


int main(){

return0

}

一个函数的定义包含四部分


graph LR

C{函数}

C --> D[返回类型 return type]

C --> E[函数名 function name]

C --> F[形参列表 parameter list]

C --> G[函数体 function body]

对应上例的main函数,函数名为mian,形参列表为空,int为返回类型(int类型是一种内置类型build-in type,即语言自身定义的类型)(返回0表示成功,非0含义由系统定义,通常用来指出错误类型),花括号包括的部分为函数体,包括的是一段语句块block of

statements。

编译,运行程序

很多PC机上都具备继承开发环境(Intergrated Developed Environment,IDE),这里不介绍具体IDE工具。

无论使用命令行还是IDE,大多数编译器都要求程序源码存储在一个或多个文件中,成为源文件(soruce file)。文件后缀告诉系统这个文件是一个C++程序,常见有.cc,.cxx,.cpp,.cp和.C。

假定我们的main存于prog1.cc文件中,命令行编译如下:


$ CC prog1.cc

编译器生成一个可执行文件,windows下为prog1.exe,UNIX下为a.out。

运行程序:

windows:


$ prog1 或者 $ .\prog1

UNIX:


$ a.out 或者 $ ./a.out

初识输入输出

C++语言并未定义任何输入输出语句,而包含了一个标准库用来提供IO。iostream库包含两个基本类型istream和ostream。


graph LR

C{标准输入输出对象}

C --> D[cin 标准输入]

C --> E[cout 标准输出]

C --> F[cerr 标准错误]

C --> G[clog 一般性信息]

例子:


#include <iostream>

int main() {

std::cout<<"Enter two number:"<<std::endl;

int v1 = 0, v2 = 0;

std::cin >> v1 >> v2;

std::cout << "the sum of "<<v1 <<" and "<<v2 << " is "<< v1 + v2 <<std::endl;

return 0;

}

使用#include加<>放在所有函数外,源文件开始的位置,指出头文件,引入标准库。

函数体的第一句话执行了一个表达式。

在C++中,一个表达式产生一个计算结果,他由一个或多个对象和(通常是)一个运算符组成

例子中第一句表达式,使用了输出运算符<<,该运算符接受两个对象,一个ostream对象,一个要打印的值。此运算符将给定值写到ostream对象中,运算结果为写入了给定值的ostream对象。

第一句表达式等价于:

std::cout<<"Enter two number:")<<std::endl;

也等价于


std::cout<<"Enter two number:";

std::cout<<std::endl;

第一个运算打印一个字符串常量。

第二个运算打印endl,被称为操纵符的特殊值。效果为结束当前行,并将设备关联的缓冲区中的内容刷到设备中。

缓冲区buffer: 一个存储区域,用于保存数据。IO设施通常将输入输出数据保存在一个缓冲区中。

std::cout中的前缀std::指出cout的命名空间,帮助避免不经意的名字定义的冲突。标准库的所有名字都在命名空间std中。

输入运算符>>与输出运运算符类似。

注释简介


graph LR

C{注释}

C --> D[单行注释 //]

C --> E[注释界定符 /* */]

注释界定符不能嵌套。

控制流

while语句

while语句反复执行一段代码,直到给定条件为假为止。

1到10之和


#include <iostream>

int main() {

int sum = 0, val = 1;

//只要val的值小于等于10,while循环就会持续执行

while(val <= 10){

sum += val;

++val;

}

std::cout<<"sum of 1 to 10 inclusive is "<<sum<<std::endl;

return 0;

}

语句块(block)指花括号包围的0条或多条语句的序列。

for语句

重写1加到10点程序


#include <iostream>

int main() {

int sum = 0;

for (int val = 1; val <= 10; ++val) {

sum += val;//等价于 sum = sum + val

}

std::cout<<"sum of 1 to 10 inclusive is "<<sum<<std::endl;

return 0;

}


graph LR

C{for语句}

C --> E[循环体]

C --> D{循环头}

D --> G[初始化语句]

D --> H[循环条件]

D --> I[表达式]

for循环总体执行流程


graph TD

A[创建变量val]

--> C{val是否小于等于10}

C --> |是| D[执行for循环体]

C --> |否| E[退出循环]

D --> F(val的值加1)

F --> C

读取数量不定的输入数据


#include <iostream>

int main(int argc, const char * argv[]) {

int sum = 0, value = 0;

//读取数据直到遇到文件尾,计算所有读入的值的和

while (std::cin >> value) {

sum += value;

}

std::cout << "sum is : " << sum << std::endl;

return 0;

}

循环条件std::cin>>value表示从标准输入读取一个输入值,并保存在std::cin中,返回std::cin对象,所以此循环条件实际上检查的是std::cin。

当使用一个istream对象作为条件时,其实是检测流的状态。如果流是有效的,那么检测成功。当遇到文件结束符,或一个无效的输入时(如读入的值不是一个整数),istream对象的状态会变为无效,处于无效状态的istream对象会使条件变为假。

文件结束符:

windows系统:ctrl+z再enter或return;

UNIX系统(包括Mac系统):Ctrl+D

if语句

统计在输入中每个值连续出现了多少次:


#include <iostream>

int main(int argc, const char * argv[]) {

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++中我们通过定义一个类class来定义自己的数据结构。

一个类定义了一个类型,以及与其关联的一组操作。