C++入门到进阶(图文详解,持续更新中)

时间:2024-07-13 07:12:42

C++入门到进阶(图文详解,持续更新中)

详解C++入门知识到进阶,配合图观看易于理解记录

文章目录

  • 目录

    C++入门到进阶(图文详解,持续更新中)

    文章目录

    前言

    一、数据

    (一)数据类型

    1.基本数据类型/内置数据类型

    2.自定数据类型/复合数据类型

    (1)数组

    (2)结构体

    (3)指针

    (二)C++常用运算符

    赋值运算符

    关系运算符

    逻辑运算符

    杂项运算符

    (三)数据的本地化存储

    1.准备工作:

    2.写流即向本地文件中写入数据该如何实现?

    (1)创建写流的对象或创建写流的变量

    (2)打开文件执行,准备执行写数据(称为开流)

    (3)对本地写数据

    (4)关闭流

    3.读流(即从本地文件中读取数据)

    (1)创建读流对象

    (2)打开文件准备读取数据(称为开流)

    (3)开始从本地读取数据

    (4)关闭流

    (5)存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)

    二、函数

    (一)函数的声明和定义

    1.函数声明的作用

    2.函数的定义

    (二)函数传值

    1.传出数据(即返回值)

    2.传入数据(即传参)

    (1)什么是传参?

    (2)作用

    (3)类型

    3.关于形参在函数声明和函数定义中注意点

    4.默参

    5.函数重载

    6.传参方式

    三、内联函数

    (一)其它名称

    (二)怎么写一个内联函数

    (三)内联函数有什么用

    (四)内联函数的注意事项

    (五)内联的优缺点

    四、宏

    (一)作用

    (二)语法

    (三)分类

    1.简单宏

    2.带参数宏

    (四)卸载宏

    面向对象



前言

C++ 是一门高级语言,是一种编译型的语言,需要先把源代码先编译成机器语言的可执行程序,然后再执行可执行程序。这里就对C++知识进行探究


一、数据

(一)数据类型

1.基本数据类型/内置数据类型

整型:有符号与无符号

int

unsignedf int

long

unsigned long int

short int

ushort

byte

sbyte

long int

unsigned long int

浮点型/实型:

float

double

long double

字符型:

char

布尔型:

bool

2.自定数据类型/复合数据类型

(1)数组

存放一组同质类型的元素(同种类型)

(2)结构体
(3)指针

指向一个内存空间的地址

指针

数组指针

指针数组

函数指针

(二)C++常用运算符

赋值运算符

基本赋值运算符:=

复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)

关系运算符

== != < > <= >=

逻辑运算符

&& || !

杂项运算符

sizeof和三目运算符

(三)数据的本地化存储

1.准备工作:

实现本地化存储需要

头文件为:iostream,ofstream

引入头文件

#include<iostream>

#include<ofstream>

命名空间为:std

引入命名空间:

using namespace std;

2.写流即向本地文件中写入数据该如何实现?

使用ofstream的方法,操作步骤为:

(1)创建写流的对象或创建写流的变量

ofstream ofs;

(2)打开文件执行,准备执行写数据(称为开流)

ofs.open("abc.txt", ios::out);

(3)对本地写数据

string name;

getline(cin, name,'q');

ofs << name << endl;

(4)关闭流

ofs.close();

3.读流(即从本地文件中读取数据)

(1)创建读流对象

 ifstream ifs;

(2)打开文件准备读取数据(称为开流)

ifs.open("abc.txt", ios::in);

(3)开始从本地读取数据

方法1:
 char ValueArrays[1024]{};

 while (ifs >> ValueArrays)//非零即为真
    {
        cout << ValueArrays << endl;//这是字符串的打印
    }

方法2:

string str = " ";
    while (ifs >> str)
    {
        cout << str << endl;
    }

(4)关闭流

 ifs.close();

