[Serie de Programación QT-16]: Marco Básico - Características del Lenguaje C++

Tabla de contenido

Capítulo 1 Introducción

Capítulo 2 Características del idioma

2.1 Encapsulación orientada a objetos

2.1 Potente mecanismo de señal y ranura = "Comunicación entre objetos a través de señales

2.2 Propiedades de objetos de diseño consultables

2.3 Filtros de tiempo y eventos

2.4 Soporte para la internacionalización de cadenas

2.5 Tiempo de precisión

2.6 Buena estructura de organización de objetos = "herencia de clase

2.7 Qt maneja el problema de los punteros salvajes

2.8 Conversión de tipo dinámico flexible

2.9 Constructor

2.10 Listas de inicialización e inicialización de objetos

2.11 anular


Capítulo 1 Introducción

En Qt, C++ se utiliza como lenguaje de programación principal. C++ es un lenguaje de programación fuertemente tipado de propósito general que, cuando se usa junto con el marco Qt, facilita la creación de aplicaciones de interfaz gráfica de usuario (GUI) multiplataforma y otros tipos de aplicaciones.

Estos son algunos aspectos y características del uso de C++ en Qt:

  1. Programación orientada a objetos (POO): C++ es un lenguaje de programación orientado a objetos y Qt está construido de manera orientada a objetos. Al usar C++, los desarrolladores pueden aprovechar los conceptos de programación orientada a objetos como clases, herencia, polimorfismo, etc. para organizar y administrar el código.

  2. Clases y bibliotecas Qt: Qt proporciona un amplio conjunto de clases y bibliotecas para crear elementos GUI, manejar eventos, dibujar gráficos, comunicarse a través de redes y más. Estas clases y bibliotecas están escritas en C++ y, al usarlas, los desarrolladores pueden crear rápidamente aplicaciones potentes.

  3. Mecanismo de señal y ranura: el mecanismo de señal y ranura de Qt se implementa a través de las características de C++. Utiliza el puntero de función de C++ y la sobrecarga de operadores, lo que hace que la comunicación entre objetos sea flexible y confiable.

  4. Gestión de memoria: Qt utiliza la tecnología de gestión de memoria RAII (la adquisición de recursos es inicialización) para reducir la complejidad de las fugas de memoria y la gestión de recursos mediante la automatización de la gestión del ciclo de vida de los objetos. Al mismo tiempo, Qt también proporciona punteros inteligentes y otras herramientas de administración de memoria para ayudar a los desarrolladores a administrar la memoria de manera más conveniente.

  5. Manejo de excepciones: C++ admite mecanismos de manejo de excepciones, y muchas clases y funciones de Qt también usan excepciones para manejar errores y condiciones anormales. Los desarrolladores pueden usar bloques try-catch para capturar y manejar estas excepciones.

  6. Compatibilidad con C++11 y versiones posteriores: la compatibilidad de Qt con el estándar C++11 y versiones posteriores está aumentando gradualmente. Los desarrolladores pueden usar las nuevas características de C++11, como la inferencia automática de tipos, expresiones Lambda, punteros inteligentes, etc., para escribir aplicaciones Qt de manera más fácil y conveniente.

Cabe señalar que aunque Qt utiliza C++ como lenguaje de programación principal, también proporciona cierto soporte para otros lenguajes de programación, como la programación declarativa mediante QML (Qt Quick). Con QML, los desarrolladores pueden usar el lenguaje JavaScript para interactuar con Qt y crear interfaces de usuario dinámicas y modernas.

En resumen, la combinación de Qt y C++ proporciona un potente entorno de desarrollo que permite a los desarrolladores crear aplicaciones multiplataforma, de alto rendimiento y ricas en funciones.

Capítulo 2 Características del idioma

2.1 Encapsulación orientada a objetos

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);   //应用程序对象,管理UI主线程

    QIcon icon(":/res/logo.png");

    a.setWindowIcon(icon);  //设置应用程序的icon

    MainWindow w;           //创建主窗口对象

    w.show();               //展示主窗口

    return a.exec();        //执行应用程序的事件处理线程
}

2.1 Potente mecanismo de señal y ranura = "Comunicación entre objetos a través de señales

El principio básico de las señales y las franjas horarias es: ¡registro y mecanismo de devolución de llamada! ! !

2.2 Propiedades de objetos de diseño consultables

2.3 Filtros de tiempo y eventos

2.4 Soporte para la internacionalización de cadenas

2.5 Tiempo de precisión

Los temporizadores sofisticados controlados por intervalos hacen posible integrar elegantemente la multitarea en una GUI controlada por eventos.

