-

第一部分:C++基础知识

学习目标,将学习FPGA的同时,把相关的练手项目通过RS232串口与PC上位机通信,增加项目可扩展性,例如我们的DDS信号发生器,通过上位机控制输出的波形,

例如简易的电压表、后续的多串口数据采集等等。利用QT的项目,在学习FPGA的同时学习一下C++的用法,毕竟后续FPGA进阶到ZYNQ的时候需要使用C/C++编程一些内容。

1. 什么是C++

C++是C语言的升级版,在C的基础上增加了很多功能,是一种高级的语言

2. 什么是面向过程,什么又是面向对象

C语言就是面向过程的,而C++是面向对象的

举例:a+b

直接计算a+b就是面向过程的

面向对象就是给a+b穿上了一层衣服,而不是直接计算a+b。

3. C++的灵魂,C++的类

类可以看作C语言结构体的升级版,类的成员不仅可以是变量,也可以是函数。

4. 如何定义一个类

class student
{
public: // 修饰符
    char name[64];
    int age;
}

5. 什么是对象

对象是类的实例化

6. 如何定义一个对象

直接定义

student my // student 就是类, my 就是对象

在堆里面定义

stdent *my1 = new student; // 指针类型的

删除对象

delete my1; // 只能删除在堆里面定义的对象,目的是释放内存

7. 如何访问类的成员

student *my = new student;
my.age = 18;
my -> age = 19;

cout << my.age << emdl;
cout << my1 -> age << endl;

访问方法和C语言一样,普通变量直接通过 “.” 来访问,指针通过“- >”访问

8. 类的函数成员

因为类的成员不仅可以是变量,也可以是函数

第一步:在类里面声明

第二步:实现这个函数。我们可以直接在类的里面写,也可以写在类的外面

// 在类里面实现函数
class student 
{
public:
    char name [64];
    int age ;
    
    void test()
    {
    cout << 123 << endl;
    };
};
// 在类的外面实现函数
class student 
{
public:
    char name [64];
    int age ;
    void test();
};

void student::test() // student:: 表示属于这个类里面的函数,不加的话会被识别为普通的函数
{
    cout << 123 << endl;
}

9. 类的访问修饰符

类的访问修饰符就是对类的成员进行权限管理

public:表示函数和变量是公开的,任何人都能访问。

private: 表示函数和变量只能在自己的类里面自己访问自己,不能通过对象来访问。

当强行访问private修饰的变量时,需要绕一个弯,也就是通过类里面的函数访问私有的变量,然后通过对象来访问这个函数(通过公有来访问私有)

protected:表示函数和变量只能在自己的类里面自己访问自己,但是可以被派生类来访问的。

10. 类函数的重载特性

类函数的重载特性就是说我们可以在类里面定义同名的函数,但是参数不同的函数。

class student 
{
public:
    void test();
    void test(int a);
};

void student::test(){};
void student::test(){};

重载函数在调用的时候,会自动判断函数的类型从而匹配调用不同的函数

11. 构造函数和析构函数

析构函数:假如我们定义了析构函数,那么当对象被删除或者生命周期结束的时候,就会触发析构函数。

构造函数:假如我们定义了构造函数,那么当对象被调用的时候就会触发这个函数,类似与python类中的def init(self)

在定义析构函数和构造函数时:

  1. 析构函数和构造函数的名字必须和类名一模一样。
  2. 析构函数要在前面加上一个”~“
class student
{
public:
    student();
    void test();
    void test(int a);
    ~student();

};

// 构造函数
student::student(){
    cout << "Hello" << endl;
}
// 析构函数
student::~student(){
    cout << "Bye" << endl;
}

其中构造函数是可以被重载的,而析构函数不可以被重载

#include <iostream>

using namespace std;

class student
{
public:
    student();
    student(int a);

    void test();
    void test(int a);
    ~student();

};

// 构造函数1
student::student(){
    cout << "Hello" << endl;
}
// 构造函数2
student::student(int a){
    cout << a << endl;
}
// 析构函数
student::~student(){
    cout << "Bye" << endl;
}

void student::test(){
    int haha = 100;
    cout << haha << endl;
}
void student::test(int a){
    cout << a << endl;
}

int main()
{
    student my;
    student *my1 = new student(10);// 使用指针来构造对象,传入参数就可以来实现重载构造函数的功能
    my.test(50);
    my.test();

    return 0;
}

12. 类的继承

什么是类的继承?

类的继承允许我们在新的类里面继承父类的public还有protected部分,而private是不能继承的。

当我们觉得这个类不好的时候,就可以使用类的继承,添加我们的功能。

格式:

class 儿子 : public 爸爸{
public:
    .......
    

};

例如:
class mystudent : public student{
public:
    int grade;
    
};

如何在子类里面访问父类里面的成员?

也是通过“.”或者“- >”来访问的

13. 虚函数和纯虚函数

虚函数:有实际定义的,允许派生类对他进行覆盖式的替换,virtual来修饰

纯虚函数:没有实际定义的虚函数就是纯虚函数

virtual void test(); // 虚函数
virtual void test1(){}; //  纯虚函数

怎么定义一个虚函数

用virtual来修饰,虚函数是用在类的继承上的。

例子:

#include <iostream>

using namespace std;

class student
{
public:
    student();
    student(int a);

    virtual void test();
    void test(int a);
    ~student();

};
class mystudent : public student{
public:
    void test(){
        cout << 123456 << endl;
    }

};
// 构造函数1
student::student(){
    cout << "Hello" << endl;
}
// 构造函数2
student::student(int a){
    cout << a << endl;
}
// 析构函数
student::~student(){
    cout << "Bye" << endl;
}

void student::test(){
    int haha = 100000;
    cout << haha << endl;
}
void student::test(int a){
    cout << a << endl;
}

int main()
{
    student my;
    mystudent my2;
    my2.test();
    my.test();

    return 0;
}
输出部分:
Hello
Hello
123456
100000
Bye
Bye

可以看到在my2的对象上,test打印出来的内容被覆盖成123456,原本父类的test打印的内容是100000

虚函数的优点?

可以使用虚函数预留接口,实现分工合作!

第二部分:QT部分


本站由 John Doe 使用 Stellar 1.28.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本"页面"访问 次 | 👀总访问 次 | 🥷总访客