学习笔记:C++入门

C++
集成开发环境C++

1. IDE

1.1 Visual Studio

img

1.2 CLion

我最后还是选择了 CLion 因为之前一直用的JetBrains公司开发的IDE工具,换成Visual Studio突然还不习惯,虽然Visual Studio是我接触的第一款IDE,但是用它来编写C++代码提示居然默认不选中,编写C#的时候都可以,网上搜索发现Visual Studio编写C++代码就是这么设计的!(黑人问号?)

当然IDE这种东西还是自己顺手就好,如果你喜欢,你完全可以用记事本来写程序。

1.2.1 CLion 运行环境

因为我安装了Visual Studio所以可以直接导入Visual Studio的运行环境。

1.2.2 中文乱码

img

图中的设置部分换成UTF-8,然后右下角控制台格式切换为GBK

img

2. 入门

2.1 Hello, World!

 #include <iostream>
 
 using namespace std;
 
 int main() {
     cout << "Hello, World!" << endl;
     return 0;
 }

2.2 控制台打印

需要引入using namespace std;,然后通过cout << XXX << endl;打印,不得不说学过高级语言后觉得这实在很难用。

虽然可以用C语言的printf()但是你如果要打印一个变量需要给出类型,比如:

 #include <iostream>
 
 int main() {
     int a = 10;
     printf("%d", a);// 必须指定类型,不然会报错
     return 0;
 }

2.3 清除控制台

system("cls");

2.4 保留关键字

C++中预先保留的单词,在定义变量或者常量时候,不要用关键字

img

3. 数据类型

3.1 整形

img

3.2 浮点型

用于表示小数

浮点型变量分为两种:

  1. 单精度float
  2. 双精度double

两者的区别在于表示的有效数字范围不同。

img

一般情况下float就足够了,如果不够用再定义double

3.3 字符

语法:char ch = 'a';

  • C和C++中字符型变量只占用1个字节
  • 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元。

3.4 字符串

C风格字符串char 变量名[] = "字符串值"

C++风格字符串string 变量名 = "字符串值" 需要加入头文件#include<string>

3.5 布尔类型 bool

  • true --- 真(本质是1)
  • false --- 假(本质是0)
  • bool类型占1个字节大小

3.6 转义字符

img

4. 运算符

4.1 算术运算符

img

4.2 赋值运算符

img

4.3 比较运算符

img

4.4 逻辑运算符

img

5. 流程控制

5.1 if语句(常用)

if(条件){ 条件满足执行的语句 }

img

 int main() {
 
     //选择结构-单行if语句
     //输入一个分数,如果分数大于600分,视为考上一本大学,并在屏幕上打印
 
     int score = 0;
     cout << "请输入一个分数:" << endl;
     cin >> score;
 
     cout << "您输入的分数为: " << score << endl;
 
     //if语句
     //注意事项,在if判断语句后面,不要加分号
     if (score > 600) {
         cout << "我考上了一本大学!!!" << endl;
     }
 
     system("pause");
 
     return 0;
 }

多行格式if语句if(条件){ 条件满足执行的语句 }else{ 条件不满足执行的语句 };

img

 int main() {
 
     int score = 0;
 
     cout << "请输入考试分数:" << endl;
 
     cin >> score;
 
     if (score > 600) {
         cout << "我考上了一本大学" << endl;
     } else {
         cout << "我未考上一本大学" << endl;
     }
 
     system("pause");
 
     return 0;
 }

多条件的if语句if(条件1){ 条件1满足执行的语句 }else if(条件2){条件2满足执行的语句}... else{ 都不满足执行的语句}

img

 int main() {
 
     int score = 0;
 
     cout << "请输入考试分数:" << endl;
 
     cin >> score;
 
     if (score > 600) {
         cout << "我考上了一本大学" << endl;
     } else if (score > 500) {
         cout << "我考上了二本大学" << endl;
     } else if (score > 400) {
         cout << "我考上了三本大学" << endl;
     } else {
         cout << "我未考上本科" << endl;
     }
 
     system("pause");
 
     return 0;
 }

