Explicação detalhada do encapsulamento de dados C++ e estrutura de definição~

Nome: Pequeno Dongdong de Ah Yue

Página inicial do blog: O blog_CSDN de Xiaodongdong de Yue, conhecimento avançado do blog-python&&c++, essencial para o Ano Novo Chinês, blogueiro no campo da explicação do conhecimento C/C++

Índice

definir estrutura

membros da estrutura de acesso

Estruturas como argumentos de função

ponteiro para estrutura

palavra-chave typedef

Encapsulamento de dados C++

Exemplo de encapsulamento de dados

Estratégia de design

Classes e objetos C++

Definição de classe C++

Definir um objeto C++

acessar membros de dados

escreva no final


 

Primeiro introduza uma função de comparação de strings: strcmp(s1, s2), quando s1<s2, retorna um inteiro negativo; quando s1=s2, o valor de retorno é 0; quando s1>s2, retorna um inteiro positivo e uma função de cópia de String
: strcpy(a, b), significa copiar o valor da string b para a string a, é claro que o comprimento da string b não pode exceder a string a

definir estrutura

Para definir uma estrutura, você deve usar  a instrução struct  . A instrução struct define um novo tipo de dados que contém vários membros. O formato da instrução struct é o seguinte:

struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

type_name  é o nome do tipo de estrutura, member_type1 member_name1  é uma definição de variável padrão, como  int i;  ou  float f;  ou outras definições de variáveis ​​válidas. No final de uma definição de estrutura, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis ​​de estrutura, isso é opcional. O seguinte é para declarar um tipo de estrutura  Books , a variável é  book :

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

membros da estrutura de acesso

Para acessar os membros de uma estrutura, usamos o operador de acesso a membros (.) . O operador de acesso ao membro é um ponto entre o nome da variável da estrutura e o membro da estrutura que queremos acessar.

O exemplo a seguir demonstra o uso da estrutura:

#include <iostream>
#include <cstring>
 
using namespace std;
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
   // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 输出 Book1 信息
   cout << "第一本书标题 : " << Book1.title <<endl;
   cout << "第一本书作者 : " << Book1.author <<endl;
   cout << "第一本书类目 : " << Book1.subject <<endl;
   cout << "第一本书 ID : " << Book1.book_id <<endl;
 
   // 输出 Book2 信息
   cout << "第二本书标题 : " << Book2.title <<endl;
   cout << "第二本书作者 : " << Book2.author <<endl;
   cout << "第二本书类目 : " << Book2.subject <<endl;
   cout << "第二本书 ID : " << Book2.book_id <<endl;
 
   return 0;
}

O exemplo define o tipo de estrutura Books e suas duas variáveis ​​Book1 e Book2. Quando o código acima é compilado e executado, ele produz o seguinte resultado:

Título do primeiro livro: Tutorial C++ 
Autor do primeiro livro: Runoob 
Categoria do primeiro livro: Linguagem de programação 
ID do primeiro livro: 12345 
Título do segundo livro: Tutorial CSS 
Segundo livro Autor: Runoob 
Categoria do segundo livro: Tecnologia de front-end 
O segundo livro ID: 1234556

Estruturas como argumentos de função

Você pode usar uma estrutura como um parâmetro de função e o método de passagem de parâmetros é semelhante a outros tipos de variáveis ​​ou ponteiros. Você pode usar o exemplo acima para acessar variáveis ​​de estrutura:

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 输出 Book1 信息
   printBook( Book1 );
 
   // 输出 Book2 信息
   printBook( Book2 );
 
   return 0;
}
void printBook( struct Books book )
{
   cout << "书标题 : " << book.title <<endl;
   cout << "书作者 : " << book.author <<endl;
   cout << "书类目 : " << book.subject <<endl;
   cout << "书 ID : " << book.book_id <<endl;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:

Título do livro: C++ Tutorial 
Autor do livro: Runoob 
Categoria do livro: Linguagem de programação 
ID do livro: 12345 
Título do livro: Tutorial de CSS 
Autor do livro: Runoob 
Categoria do livro: Tecnologia Front-End 
ID do livro: 1234556

ponteiro para estrutura

Você pode definir ponteiros para estruturas de maneira semelhante a ponteiros para variáveis ​​de outros tipos, como segue:

struct Livros *struct_pointer;

Agora você pode armazenar o endereço da variável de estrutura na variável de ponteiro definida acima. Para encontrar o endereço de uma variável de estrutura, coloque o operador & na frente do nome da estrutura, assim:

struct_pointer = &Livro1;

Para acessar um membro de uma estrutura usando um ponteiro para essa estrutura, você deve usar o operador -> da seguinte maneira:

struct_pointer->título;

Vamos reescrever o exemplo acima usando ponteiros struct, isso ajudará você a entender o conceito de ponteiros struct:

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );
 
   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );
 
   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_id <<endl;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:

