minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Índice
Orientado a processos e orientado a objetos
Programação Orientada a Objetos
Formato de definição de classe
2. Qualificadores de acesso de classe e encapsulamento
Características deste ponteiro
A programação orientada a processos é uma ideia de programação centrada em processos. Na programação orientada a processos, um programa é visto como uma coleção de funções ou procedimentos que são executados em uma determinada ordem para completar uma tarefa específica.
vantagem:
- Desempenho eficiente : Como a programação orientada a processos executa tarefas diretamente de acordo com o processo e não requer criação e gerenciamento excessivos de objetos, ela tem maior eficiência de execução em alguns cenários com requisitos de desempenho mais elevados, como programação de sistema subjacente, programação incorporada, etc. Por exemplo, no kernel do sistema operacional, a programação orientada a processos pode ser usada para otimizar melhor o desempenho para a implementação de funções como agendamento de processos e gerenciamento de memória.
- lógica clara : Para uma lógica de programa simples, é implementada passo a passo de acordo com o processo. A estrutura lógica do código é clara e fácil de entender, fácil de entender e manter. Por exemplo, um programa simples que calcula a soma de dois números pode definir diretamente uma função para cálculo usando programação orientada a processos.
deficiência:
- Má manutenção : Quando o tamanho do programa aumenta e as funções se tornam complexas, o código orientado à programação processual pode se tornar difícil de manter e estender. Como o acoplamento entre várias funções é alto, a modificação de uma função pode afetar outras funções relacionadas.
- Baixa capacidade de reutilização de código: A reutilização de código geralmente é obtida por meio de chamadas de função, mas para módulos funcionais complexos, a reutilização é mais difícil e as funções não podem ser bem encapsuladas e abstraídas.
A programação orientada a objetos é uma ideia de programação centrada em objetos. Objetos são entidades que contêm dados (propriedades) e métodos (comportamentos) que operam nesses dados. Ao encapsular dados e métodos relacionados em um objeto, a integração de dados e operações é alcançada.
vantagem:
- Alta capacidade de manutenção : Encapsula funções em objetos, ocultando a implementação interna dos objetos do mundo externo e reduzindo o acoplamento entre módulos. Quando uma função precisa ser modificada, apenas a implementação interna do objeto correspondente precisa ser modificada sem afetar outras partes não relacionadas. Por exemplo, em um aplicativo de interface gráfica, se você deseja modificar a função de um botão, basta modificar o método correspondente do objeto botão sem afetar outros elementos da interface.
- Forte capacidade de reutilização de código : A reutilização e expansão de código podem ser facilmente alcançadas por meio de herança, polimorfismo e outros recursos.Por exemplo, crie uma classe base
Shape
(forma) e então derivarCircle
(redondo),Rectangle
(Retângulo) e outras subclasses, as subclasses podem reutilizar os atributos e métodos da classe base e fazer extensões específicas.- Boa flexibilidade: A programação orientada a objetos suporta polimorfismo, que permite ao programa selecionar e executar dinamicamente métodos correspondentes de acordo com o tipo real do objeto durante o tempo de execução, aumentando a flexibilidade e escalabilidade do programa.
deficiência:
- Sobrecarga de desempenho: Como a criação de objetos, chamadas de métodos e outras operações exigem uma certa sobrecarga, em alguns cenários com requisitos de desempenho extremamente altos, isso pode afetar a eficiência de execução do programa.
- Alto custo de aprendizagem: Os conceitos e recursos da programação orientada a objetos são relativamente complexos, dificultando o aprendizado e a compreensão dos iniciantes.
• class é a palavra-chave que define a classe, Data é o nome da classe e {} é o corpo da classe. Observe que o ponto e vírgula final não pode ser omitido no final da definição da classe. O conteúdo do corpo da classe é chamado de membro da classe: as variáveis da classe são chamadas de atributos ou as funções de membro da classe são chamadas de métodos ou funções de membro da classe;
• Para distinguir variáveis-membro, geralmente é costume adicionar um identificador especial à variável-membro, como começar com _ ou m antes ou depois da variável-membro. Observe que isso não é obrigatório em C++, são apenas algumas convenções. .
• Em C++, struct também pode definir classes. C++ é compatível com o uso de struct em C. Ao mesmo tempo, struct foi atualizado para uma classe. recomendado usar class para definir classes.
• As funções-membro definidas em uma classe são inline por padrão.
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private: // 为了区分成员变量,⼀般习惯上成员变量 // 会加⼀个特殊标识,如_ 或者 m开头 int _year; // year_ m_year int _month; int _day; }; int main() { Date d; d.Init(2024, 3, 31); return 0; }
• A classe define um novo escopo. Todos os membros da classe estão no escopo da classe. Ao definir membros fora da classe, você precisa usar o operador ::scope para indicar a qual domínio de classe o membro pertence.
• O domínio de classe afeta as regras de pesquisa de compilação. Se Init no programa a seguir não especificar o domínio de classe Stack, o compilador tratará Init como uma função global. Então, durante a compilação, a declaração/definição de membros como array não pode ser. encontrado, um erro será relatado. Especificar o domínio da classe Stack significa saber que Init é uma função membro. Se membros como array não puderem ser encontrados no domínio atual, eles serão pesquisados no domínio da classe.
- #include<iostream>
- using namespace std;
- class Stack
- {
- public:
- // 成员函数
- void Init(int n = 4);
- private:
- // 成员变量
- int* array;
- size_t capacity;
- size_t top;
- };
- // 声明和定义分离,需要指定类域
- void Stack::Init(int n)
- {
- array = (int*)malloc(sizeof(int) * n);
- if (nullptr == array)
- {
- perror("malloc申请空间失败");
- return;
- }
- capacity = n;
- top = 0;
- }
- int main()
- {
- Stack st;
- st.Init();
- return 0;
- }
• C++ é uma forma de implementar encapsulamento, usando classes para combinar as propriedades e métodos de um objeto para torná-lo mais completo e fornecer seletivamente suas interfaces para usuários externos por meio de permissões de acesso.
• Membros modificados por público podem ser acessados diretamente fora da classe; membros modificados por protegido e privado não podem ser acessados diretamente fora da classe. Protegido e privado são iguais, e suas diferenças serão refletidas no capítulo sobre herança posteriormente.
• O escopo das permissões de acesso começa na posição onde o qualificador de acesso aparece até que o próximo qualificador de acesso apareça. Se não houver nenhum qualificador de acesso subsequente, o escopo termina em }, ou seja, a classe.
• Quando um membro de definição de classe não é modificado por um qualificador de acesso, o padrão é private.
• estrutura padrão para público
• Geralmente, as variáveis-membro serão restritas a privadas/protegidas, e as funções-membro que precisam ser usadas por outros serão tornadas públicas.
As três principais características da orientação a objetos: encapsulamento, herança e polimorfismo.
No estágio de classe e objeto, estudamos principalmente as características de encapsulamento das classes. Então, o que é encapsulamento?
Encapsulamento: Combine organicamente dados e métodos de operação de dados, oculte as propriedades e detalhes de implementação do objeto e exponha apenas a interface para interagir com o objeto.
O encapsulamento é essencialmente um tipo de gerenciamento que facilita o uso de classes pelos usuários. Por exemplo: Para um dispositivo complexo como um computador, as únicas coisas fornecidas ao usuário são as teclas para ligar e desligar, entrada de teclado, monitor, entrada USB, etc., permitindo ao usuário interagir com o computador e realizar tarefas diárias. Mas, na verdade, o verdadeiro trabalho do computador é a CPU, a placa gráfica, a memória e outros componentes de hardware.
Para usuários de computador, eles não precisam se preocupar com os componentes internos do núcleo, como a disposição dos circuitos da placa-mãe, como a CPU é projetada, etc. interagir com o computador através do teclado e do mouse. Portanto, quando os fabricantes de computadores saem da fábrica, eles colocam um invólucro na parte externa para ocultar os detalhes internos da implementação e fornecem apenas interruptores de energia, conectores de mouse e teclado na parte externa para que os usuários possam interagir com o computador.
Para implementar o encapsulamento na linguagem C++, os dados e métodos para operação de dados podem ser combinados organicamente por meio de classes, e os direitos de acesso podem ser usados para ocultar os detalhes internos de implementação dos objetos e controlar quais métodos podem ser usados diretamente fora da classe.
• O processo de criação de um objeto na memória física usando um tipo de classe é chamado de instanciação de classe.
• Uma classe é uma descrição abstrata de um objeto. É algo como um modelo, que limita as variáveis-membro da classe. Essas variáveis-membro são apenas declaradas e não alocam espaço. O espaço será alocado quando um objeto for instanciado. aula.
• Uma classe pode instanciar vários objetos. Os objetos instanciados ocupam espaço físico real e armazenam variáveis de membros da classe. Por exemplo: instanciar objetos de uma classe é como usar desenhos de projeto arquitetônico para construir uma casa na realidade. Uma classe é como um desenho de projeto que planeja quantos cômodos existem, o tamanho e as funções do cômodo, etc., mas há. não é um objeto físico. Mesmo que exista um edifício, ele não pode habitar as pessoas. Somente quando uma casa é construída com desenhos de projeto a casa pode ser habitada. A mesma classe é como um desenho de projeto e não pode armazenar dados. O objeto instanciado aloca memória física para armazenar dados.
Analise quais membros estão no objeto de classe? Cada objeto instanciado por uma classe possui um espaço de dados independente, portanto o objeto deve conter variáveis de membro. Então, as funções de membro estão incluídas? Primeiro, depois que a função é compilada, ela é uma seção de instruções, que não pode ser armazenada no objeto. Essas instruções são armazenadas em uma área separada (segmento de código), portanto, se precisarem ser armazenadas no objeto, elas só poderão ser armazenadas. ponteiros para funções-membro. Vamos analisar novamente, é necessário armazenar ponteiros no objeto Date instancia dois objetos d1 e d2 têm suas próprias variáveis de membro independentes _year/_month/_day para armazenar seus próprios dados, mas a função membro Init/Print. os ponteiros de d1 e d2 são iguais, portanto, armazená-los em objetos é um desperdício. Se você usar Date para instanciar 100 objetos, o ponteiro da função membro será armazenado 100 vezes, o que é um desperdício demais. Na verdade, o ponteiro de função não precisa ser armazenado. O ponteiro de função é um endereço. A função de chamada é compilada em uma instrução assembly [endereço de chamada]. , não em tempo de execução. Somente o polimorfismo dinâmico é encontrado em tempo de execução e os endereços de função precisam ser armazenados.
Acima analisamos que apenas variáveis membro são armazenadas em objetos. C++ estipula que objetos instanciados por classes também devem obedecer às regras de alinhamento de memória.
Regras de alinhamento de memória
As regras de alinhamento de memória são exatamente as mesmas da linguagem CArtigo de referência:Linguagem C para calcular o alinhamento da memória
O primeiro membro está no deslocamento de endereço 0 da estrutura.
• Outras variáveis-membro devem ser mapeadas para endereços que sejam múltiplos inteiros de um determinado número (número de alinhamento).
• Nota: Logaritmo = o menor entre o número de alinhamento padrão do compilador e o tamanho do membro.
•O logaritmo padrão em VS é 8
• O tamanho total da estrutura é: um múltiplo inteiro do número máximo de alinhamento (o maior de todos os tipos de variáveis e o menor parâmetro de alinhamento padrão).
• Se uma estrutura estiver aninhada e a estrutura aninhada estiver alinhada a um número inteiro múltiplo de seu próprio logaritmo máximo, o tamanho geral da estrutura será o número máximo de alinhamento de todos os números (incluindo o alinhamento da estrutura aninhada).
Se não houver variável membro, deve ser fornecido 1 byte, porque se nem mesmo um byte for fornecido, como pode ser demonstrado que o objeto existiu? Portanto, 1 byte é fornecido aqui apenas para identificação de espaço reservado da existência do objeto.
Existem duas funções membro, Init e Print, na classe Date. Não há distinção entre diferentes objetos no corpo da função. Portanto, quando d1 chama as funções Init e Print, como a função sabe se deve acessar o objeto d1 ou. o objeto d2?Então aqui veremos que C++ fornece um ponteiro this implícito para resolver o problema aqui.
• Após a compilação do compilador, as funções-membro da classe adicionarão um ponteiro do tipo de classe atual, chamado de ponteiro, à primeira posição do parâmetro formal por padrão. Por exemplo, o protótipo real da classe Init of Date é,void Init(Data* const this, int ano, int mês, int dia) • Ao acessar variáveis de membro em funções de membro de classe, elas são acessadas essencialmente por meio deste ponteiro. Por exemplo, ao atribuir um valor a _ano na função Init, isto. ->_ano = ano;
• C++ estipula que esse ponteiro não pode ser escrito explicitamente na posição dos parâmetros reais e dos parâmetros formais (o compilador irá manipulá-lo durante a compilação), mas esse ponteiro pode ser usado explicitamente no corpo da função.
- #include<iostream>
- using namespace std;
- class Date
- {
- public:
- // void Init(Date* const this, int year, int month, int day)
- void Init(int year, int month, int day)
- {
- // 编译报错:error C2106: “=”: 左操作数必须为左值
- // this = nullptr;
- // this->_year = year;
- _year = year;
- this->_month = month;
- this->_day = day;
- }
- void Print()
- {
- cout << _year << "/" << _month << "/" << _day << endl;
- }
- private:
- // 这⾥只是声明,没有开空间
- int _year;
- int _month;
- int _day;
- };
- int main()
- {
- // Date类实例化出对象d1和d2
- Date d1;
- Date d2;
- d1.Init(2024, 7, 1); // d1.Init(&d1, 2024, 7, 1);
- d1.Print(); // d1.Print(&d1);
- d2.Init(2024, 7, 10); // d2.Init(&d2, 2024, 7, 10);
- d2.Print(); // d2.Print(&d2);
- return 0;
- }