2.6 Buena estructura de organización de objetos = "herencia de clase

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QFont>
class MyMainWindow : public QWidget       // MyMainWindow继承于QWidget对象
{ public:     MyMainWindow(); privado:     QPushButton *b1; };




2.7 Qt maneja el problema de los punteros salvajes

Use la clase QPointer para establecer el puntero en 0 cuando se elimine el objeto al que apunta el puntero.

2.8 Conversión de tipo dinámico flexible

La extensión de Qt a C++ comienza desde QObject (similar a java.lang.Object en java), llamado sistema de metaobjetos de Qt, que requiere el soporte del compilador de metaobjetos MOC. Qt implementa una programación GUI flexible al encapsular y extender C++.

2.9 Constructor

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qDebug() << "main threadId: " << QThread::currentThreadId();
}

VentanaPrincipal::VentanaPrincipal(QWidget *padre) 

{

}

El constructor parametrizado de la clase MainWindows : MainWindow(QWidget *parent) 

parámetro:

  • padre: apunta al objeto de la ventana principal

2.10 Listas de inicialización e inicialización de objetos

Este código es una implementación típica del constructor  de la clase de ventana principal  de Qt . Aquí hay una explicación línea por línea:MainWindow

class MainWindow : public QMainWindow  //继承于QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
}


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
  • MainWindow::MainWindow(QWidget *parent) Es la definición del constructor, que representa  MainWindow al constructor de la clase y acepta un  QWidget* tipo de  parent parámetro.parent是构造函数的参数,用于指向父窗口。

  • : es la lista de inicializadores para el constructor.

  • : QMainWindow(parent) Indica llamar QMainWindow al constructor de la clase base de la clase MainWindow y  parent pasarle parámetros. Esto asegura que cuando  MainWindow se construye un objeto, también se construye su clase base  QMainWindow成员.

  • , ui(new Ui::MainWindow) es una declaración de inicialización de variable miembro/ui-familiar que inicializa   un puntero a una clase ui llamada  es una clase generada automáticamente que administra el diseño de la interfaz de usuario y los elementos de la ventana principal. ui es para el objeto MainWindow.Ui::MainWindowUi::MainWindow

El propósito de este código es inicializar el objeto de la ventana principal en el constructor y crear un   objeto ui para administrar el contenido relacionado con la interfaz de usuario. Por lo general, en este constructor, también puede realizar otras operaciones de inicialización, como establecer el título de la ventana, agregar componentes, etc.Ui::MainWindow

Cabe señalar que este código se genera automáticamente utilizando las herramientas de diseño visual de Qt (como Qt Creator). En una herramienta de diseño visual, los usuarios pueden crear una interfaz de usuario arrastrando y diseñando, y luego la herramienta generará automáticamente este constructor y los códigos relacionados. Los usuarios pueden agregar lógica personalizada y código de procesamiento en el constructor generado.

:La lista de inicialización del constructor es la parte que sigue a los dos puntos ( ) en la definición del constructor , que se utiliza para inicializar las variables miembro y llamar al constructor de la clase base .

La sintaxis de una lista de inicializadores es declaraciones de inicialización de miembros separadas por comas , cada declaración de inicialización de miembros consta de un nombre de miembro, paréntesis y un valor de inicialización.

Un ejemplo de una lista típica de inicializadores de constructores es el siguiente:

ClassName::ClassName(Type1 arg1, Type2 arg2)
    : member1(arg1), member2(arg2), member3()
{
    // 构造函数的其他代码
}

En el ejemplo anterior:

  • ClassName Indica el nombre de la clase.
  • Type1 y  Type2 es el tipo de la variable miembro  member1 sum  member2 .
  • arg1 y  arg2 son parámetros del constructor.
  • member1(arg1) y  member2(arg2) son instrucciones de inicialización de variables miembro, que se utilizan para inicializar el valor del parámetro en la variable miembro.
  • member3() Es otra forma de inicializar variables miembro.Si no se proporcionan parámetros, se utiliza el constructor predeterminado para la inicialización.

El papel de la lista de inicialización del constructor incluye:

  1. Inicializar variables miembro: A través de la lista de inicialización, se puede asignar directamente el valor inicial a la variable miembro cuando se crea el objeto, evitando la operación de reasignación en el cuerpo del constructor.

  2. Llamar al constructor de la clase base: si la clase actual es una clase derivada, la lista de inicialización se puede usar para llamar al constructor de la clase base para garantizar que las variables miembro heredadas de la clase base se inicialicen correctamente.

