第一部分: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)
在定义析构函数和构造函数时:
- 析构函数和构造函数的名字必须和类名一模一样。
- 析构函数要在前面加上一个”~“
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
虚函数的优点?
可以使用虚函数预留接口,实现分工合作!