Título do livro: C++ Tutorial 
Autor do livro: Runoob 
Categoria do livro: Linguagem de programação 
ID do livro: 12345 
Título do livro: Tutorial de CSS 
Autor do livro: Runoob 
Categoria do livro: Tecnologia Front-End 
ID do livro: 1234556

palavra-chave typedef

Aqui está uma maneira mais simples de definir estruturas onde você pode "apelidar" o tipo que você cria. Por exemplo:

typedef struct Livros 
{ 
   char title[50]; 
   char autor[50]; 
   char assunto[100]; 
   int book_id; 
}Livros;

Agora, você pode usar  Books diretamente  para definir  variáveis ​​do tipo Books  sem usar a palavra-chave struct. Aqui está um exemplo:

Livros Livro1, Livro2;

Você pode usar  a  palavra-chave typedef para definir tipos não struct da seguinte forma:

typedef long int *pint32; 
 
pint32 x, y, z;

x, y e z são todos ponteiros para long int.

Encapsulamento de dados C++

Todos os programas C++ têm os dois elementos básicos a seguir:

  • Declarações do programa (código): são as partes do programa que executam ações e são chamadas de funções.
  • Dados do programa: Os dados são informações do programa e serão afetados pelas funções do programa.

O encapsulamento é um conceito em programação orientada a objetos que vincula dados e funções que manipulam dados, de modo que possam evitar interferências e uso indevido do mundo externo, garantindo assim a segurança. O encapsulamento de dados leva a outro conceito OOP importante, a ocultação de dados .

O encapsulamento de dados é um mecanismo que liga dados e funções que manipulam dados juntos, e a abstração de dados é um mecanismo que apenas expõe interfaces para usuários e oculta detalhes de implementação específicos.

C++ suporta encapsulamento e ocultação de dados (públicos, protegidos, privados) criando classes . Já sabemos que uma classe contém membros privados, membros protegidos e membros públicos. Por padrão, todos os itens definidos em uma classe são privados. Por exemplo:

