qt之旅(一)

93 阅读3分钟

这两天开始学习qt,在这里记录一下我学习的过程。 由于是跟着正点原子学的,看指南,我就顺便复习一下c++吧,毕竟这俩关系挺大的。

1. c++面向对象

面向对象的三大特征就是继承、多态和封装。

1.1 类和对象

类是c++的核心特性,通常被称为用户定义的类型。函数在一个类中被称为类的成员。

从类中实例化对象分为两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象。例如

class A   //定义一个类
{
    
};

int main()
{
    A a;            //实例化一个对象
    A *a = new A();  //从堆中实例化对象,使用new的都是从堆中实例化对象
}

1.1.1 构造函数和析构函数

构造函数在对象实例化的时候会被系统自动调用,在定义类时,如果没有定义构造函数和析构函数,编译器会生成一个构造函数和析构函数。

构造函数:

  1. 构造函数必须和类名相同;
  2. 可以重载;
  3. 没有返回类型,哪怕是void也不行

析构函数:和构造函数相反,在对象结束生命周期时系统会自动执行析构函数。

  1. 格式为~类名();
  2. 调用时释放内存;
  3. ~类名()不能加参数
  4. 没有返回值,哪怕是void也不行
class A
{
    public:
        a();
        ~a();
};

A::a()    //类的函数在类外实现需要使用::
{
    ....
}

A::~a()
{
    ....
}

1.1.2 this指针

一个类中的不同对象在调用自己的成员函数,通过this指针访问具体对象的数据成员,this指针记录对象的内存地址。

  1. this只能在成员函数中使用;
  2. this在成员函数的开始前构造,在成员函数结束后清除;
  3. this会因编译器不同而有不同的放置位置,可能是栈或者寄存器,甚至全局变量

2. 继承

继承允许我们依据另一个类来定义一个类。当创建一个类时,不需要重新写新的数据成员和成员函数,只要指定已有的类的成员就行。已有的称为基类,新建的称为派生类。继承的访问修饰符有好几种,包括public、protected、private。

3. 重载

C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载运算符重载

重载声明:

  1. 同名函数;
  2. 形式参数(参数的个数、类型或顺序)必须不同。

4. 多态

多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

形成多态条件:

  1. 存在继承关系;
  2. 继承关系必须有同名虚函数;
  3. 存在基类类型的指针或引用,通过该指针或引用调用虚函数;

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