嵌套if语句:在if语句中,可以嵌套使用if语句,达到更精确的条件判断

 int main() {
 
     int score = 0;
 
     cout << "请输入考试分数:" << endl;
 
     cin >> score;
 
     if (score > 600) {
         cout << "我考上了一本大学" << endl;
         if (score > 700) {
             cout << "我考上了北大" << endl;
         } else if (score > 650) {
             cout << "我考上了清华" << endl;
         } else {
             cout << "我考上了人大" << endl;
         }
 
     } else if (score > 500) {
         cout << "我考上了二本大学" << endl;
     } else if (score > 400) {
         cout << "我考上了三本大学" << endl;
     } else {
         cout << "我未考上本科" << endl;
     }
 
     system("pause");
 
     return 0;
 }

5.2 三目运算符

语法:表达式1 ? 表达式2 :表达式3

解释:

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果。

 int main() {
 
     int a = 10;
     int b = 20;
     int c = 0;
 
     c = a > b ? a : b;
     cout << "c = " << c << endl;
 
     //C++中三目运算符返回的是变量,可以继续赋值
 
     (a > b ? a : b) = 100;
 
     cout << "a = " << a << endl;
     cout << "b = " << b << endl;
     cout << "c = " << c << endl;
 
     system("pause");
 
     return 0;
 }

5.3 switch语句

 switch(表达式){
         
     case 结果1:执行语句;break;
 
     case 结果2:执行语句;break;
 
     ...
 
     default:执行语句;break;
 
 }

5.4 循环结构

5.4.1 while循环语句(常用)

语法:while(循环条件){ 循环语句 }

img

 int main() {
 
     int num = 0;
     while (num < 10) {
         cout << "num = " << num << endl;
         num++;
     }
 
     system("pause");
 
     return 0;
 }

5.4.2 do…while循环语句

语法: do{ 循环语句 } while(循环条件);

注意:与while的区别在于do…while会先执行一次循环语句,再判断循环条件

 int main() {
 
     int num = 0;
 
     do {
         cout << num << endl;
         num++;
 
     } while (num < 10);
 
 
     system("pause");
 
     return 0;
 }

5.4.3 for循环语句(常用)

作用: 满足循环条件,执行循环语句

语法:for(起始表达式;条件表达式;末尾循环体) { 循环语句; }

 int main() {
 
     for (int i = 0; i < 10; i++) {
         cout << i << endl;
     }
 
     system("pause");
 
     return 0;
 }

5.5 跳转语句

5.5.1 break语句

break使用的时机:

  • 出现在switch条件语句中,作用是终止case并跳出switch
  • 出现在循环语句中,作用是跳出当前的循环语句
  • 出现在嵌套循环中,跳出最近的内层循环语句

5.5.2 continue语句

作用:循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

5.5.3 goto语句(慎用)

注意:在程序中不建议使用goto语句,以免造成程序流程混乱

6. 数组

所谓数组,就是一个集合,里面存放了相同类型的数据元素

6.1 一维数组

  1. 数据类型 数组名[ 数组长度 ];
  2. 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
  3. 数据类型 数组名[ ] = { 值1,值2 ...};
 int main() {
 
     //定义方式1
     //数据类型 数组名[元素个数];
     int score[10];
 
     //利用下标赋值
     score[0] = 100;
     score[1] = 99;
     score[2] = 85;
 
     //利用下标输出
     cout << score[0] << endl;
     cout << score[1] << endl;
     cout << score[2] << endl;
 
 
     //第二种定义方式
     //数据类型 数组名[元素个数] =  {值1,值2 ,值3 ...};
     //如果{}内不足10个数据,剩余数据用0补全
     int score2[10] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};
 
     //逐个输出
     //cout << score2[0] << endl;
     //cout << score2[1] << endl;
 
     //一个一个输出太麻烦,因此可以利用循环进行输出
     for (int i = 0; i < 10; i++) {
         cout << score2[i] << endl;
     }
 
     //定义方式3
     //数据类型 数组名[] =  {值1,值2 ,值3 ...};
     int score3[] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};
 
     for (int i = 0; i < 10; i++) {
         cout << score3[i] << endl;
     }
 
     system("pause");
 
     return 0;
 }

6.2 二维数组

