C++ 基础

第一章 语法基础

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>
相关推荐
凡人的AI工具箱10 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
做人不要太理性13 分钟前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.21 分钟前
2、桥接模式
c++·桥接模式
chnming198725 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙27 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂27 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc35 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
程序伍六七39 分钟前
day16
开发语言·c++
wkj00143 分钟前
php操作redis
开发语言·redis·php
极客代码1 小时前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow