Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso

Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso

Este tutorial demonstra como declarar e usar funções amigas e classes amigas em C++, completo com exemplos claros.

Ocultação de dados é uma pedra angular da programação orientada a objetos, impedindo código externo de acessar diretamente os membros privados de uma classe. Membros protegidos são visíveis apenas para classes derivadas e permanecem inacessíveis do mundo exterior.

Considere o seguinte exemplo:

class MyClass { private: int member1; }; int main() { MyClass obj; // Erro! Não pode acessar membros privados daqui. obj.member1 = 5; }

Apesar dessa restrição, C++ oferece um mecanismo chamado funções amigas que pode ignorar o controle de acesso usual e operar nos dados privados e protegidos de uma classe.

Uma classe amiga é um conceito semelhante, permitindo que uma classe inteira atue como amiga. Ambas as características são ferramentas poderosas quando usadas com juízo, aprimorando o encapsulamento sem comprometer a flexibilidade.


Função Amiga em C++

Uma função amiga pode ler e modificar membros privados e protegidos de uma classe. Ela é declarada com a palavra-chave friend dentro da definição da classe.

class ClassName { // ... friend returnType functionName(arguments); // ... }

Exemplo 1: Função Amiga Básica

// Programa C++ para demonstrar o funcionamento de função amiga #include <iostream> using namespace std; class Distance { private: int meter; // função amiga friend int addFive(Distance); public: Distance() : meter(0) {} }; // definição da função amiga int addFive(Distance d) { // acessando membros privados da função amiga d.meter += 5; return d.meter; } int main() { Distance D; cout << "Distância: " << addFive(D); return 0; }

Saída

Distância: 5

A função addFive() demonstra que uma função amiga pode acessar livremente o campo privado meter. Embora este exemplo seja simples, ilustra a ideia central de funções amigas.


Exemplo 2: Operando em Duas Classes

// Somar membros de duas classes diferentes usando funções amigas #include <iostream> using namespace std; // declaração antecipada class ClassB; class ClassA { public: // construtor para inicializar numA com 12 ClassA() : numA(12) {} private: int numA; // declaração de função amiga friend int add(ClassA, ClassB); }; class ClassB { public: // construtor para inicializar numB com 1 ClassB() : numB(1) {} private: int numB; // declaração de função amiga friend int add(ClassA, ClassB); }; // acessar membros de ambas as classes int add(ClassA objectA, ClassB objectB) { return (objectA.numA + objectB.numB); } int main() { ClassA objectA; ClassB objectB; cout << "Soma: " << add(objectA, objectB); return 0; }

Saída

Soma: 13

Neste programa, tanto ClassA quanto ClassB declararam a função add() como amiga. Isso concede à função acesso aos dados privados de ambas as classes, permitindo a soma de numA e numB.

Note que a declaração de amiga em ClassA referencia ClassB antes de ser definida. Uma declaração antecipada class ClassB; resolve essa dependência.


Classe Amiga em C++

Declarar uma classe inteira como amiga dá a todas as suas funções membro acesso aos membros privados e protegidos da classe hospedeira. A sintaxe é direta:

class ClassB; class ClassA { // ClassB é uma classe amiga de ClassA friend class ClassB; // ... } class ClassB { // ... }

Como ClassB é amiga de ClassA, qualquer método dentro de ClassB pode ler ou modificar livremente os dados privados de ClassA. O inverso não é verdadeiro; ClassA não pode acessar membros privados de ClassB a menos que declare ClassB como amiga.


Exemplo 3: Classe Amiga em Ação

// Programa C++ para demonstrar o funcionamento de classe amiga #include <iostream> using namespace std; // declaração antecipada class ClassB; class ClassA { private: int numA; // declaração de classe amiga friend class ClassB; public: // construtor para inicializar numA com 12 ClassA() : numA(12) {} }; class ClassB { private: int numB; public: // construtor para inicializar numB com 1 ClassB() : numB(1) {} // função membro para somar numA de ClassA e numB de ClassB int add() { ClassA objectA; return objectA.numA + numB; } }; int main() { ClassB objectB; cout << "Soma: " << objectB.add(); return 0; }

Saída

Soma: 13

O método add() em ClassB pode acessar o membro privado numA de ClassA porque ClassA declarou ClassB como amiga. Este exemplo mostra como classes amigas permitem cooperação estreita preservando o encapsulamento.

No geral, funções amigas e classes amigas são ferramentas valiosas em C++ quando você precisa de acesso controlado através de fronteiras de classe. Use-as com moderação e apenas quando o design se beneficiar de tais exceções às regras usuais de acesso.


Linguagem C

  1. Classes e Objetos em C#: Fundamentos para POO Robusta
  2. Dominando Classes e Métodos Abstratos em C#: Guia Prático
  3. Entendendo Classes e Métodos Parciais em C#
  4. Dominando Classes e Métodos Sealed em C#: Quando Usar, Exemplos Claros e Segurança de Código
  5. Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
  6. C++ Struct vs Class: Diferenças Principais, Sintaxe e Melhores Casos de Uso
  7. Dominando Java: Entendendo Objetos, Classes e Conceitos Fundamentais de POO
  8. Entendendo Classes de Armazenamento em C++: Escopo, Tempo de Vida e Uso
  9. Guia Completo de Data e Hora em C++
  10. Dominando Sobrecarga em C++: Funções e Operadores Explicados