Mediante el uso de listas de inicialización, puede mejorar la eficiencia de ejecución del código y garantizar la inicialización correcta y coherente del estado del objeto. Especialmente para los constructores de clases complejas, establecer los valores de varias variables miembro a la vez en la lista de inicialización puede hacer que el código sea más claro y fácil de leer.

Cabe señalar que el orden de inicialización de las variables miembro en la lista de inicialización debe ser coherente con el orden en que se declaran en la clase para evitar posibles problemas.

En el constructor de la clase derivada, la lista de inicialización también se puede usar para llamar al constructor de la clase base e inicializar las variables miembro de la clase derivada. La sintaxis de una lista de inicializadores es similar a la de llamar a un constructor de clase base.

El siguiente es un ejemplo de una lista de inicializadores de constructores de clases derivadas:

DerivedClassName::DerivedClassName(Type1 arg1, Type2 arg2, Type3 arg3)
    : BaseClassName(arg1), member1(arg2), member2(arg3)
{
    // 派生类构造函数的其他代码
}

En el ejemplo anterior:

  • DerivedClassName Indica el nombre de una clase derivada.
  • Type1, Type2 y  Type3 son los tipos de constructores de clases base y variables de miembros de clases derivadas.
  • arg1, arg2 y  arg3 son los parámetros del constructor.
  • BaseClassName(arg1) es llamar al constructor de la clase base y pasarle el valor del parámetro.
  • member1(arg2) y  member2(arg3) son sentencias de inicialización de variables miembro de clase derivadas, que se utilizan para inicializar el valor del parámetro en la variable miembro.

A través de la lista de inicialización, las variables miembro de la clase base y la clase derivada se pueden inicializar correctamente en el constructor de la clase derivada para garantizar la inicialización completa del objeto. Además, si la clase derivada no define sus propias variables miembro, solo necesita llamar al constructor de la clase base.

Cabe señalar que el constructor de la clase derivada llamará automáticamente al constructor predeterminado de la clase base. Si la clase base no proporciona un constructor predeterminado, el constructor de la clase derivada debe llamar explícitamente al constructor apropiado de la clase base en la lista de inicialización. Al mismo tiempo, el constructor de la clase derivada solo puede llamar al constructor de la clase base directa en la lista de inicialización y no puede llamar al constructor de la clase base indirecta.

Con todo, la lista de inicialización de la clase derivada se utiliza para inicializar las propias variables miembro de la clase derivada y llamar al constructor de la clase base. Al usar la lista de inicialización, puede asegurarse de que las diversas partes del objeto se inicialicen correctamente en el constructor de la clase derivada, lo que garantiza que el objeto se cree e inicialice correctamente.

2.11 override

En C++, es una palabra clave que se usa para indicar explícitamente una anulación de una función virtual de clase baseoverride en una clase derivada .

overrideLa legibilidad y el mantenimiento del código se pueden mejorar mediante el uso de palabras clave para garantizar que las clases derivadas invaliden correctamente las funciones virtuales de la clase base .

La sintaxis utilizada overridees la siguiente:

class Base {
public:
    virtual void myFunction();
};

class Derived : public Base {
public:
    void myFunction() override;  //头文件中声明,需要覆盖,在源文件中,需要定义实体函数
};

En el ejemplo anterior, Basela clase declara una función virtual myFunction(). En las clases derivadasDerived , el uso de la palabra clave indicaoverride explícitamente la anulación de las funciones virtuales de la clase base . De esta forma, si la función virtual de la clase base no se anula correctamente en la clase derivada , el compilador informará de un error.

Cuando la palabra clave se usa en una clase derivada override, el compilador verificará que la firma de la función coincida con la firma de una función virtual de la clase base. Si las firmas no coinciden (como diferentes listas de parámetros, tipos de devolución, etc.), el compilador informará un error.

El uso overridede palabras clave puede proporcionar una verificación de tipos más sólida y ayudar a los desarrolladores a anular correctamente las funciones virtuales de la clase base en las clases derivadas. Previene fallas en la cobertura de funciones virtuales causadas por errores accidentales o errores tipográficos.

Cabe señalar que overridela palabra clave solo es aplicable para anular funciones virtuales en la clase base , no para anular funciones estáticas o no virtuales. Al anular funciones estáticas o no virtuales, overrideno es necesario utilizar la palabra clave.

Mediante el uso overridede palabras clave, puede mejorar la confiabilidad y la capacidad de mantenimiento de su código, ayudar a los desarrolladores a evitar algunos errores comunes y hacer que el comportamiento de los programas sea más predecible.

Supongo que te gusta

Origin blog.csdn.net/HiWangWenBing/article/details/131734619
Recomendado
Clasificación