第一章 语法基础
C++语言
是高级语言
支持面向对象的观点和方法
将客观事物看作对象
对象间通过消息传送进行沟通
支持分类和抽象
1 C++ 初识
1.1 第一个 C++ 程序
编写一个 C++ 程序总共分为 4 个步骤:
-
创建项目
-
创建文件
-
编写代码
-
运行程序
第一个 C++ 程序:HelloWorld
#include <iostream>
using namespace std;
int main() {
cout << "HelloWorld" << endl;
//system("pause");
return 0;
}
1.2 注释
注释格式://
、/* */
1.3 变量
作用:给一段指定的内存空间起名,方便操作这段内存。
举例:variable.cpp
#include <iostream>
using namespace std;
int main() {
//变量的定义:
//语法:数据类型 变量名 = 初始值
int a = 10;
cout << "a = " << a << endl;
return 0;
}
1.4 常量
作用:用于记录程序中不可更改的数据。
C++ 定义常量两种方式:
-
#define 宏常量:#define 常量名 常量值
- 通常在文件上方定义,表示一个常量
-
const 修饰的变量:const 数据类型 常量名 = 常量值
-
通常在变量定义前加关键字 const,修饰该变量为常量,不可修改
-
const 符号常量
-
举例:constant.cpp
#include <iostream>
using namespace std;
//宏常量
#define N 7
int main() {
//N = 5; 不允许修改
cout << N << endl;
//const修饰的变量
const int month = 4;
//month = 5; 不允许修改
cout << month << endl;
return 0;
}
1.5 关键字
作用:关键字是 C++ 中预先保留的单词(标识符)。
asm | do | if | return | typedef |
---|---|---|---|---|
auto | double | inline | short | typeid |
bool | dynamic_cast | int | signed | typename |
break | else | long | sizeof | union |
case | enum | mutable | static | unsigned |
catch | explict | namespace | static_cast | using |
char | export | new | struct | virtual |
class | extern | operator | switch | void |
const | false | private | template | volatile |
const_cast | float | protected | this | wchar_t |
continue | for | public | throw | while |
default | friend | register | true | |
delete | goto | reinterpret_cast | try |
1.6 标识符命名规则
作用:C++ 规定给标识符(变量、常量)命名时,有一套自己的规则。
-
标识符不能是关键字
-
标识符只能由字母、数字、下划线组成
-
第一个字符必须是字母或者下划线
-
标识符中字母区分大小写
建议:标识符命名时,尽量见名知意!
1.7 初始化
初始化方式:
-
int a = 0
-
int a(0)
-
int a = {0}
-
Int a{0}
2 数据类型
C++ 规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。
2.1 整型
区别:数据类型所占内存大小不一样
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short | 2 字节 | -2^15 - 2^15-1 |
int | 4 字节 | -2^31 - 2^31-1 |
long | win 4 字节,Linux 32 位 4 字节,64 位 8 字节 | -2^31 - 2^31-1 |
long long | 8 字节 | -2^63 - 2^63-1 |
基本的整数类型:int
按符号分:
-
符号的signed
-
无符号的unsigned
按照数据范围分:
-
短整数short
-
长整数long
-
长长整数long long
字节数大小顺序满足:
2.2 sizeof 关键字
作用:利用 sizeof 关键字可以统计数据类型所占内存大小。
举例:sizeof.cpp
#include <iostream>
using namespace std;
int main() {
//利用sizeof求出数据类型占用内存大小
//语法:sizeof(数据类型) 或 sizeof(变量)
short a = 10;
cout << sizeof(short) << endl;
cout << sizeof(a);
return 0;
}
short < int <= long < long long
2.3 浮点型
浮点型,又称为实型
作用:用于表示小数。
浮点型变量分为两种:
-
单精度 float
-
双精度 double
两者的区别在于表示的有效数字范围不同。
默认情况下,输出一个小数,会显示出 6 位有效数字。
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4 字节 | 7 位有效数字 |
double | 8 字节 | 15-16 位有效数字 |
举例:float.cpp
#include <iostream>
using namespace std;
int main() {
float f = 3.14f;
double d = 3.14;
cout << f << endl;
cout << d;
return 0;
}
科学计数法:
-
float f = 3e2; //表示 300
-
float f = 3e-2; //表示 0.03
2.4 字符型
作用:字符型变量用于显示单个字符。
语法:char ch = 'a';
-
C 和 C++ 中字符型变量只占用 1 个字节。
-
字符型变量并非把字符本身放到内存中存储,而是将对应的 ASCII 编码放入到存储单元。
2.5 转义字符
作用:用于表示一些不能显示出来的 ASCII 字符。
现阶段常用的转义字符有:\ n,\ \,\ t
2.6 字符串型
作用:用于表示一串字符
两种风格:
-
C 风格字符串:char 变量名[ ] = "字符串值"
-
C++ 风格字符串:string 变量名 = "字符串值"
#include <iostream>
#include <string> //用于C++风格的字符串
using namespace std;
int main() {
char str[] = "Hello World";
cout << str << endl;
string a = "Hello World";
cout << a;
return 0;
}
2.7 布尔类型
作用:布尔数据类型(bool)代表真或假的值。
bool 类型只有两个值:
-
true 真(本质是 1)
-
false 假(本质是 0)
bool 类型占 1 个字节大小。
#include <iostream>
using namespace std;
int main() {
//创建bool数据类型
bool flag = true;
cout << flag << endl;
//查看内存空间大小
cout << sizeof(bool);
return 0;
}
2.8 数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >> 变量;
示例:
#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
cout << x;
return 0;
}
3 运算符
作用:用于执行代码的运算
3.1 算术运算符
作用:用于处理四则运算
示例:
#include <iostream>
using namespace std;
int main() {
//加减乘除
int a = 10;
int b = 3;
cout << a + b << endl;
cout << a - b << endl;
cout << a * b << endl;
cout << a / b << endl;
cout << a % b << endl;
return 0;
}
3.2 赋值运算符
作用:用于将表达式的值赋给变量
3.3 比较运算符
作用:用于表达式的比较,并返回一个真值或假值
示例:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 3;
//有优先级的运算,所以要加括号
cout << (a == b) << endl;
return 0;
}
3.4 逻辑运算符
作用:用于根据表达式的值返回真值或假值
3.5 操纵符
4 程序流程控制
4.1 选择结构
C / C++ 支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
4.1.1 if 语句
作用:执行满足条件的语句
if 语句的三种方式:
-
单行格式 if 语句
-
多行格式 if 语句
-
多条件的 if 语句
示例:三只小猪称体重
【题目】有三只小猪 ABC,请分别输入三只小猪的体重,并且判断哪只小猪最重?
【代码】
#include <iostream>
using namespace std;
int main() {
//三只小猪称体重,判断哪只最重
int num1 = 0;
int num2 = 0;
int num3 = 0;
//用户输入重量
cout << "请输入小猪A的体重" << endl;
cin >> num1;
cout << "请输入小猪B的体重" << endl;
cin >> num2;
cout << "请输入小猪C的体重" << endl;
cin >> num3;
//判断
if (num1 > num2) {
if (num1 > num3) {
cout << "小猪A最重" << endl;
} else {
cout << "小猪C最重" << endl;
}
} else {
if (num2 > num3) {
cout << "小猪B最重" << endl;
} else {
cout << "小猪C最重" << endl;
}
}
return 0;
}
4.1.2 三目运算符
作用:通过三目运算符实现简单的判断
语法:表达式1?表达式2:表达式3
示例:
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
cout << (a > b ? a : c);
return 0;
}
4.1.3 switch 语句
开关语句:switch
举例:
#include <iostream>
using namespace std;
//输入0-6的整数,转换成星期几
int main(){
int day;
cin >> day;
switch(day){
case 0: cout << "Sunday" << endl; break;
case 1: cout << "Monday" << endl; break;
case 2: cout << "Tuesday" << endl; break;
case 3: cout << "Wednesday" << endl; break;
case 4: cout << "Thursday" << endl; break;
case 5: cout << "Friday" << endl; break;
case 6: cout << "Saturday" << endl; break;
default:
cout << "out" << endl;
}
return 0;
}
4.2 循环结构
4.2.1 for循环
//求整数的因子
int main(){
int n;
cin >> n;
for(int k = 1; k <= n; k++){
if(n % k == 0){
cout << k << " ";
}
}
cout << endl;
}
4.2.2 while循环
//求自然数1-10之和
int main(){
int i = 1, sum = 0;
while(i <= 10){
sum += i;
i++;
}
cout << "sum = " << sum << endl;
return 0;
}
4.2.3 do while循环
int main(){
int i = 1, sum = 0;
do{
sum += i;
i++;
}while(i <= 10);
cout << "sum = " << sum << endl;
return 0;
}
4.3流程控制语句
4.3.1 break语句
使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句,不宜用在别处。
4.3.2 continue语句
结束本次循环,接着判断是否执行下一次循环。
4.3.3 goto语句
使程序的执行流程跳转到语句标号所指定的语句,不提倡使用。
第二章 函数
1 函数定义
函数:是一个命名的程序代码块,是程序完成其操作的一种功能单位。
在程序设计中,有许多算法是通用的,所以会将这类算法定义为一个函数,这样就可以在需要使用的时候直接函数调用就好啦。
1.1 语法形式
类型标志符 函数名(形式参数表){
语句序列
}
>>
是提取运算符
2 函数调用
模块化程序设计
2.1 循环调用
举例1:
//计算x的n次方
double power(double x, int n){
double val = 1.0;
while(n--){
val *= x;
}
return val;
}
int main(){
double pow;
pow = power(5, 2);
cout << pow << endl;
return 0;
}
举例2:
//判断n是否为回文数
bool symm(unsigned n){
unsigned i = n;
unsigned m = 0;
while(i > 0){
m = m * 10 + i % 10;
i /= 10;
}
return m == n;
}
2.2 嵌套调用
int fun2(int m){
return m * m;
}
int fun1(int x, int y){
return fun2(x) + fun2(y);
}
int main(){
int a, b;
cin >> a >> b;
cout << fun1(a, b) << endl;
}
2.3 递归调用
//计算n的阶乘
unsigned fac(unsigned n){
unsigned f;
if(n == 0){
f = 1;
}else{
f = fac(n - 1) * n;
}
return f;
}
int main(){
unsigned m;
cin >> m;
cout << fac(m) << endl;
return 0;
}
3 引用类型
引用&
是标识符的别名。
定义一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。
int i,j;
int &ri = i;//定义int引用ri,并初始化为变量i的引用
j = 10;
ri = j;//相当于i = j
一旦一个引用被初始化后,就不能改为指向其它对象。
引用传递
//输入两个整数交换后输出(引用传递)
void my_swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
int main(){
int x = 5, y = 10;
my_swap(x, y);
cout << x << " " << y << endl;
return 0;
}
4 含有可变参数
C++标准中提供了两种主要的方法
-
如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型
-
如果实参的类型不同,我们可以编写可变参数的模板
4.1 initializer_list
initializer_list是一种标准库类型,用于表示某种特定类型的值的数组,该类型定义在同名的头文件里
initializer_list提供的操作:
使用举例:
initializer_list<string> ls;//元素类型为string
initializer_list<int> li;//元素类型为int
注意点:
在编写代码输出程序产生的错误信息时,最好统一用一个函数实现该功能,使得对所有错误的处理能够整齐划一,然而错误信息的种类不同,调用错误信息输出函数时传递的参数也会各不相同。
5 内联函数
内联函数声明时使用关键字inline
要求:
-
内联函数体内不能有循环语句和switch语句
-
内联函数的定义必须出现在内联函数第一次被调用之前
-
对内联函数不能进行异常接口声明
使用举例:
//计算圆的面积
const double PI = 3.14;
inline double calArea(double radius){
return PI * radius * radius;
}
int main(){
double r = 3.0;
double area = calArea(r);
cout << area << endl;
return 0;
}
6 带默认参数值函数
可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值。
int add(int x = 5, int y = 6){
return x + y;
}
int main(){
add(10, 20);//10+20
add(10);//10+6
add();//5+6
}
🚨 有默认参数的形参必须列在形参列表的最右,即默认参数值的右面不能有无默认值的参数。
7 函数重载
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。
举例:
int add(int a, int b){
return a + b;
}
double add(double a, double b){
return a + b;
}
8 系统函数
C++的系统库中提供了几百个函数可供程序员使用,例如:
-
求平方根函数sqrt
-
求绝对值函数abs
使用系统函数时要包含相应的头文件,例如:
- cmath
#include <cmath>