(5)存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)
#include <iostream>
#include<fstream>  
#include<string>
#include"User.h"
/*
预处理
#include中的" "和<>的使用
<>:代表的导入C++库文件
“ ”:先检索是否有没有自己写的头文件,如果检索不到自己写的头文件,会自动查找C++库,找不到就报错
*/


using namespace std;
void Save()
{
    using namespace std;
    ofstream ofs;
    ofs.open("abc.txt", ios::out);
    string name;
    getline(cin, name,'q');
    ofs << name << endl;
    
    
    ofs.close();
  
}
int name_index = 0;
void Add(string nameArrays[])//name是一个形参,需要一个string 类型数组的地址
{
    string name = " ";
    cin >> name;
    nameArrays[name_index] = name;
    name_index++;
    ofstream ofs;
    ofs.open("abc.txt", ios::out);
    for (int i = 0; i < name_index; i++)
    {
        ofs << nameArrays[i] << endl;
    }
    ofs.close();
}

void GetValue()
{
    using namespace std;
    //1. 创建对象
    ifstream ifs;
    //2. 开流
    ifs.open("abc.txt", ios::in);
    //3.读取数据,方法1
        //3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
    char ValueArrays[1024]{};
        //3.2开始取出数据,并将本地数据在数据中
    while (ifs >> ValueArrays)//非零即为真
    {
        cout << ValueArrays << endl;//这是字符串的打印
    }
    ifs.close();
    cout << "---------" << endl;
    //3.读取数据,方法2
        //3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据
        //读取不走回头路
    ifs.open("abc.txt", ios::in);
    string str = " ";
    while (ifs >> str)
    {
        cout << str << endl;
    }
    ifs.close();
    cout << "--------" << endl;
    //3.读取数据,方法3 借助一个ifstream里的一个函数getline
    ifs.open("abc.txt", ios::in);
    char buf[1024]{};
    while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一个函数,用于获取到一行数据,函数的第一个参数是用于接收一行数据的字符数组,
        //第二个参数是用于接收数据的容器的大小

    {
        cout << buf << endl;
    }
    ifs.close();
    cout << "--------" << endl;

    //3.读取数据,方法4 借助一个string里的一个函数getline
    ifs.open("abc.txt", ios::in);
    string str_buf = {};
    while (getline(ifs, str_buf))
    {
        cout << str_buf << endl;
    }
    ifs.close();

    cout << "--------" << endl;

    //3.读取数据,方法5 借助一个ifstream里的一个函数eof
    ifs.open("abc.txt", ios::in);
    char eof_buf[1024]{};
    while (!ifs.eof())
    {
        ifs >> eof_buf;
        cout << eof_buf << endl;
    }
    ifs.close();
}

void SetValue()
{
    string name = " ";
    string age = " ";
    string address = " ";
    cout << "请输入姓名:" << endl;
    cin >> name;
    cout << "请输入年龄:" << endl;
    cin >> age;
    cout << "请输入地址:" << endl;
    cin >> address;
    ofstream ofs;
    ofs.open("Value.txt", ios::out);
    ofs << name << "  ";
    ofs << age << "  ";
    ofs << address << endl;
    ofs.close();
}

void SelValue()
{
    string r_name = " ";
    string r_age = " ";
    string r_address = " ";
    ifstream ifs;
    ifs.open("Value.txt", ios::in);
    while (ifs >> r_name && ifs >> r_age && ifs >> r_address)
    {
        cout << "姓名:" << r_name << ",年龄:" << r_age << ",地址:" << r_address << endl;
    }
    ifs.close();
}

//增加用户
User uArray[6] = {};
int uSize = 0;
void AddUser()
{
    string name;
    int age;
    string address;
    cout << "输入姓名:" << endl;
    cin >> name;
    cout << "输入年龄:" << endl;
    cin >> age;
    cout << "输入地址:" << endl;
    cin >> address;

    User uInstance;
    uInstance.name = name;
    uInstance.age = age;
    uInstance.address = address;

    uArray[uSize] = uInstance;
    uSize++;
    ofstream ofs;
    ofs.open("UserInfo.txt", ios::out);
    for (int i = 0; i < uSize; i++)
    {
        ofs << uArray[i].name << " ";
        ofs << uArray[i].age << " ";
        ofs << uArray[i].address << endl;
    }
    ofs.close();
}

