这两天开始学习qt,在这里记录一下我学习的过程。 由于是跟着正点原子学的,看指南,我就顺便复习一下c++吧,毕竟这俩关系挺大的。
1. c++面向对象
面向对象的三大特征就是继承、多态和封装。
1.1 类和对象
类是c++的核心特性,通常被称为用户定义的类型。函数在一个类中被称为类的成员。
从类中实例化对象分为两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象。例如
class A //定义一个类
{
};
int main()
{
A a; //实例化一个对象
A *a = new A(); //从堆中实例化对象,使用new的都是从堆中实例化对象
}
1.1.1 构造函数和析构函数
构造函数在对象实例化的时候会被系统自动调用,在定义类时,如果没有定义构造函数和析构函数,编译器会生成一个构造函数和析构函数。
构造函数:
- 构造函数必须和类名相同;
- 可以重载;
- 没有返回类型,哪怕是void也不行
析构函数:和构造函数相反,在对象结束生命周期时系统会自动执行析构函数。
- 格式为~类名();
- 调用时释放内存;
- ~类名()不能加参数
- 没有返回值,哪怕是void也不行
class A
{
public:
a();
~a();
};
A::a() //类的函数在类外实现需要使用::
{
....
}
A::~a()
{
....
}
1.1.2 this指针
一个类中的不同对象在调用自己的成员函数,通过this指针访问具体对象的数据成员,this指针记录对象的内存地址。
- this只能在成员函数中使用;
- this在成员函数的开始前构造,在成员函数结束后清除;
- this会因编译器不同而有不同的放置位置,可能是栈或者寄存器,甚至全局变量
2. 继承
继承允许我们依据另一个类来定义一个类。当创建一个类时,不需要重新写新的数据成员和成员函数,只要指定已有的类的成员就行。已有的称为基类,新建的称为派生类。继承的访问修饰符有好几种,包括public、protected、private。
3. 重载
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
重载声明:
- 同名函数;
- 形式参数(参数的个数、类型或顺序)必须不同。
4. 多态
多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
形成多态条件:
- 存在继承关系;
- 继承关系必须有同名虚函数;
- 存在基类类型的指针或引用,通过该指针或引用调用虚函数;
5. 数据封装
数据封装把数据和操作数据的函数捆绑在一起。
6. 数据抽象
只向外界提供关键信息,并隐藏其后台的实现细节。即是仅向用户提供接口而把具体细节隐藏。
7. 接口(抽象类)
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。插入一下,顺便复习一下虚函数。
虚函数:在基类中使用关键字virtual声明的函数。
纯虚函数:纯虚函数一定没有定义,是用来规范派生类的行为,即接口的。
class A
{
public:
virtual void run(){ //虚函数
...
}
virtual void fun1() = 0; //纯虚函数
}
所以抽象类不能被用于实例化对象,只能作为接口使用。如果一个A的子类需要被实例化,则需要实现每个虚函数,即使用A声明的接口,并在派生类中重写纯虚函数。
class B : public A
{
public:
void fun1(){
cout << ... << endl;
}
}
int main()
{
B b;
b.fun1();
return 0;
}
🆗,c++复习差不多了,开始学习qt