class Box
{
   public:
      double getVolume(void)
      {
         return length * breadth * height;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

As variáveis ​​comprimento, largura e altura são todas privadas. Isso significa que eles só podem ser acessados ​​por outros membros da classe Box, não por outras partes do programa. Essa é uma maneira de obter o encapsulamento.

Para tornar os membros de uma classe públicos (ou seja, acessíveis a outras partes do programa), eles devem ser   declarados com a palavra-chave public antes deles. Todas as variáveis ​​ou funções definidas após o identificador público podem ser acessadas por todas as outras funções do programa.

Definir uma classe como uma classe amiga de outra classe expõe detalhes de implementação e reduz o encapsulamento. Idealmente, os detalhes de implementação de cada classe devem ser escondidos do mundo exterior tanto quanto possível.

Exemplo de encapsulamento de dados

Em um programa C++, qualquer classe com membros públicos e privados pode ser usada como uma instância de encapsulamento e abstração de dados. Veja o exemplo abaixo:

#include <iostream>
using namespace std;
 
class Adder{
   public:
      // 构造函数
      Adder(int i = 0)
      {
        total = i;
      }
      // 对外的接口
      void addNum(int number)
      {
          total += number;
      }
      // 对外的接口
      int getTotal()
      {
          return total;
      };
   private:
      // 对外隐藏的数据
      int total;
};
int main( )
{
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);
 
   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:

Total 60

A classe acima adiciona números e retorna a soma. Os membros públicos  addNum  e  getTotal  são interfaces externas e os usuários precisam conhecê-los para usar a classe. total de membros privados  está oculto do mundo exterior e os usuários não precisam saber sobre isso, mas é necessário para que a classe funcione corretamente.

Estratégia de design

Em circunstâncias normais, definiremos o estado do membro da classe como private (private), a menos que realmente precisemos expô-lo, para garantir um bom encapsulamento .

Isso geralmente se aplica a membros de dados, mas se aplica igualmente a todos os membros, incluindo funções virtuais.

Classes e objetos C++

C++ adiciona programação orientada a objetos à linguagem C, e C++ suporta programação orientada a objetos. As classes são um recurso central do C++ e geralmente são chamadas de tipos definidos pelo usuário.

Uma classe é usada para especificar a forma de um objeto e é um tipo de dados definido pelo usuário, que é uma combinação de dados e funções encapsulados. Os dados em uma classe são chamados de variáveis ​​de membro e as funções são chamadas de funções de membro. Uma classe pode ser considerada um modelo que pode ser usado para criar vários objetos com as mesmas propriedades e comportamento.

Definição de classe C++

Para definir uma classe, você precisa usar a palavra-chave class, então especificar o nome da classe, e o corpo da classe é colocado entre um par de chaves. O corpo contém as variáveis ​​de membro e as funções de membro da classe.

Definir uma classe é essencialmente um projeto para definir um tipo de dados, que define o que o objeto da classe inclui e quais operações podem ser executadas nesse objeto.

 No exemplo a seguir, usamos a palavra-chave  class  para definir o tipo de dados Box, que contém três variáveis ​​de membro comprimento, largura e altura:

class Box
{
   public:
      double length;   // 盒子的长度
      double breadth;  // 盒子的宽度
      double height;   // 盒子的高度
};

A palavra-chave  public  determina os atributos de acesso dos membros da classe. Dentro do escopo do objeto de classe, os membros públicos são acessíveis fora da classe. Você também pode especificar os membros da classe como  private  ou  protected , o que explicaremos mais adiante.

Definir um objeto C++

As classes fornecem o modelo para objetos, então, basicamente, os objetos são criados com base em classes. Objetos de classes são declarados como variáveis ​​de tipos primitivos. A declaração a seguir declara dois objetos da classe Box:

Box Box1; // Declara Box1, digita Box Box Box2; // Declara Box2, digita Box

Os objetos Box1 e Box2 têm seus respectivos membros de dados.

acessar membros de dados

Membros de dados públicos de objetos de uma classe podem ser acessados ​​usando o operador de acesso direto ao membro.

Para entender melhor esses conceitos, vamos tentar o seguinte exemplo:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
      // 成员函数声明
      double get(void);
      void set( double len, double bre, double hei );
};
// 成员函数定义
double Box::get(void)
{
    return length * breadth * height;
}
 
void Box::set( double len, double bre, double hei)
{
    length = len;
    breadth = bre;
    height = hei;
}
int main( )
{
   Box Box1;        // 声明 Box1,类型为 Box
   Box Box2;        // 声明 Box2,类型为 Box
   Box Box3;        // 声明 Box3,类型为 Box
   double volume = 0.0;     // 用于存储体积
 
   // box 1 详述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;
 
   // box 2 详述
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;
 
   // box 1 的体积
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的体积:" << volume <<endl;
 
   // box 2 的体积
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Box2 的体积:" << volume <<endl;
 
 
   // box 3 详述
   Box3.set(16.0, 8.0, 12.0); 
   volume = Box3.get(); 
   cout << "Box3 的体积:" << volume <<endl;
   return 0;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado:

Volume da Caixa1: 210 
Volume da Caixa2: 1560 
Volume da Caixa3: 1536

Observe que membros privados e protegidos não podem ser acessados ​​diretamente usando o operador de acesso de membro direto (.). Aprenderemos como acessar membros privados e protegidos em tutoriais subsequentes.

escreva no final

Febre, desconfortável, mas como não posto blog há muito tempo, peguei minhas anotações da aula e fui dormir, tchau

Acho que você gosta

Origin blog.csdn.net/m0_64122244/article/details/130657265
Recomendado
Clasificación