int Find(string name)
{
    for (int i = 0; i < uSize; i++)
    {
        if (uArray[i].name == name)
        {
            return i;
        }
    }
    return -1;
}


//查询所有人的所有信息
void SelAllUser()
{
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
   //is_open判断上一行代码中打开的文件是否存在
    //存在返回真,不存在返回假
    /*if (ifs.is_open())
    {
        cout << "文件存在" << endl;
    }
    else
        cout << "文件不存在" << endl;*/
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl;
        return;//文件不存在,下方逻辑不用执行
    }
    char buf[1024];
    ifs >> buf;
    if (ifs.eof())
    {
        cout << "文件存在,但没数据" << endl;
        return;//下方逻辑无需进行
    }
    ifs.close();
    ifs.open("UserInfo.txt", ios::in);
    int i = 1;
    string name;
    int age;
    string address;
    while (ifs >> name && ifs >> age && ifs >> address)
    {
        cout << "第" << i << "人的姓名是" << name << ",年龄是" << age << ",地址是" << address << endl;
    }
   
}
//查询某个人的所有信息
void SelUser()
{
    cout << "输入名字" << endl;
    string sel_name = " ";
    cin >> sel_name;
    int index = Find(sel_name);//Find()会返回一个int类型的值
    if (index != -1) {}//
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
    string name = " ";
    int age = 0;
    string address = " ";

    while (ifs >> name && ifs >> age && ifs >> address)
    {
        if (name == sel_name)
        {
            cout << "用户名为:" << name << ",年龄是:" << age << ",地址是:" << address << endl;
        }
    }
}
//初始化
int Init()
{
    ifstream ifs;
    ifs.open("UserInfo.txt", ios::in);
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl;
        return -1;//文件不存在,下方逻辑不用执行
    }
    char buf[1024];
    ifs >> buf;
    if (ifs.eof())
    {
        cout << "文件存在,但没数据" << endl;
        return -1;//下方逻辑无需进行
    }
    ifs.close();
    ifs.open("UserInfo.txt", ios::in);
    int i = 0;
    string name;
    int age;
    string address;
    while (ifs >> name && ifs >> age && ifs >> address)
    {
        uArray[i].name = name;
        uArray[i].age = age;
        uArray[i].address = address;
        i++;
    }
    return i;
}
int main()
{   
    //string str = {};
    //getline(cin, str, 'q');//控制台输入数据,赋值到str中,按q键再按回车键结束
    //getline(cin, str, '\t');//控制台输入数据,赋值到str中,按Tab键然后再按回车结束
    //cout << str << endl;
    //Save();
    //GetValue();
    //SetValue();
   // SelValue();
    int addIndex = Init();

    while (true) {
        cout << "添加:1,查询:2,退出:0" << endl;
        int selecter;
        cin >> selecter;
        switch (selecter)
        {
        case 0:
            exit;
            break;
        case 1:
            AddUser();
            break;
        case 2:
            SelAllUser();
            break;
        }
    }
    system("pause");
}

二、函数

(一)函数的声明和定义

1.函数声明的作用

代表的是函数的出生位置(占位置的),如果在文件最上方的位置声明了函数,不用担心函数和函数之间互相调用编译不通过的问题

2.函数的定义

为函数声明写函数体(写逻辑)

注 :可能出现的bug,函数只有声明,没有定义,这个函数却被调用了,被编译时期的异常error

(二)函数传值

1.传出数据(即返回值)

(1)作用:在函数内传数据出函数

(2)样式

返回类型 函数名称(参数)

{

        return 对应返回类型的值;

        //此处的return有双重作用:

        1.跳转语句(跳出函数)

        2.返回值

}