二维数组定义的四种方式:

  1. 数据类型 数组名[ 行数 ][ 列数 ];
  2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
  3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性

 int main() {
 
     //方式1  
     //数组类型 数组名 [行数][列数]
     int arr[2][3];
     arr[0][0] = 1;
     arr[0][1] = 2;
     arr[0][2] = 3;
     arr[1][0] = 4;
     arr[1][1] = 5;
     arr[1][2] = 6;
 
     for (int i = 0; i < 2; i++) {
         for (int j = 0; j < 3; j++) {
             cout << arr[i][j] << " ";
         }
         cout << endl;
     }
 
     //方式2 
     //数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };
     int arr2[2][3] =
             {
                     {1, 2, 3},
                     {4, 5, 6}
             };
 
     //方式3
     //数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4  };
     int arr3[2][3] = {1, 2, 3, 4, 5, 6};
 
     //方式4 
     //数据类型 数组名[][列数] = { 数据1,数据2 ,数据3,数据4  };
     int arr4[][3] = {1, 2, 3, 4, 5, 6};
 
     system("pause");
 
     return 0;
 }

7. 函数(重要)

**作用:**将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

7.1 定义

 返回值类型 函数名 (参数列表){
 
        函数体语句
 
        return表达式
 
 }
  • 返回值类型 :一个函数可以返回一个值。在函数定义中
  • 函数名:给函数起个名称
  • 参数列表:使用该函数时,传入的数据
  • 函数体语句:花括号内的代码,函数内需要执行的语句
  • return表达式: 和返回值类型挂钩,函数执行完后,返回相应的数据

7.2 值传递

  • 所谓值传递,就是函数调用时实参将数值传入给形参
  • 值传递时,如果形参发生,并不会影响实参

7.3 函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

  • 函数的声明可以多次,但是函数的定义只能有一次

7.4 分文件编写

**作用:**让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义
 //swap.h文件
 #include<iostream>
 using namespace std;
 
 //实现两个数字交换的函数声明
 void swap(int a, int b);
 //swap.cpp文件
 #include "swap.h"
 
 void swap(int a, int b)
 {
     int temp = a;
     a = b;
     b = temp;
 
     cout << "a = " << a << endl;
     cout << "b = " << b << endl;
 }
 //main函数文件
 #include "swap.h"
 int main() {
 
     int a = 100;
     int b = 200;
     swap(a, b);
 
     system("pause");
 
     return 0;
 }

8. 指针(重要)

几乎所有的编程语言都存在着指针,但是C++中的指针真是我学过的语言中最复杂的。其它语言最多只了解一下值类型和引用类型需要理解指针,但是C++却需要操作指针。

8.1 概念

指针的作用: 可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

指针变量定义语法: 数据类型 * 变量名;

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过” * “操作符,操作指针变量指向的内存空间,这个过程称为解引用

8.2 指针所占内存

所有指针类型在32位操作系统下是4个字节

8.3 空指针和野指针

空指针:指针变量指向内存中编号为0的空间

**用途:**初始化指针变量

**注意:**空指针指向的内存是不可以访问的

 int main() {
 
     //指针变量p指向内存地址编号为0的空间
     int * p = NULL;
 
     //访问空指针报错 
     //内存编号0 ~255为系统占用内存,不允许用户访问
     cout << *p << endl;
 
     system("pause");
 
     return 0;
 }

野指针:指针变量指向非法的内存空间

 int main() {
 
     //指针变量p指向内存地址编号为0x1100的空间
     int * p = (int *)0x1100;
 
     //访问野指针报错 
     cout << *p << endl;
 
     system("pause");
 
     return 0;
 }

空指针和野指针都不是我们申请的空间,因此不要访问。

8.4 const修饰指针

const修饰指针有三种情况

  1. const修饰指针 --- 常量指针
  2. const修饰常量 --- 指针常量
  3. const即修饰指针,又修饰常量

9. 结构体

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

语法:struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值 , 成员2值…}
  • 定义结构体时顺便创建变量

9.1 指针

**作用:**通过指针访问结构体中的成员

  • 利用操作符 ->可以通过结构体指针访问结构体属性

10. 参考资料

视频:https://www.bilibili.com/video/BV1et411b73Z

笔记:https://github.com/AnkerLeng/Cpp-0-1-Resource

转载协议

本文采用 CC BY-NC-SA 4.0 协议进行许可,转载请注明出处。

允许转载、修改和分享,但必须注明作者和出处,且不得用于商业用途,衍生作品需采用相同协议。