(3)可以返回的值:

1.对应返回类型的值

2.对应返回类型的变量

3.带同种返回类型返回值的函数调用——先执行函数调用,再返回值

2.传入数据(即传参)

(1)什么是传参?

传参就是实参传入形参

(2)作用

在函数外部传入数据到函数内部

(3)类型

形参:在函数声明和定义的时候写的是行参

实参:在函数调用的时候 传递的值是实参

实参的种类:

对应形参类型的值

对应形参类型的变量

带同种返回类型返回值的函数调用,即先执行函数调用,再传参数(实参传参数)

3.关于形参在函数声明和函数定义中注意点

  • 声明的形参参数名称和定义的形参参数名称

  • 可以不一样声明的时候可以省略参数名称

  • 如果存在函数的默参,默认是必须写在函数声明位置的,不可以在声明和定义中都写一遍默参

4.默参

作用:函数可以在声明或者定义的时候给出默认的逻辑执行

  • 关于默参的放置位置说明

    • 如果只有一个默参

      • 放在参数结尾处(最右侧)

    • 如果有多个默参

      • 从右到左依次给出默参,中间不可以隔开使用

        • 错误演示:void Function(int i=10,int a,bool b=false)

        • 正确演示::void Function(int i=10,int a=10,bool b=false)

5.函数重载

  • 函数名相同,但是函数参数(参数类型)不同,通过传入不同的实参,调用不同的函数,执行不同的功能

  • 注意:

    • 函数返回值不参与函数重载的过程

    • 如果被重载的函数中出现了默参

      • 建议不要写成重载函数

      • 如果不接受建议,就需要保证默参的几个参数类型与其他被重载的函数的参数不一致

6.传参方式

(1)值传递:值传递只能影响本函数,值的修改不会影响其他的功能,也不会影响到实参

(2)地址传递

(3)引用传递

三、内联函数

(一)其它名称

1.内联函数

2.在线函数

3.编译时期展开函数

(二)怎么写一个内联函数

inline声明和定义都需要添加在类中,当一个函数的声明和定义放在一起的时候,默认这个函数是内联函数

(三)内联函数有什么用

简单的逻辑写在内联函数中,可以有效提高程序的执行速度

(四)内联函数的注意事项

switch for while do while这种较为复杂的逻辑不要放在内联函数中

代码尽量不要超过10行

(五)内联的优缺点

用空间换时间

实现的是在编译时期,逻辑的复制粘贴,而不是函数跳转

四、宏

(一)作用

实现文本替换,可以一定程度上减少记忆负担

(二)语法

简单宏:

#define <宏名> <文本内容>

例:#define MINNUMBER 0.01

带参:

#define 宏名 (参数列表) 文本内容

例:#define function(x)    x*x

(三)分类

1.简单宏

添加宏:#define 宏名 文本内容

2.带参数宏

添加宏:#define 宏名(参数列表) 文本内容

在使用宏的时候将实参(数或者变量) 传给形参

(四)卸载宏

#undef 被卸载宏名

五、别名

数据类别名

typedef :为数据类型取别名(将复杂的数据类型修改为简单易读的名称)

六、作用域

(一)全局域

1.函数:

全局函数

2.变量:

全局变量:可以不初始化,系统会帮助初始化,但在实际项目开发中,建议程序员手动初始化

3.如果存在命名冲突怎么解决?

添加命名空间namespace全局变量

(二)成员域

1.函数:

成员函数:如果成员函数的声明和定义放在了一起,这个成员函数将被处理为内联函数

2.变量:

成员变量(成员属性):可以不初始化,系统会帮助初始化,但在实际项目开发中,建议程序员手动初始化

(三)局部域

变量:局部变量,必须初始化

(四)语句域

if...else while for do...while 循环中创建的变量

{ }

七、随机数

1.导入头文件

2.添加随机种子

3.使用随机数

参考源码:

面向对象

待更新.....