Criar Classes e Objetos em C++

C++Beginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como criar classes e objetos na programação C++. Você definirá classes com membros de dados privados (private data members), implementará funções membro públicas (public member functions), criará construtores com diferentes parâmetros, escreverá destrutores para limpeza de recursos, usará especificadores de acesso (access specifiers), implementará herança entre classes, sobrescreverá métodos da classe base (base class methods), criará funções friend para controle de acesso e usará membros e métodos estáticos. Esses conceitos são fundamentais para a programação orientada a objetos em C++ e fornecerão uma base sólida para a construção de aplicações mais complexas.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 85%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Definir Classe com Membros de Dados Privados

Uma classe em C++ é um modelo para criar objetos. Ela define um conjunto de propriedades (membros de dados) e métodos (funções membro) que os objetos criados a partir da classe terão. As classes ajudam a organizar o código e a implementar princípios de programação orientada a objetos, como encapsulamento, herança e polimorfismo.

A sintaxe básica para definir uma classe em C++ é a seguinte:

class ClassName {
private:
    // Private data members
    int dataMember1;
    std::string dataMember2;

public:
    // Public member functions
    void memberFunction1();
    int memberFunction2();
};

Existem três especificadores de acesso em C++ que controlam a visibilidade e a acessibilidade dos membros da classe:

  • private: Membros declarados como privados são acessíveis apenas dentro da classe.
  • public: Membros declarados como públicos são acessíveis de fora da classe.
  • protected: Membros declarados como protegidos são acessíveis dentro da classe e por instâncias de classes derivadas.

Nesta etapa, você aprenderá como definir uma classe com membros de dados privados em C++. Membros de dados privados são um conceito essencial na programação orientada a objetos que ajuda a encapsular e proteger o estado interno de um objeto.

Primeiro, abra o WebIDE e navegue até o diretório ~/project. Crie um novo arquivo chamado student.cpp:

touch ~/project/student.cpp

Abra o arquivo student.cpp no WebIDE e adicione o seguinte código para definir uma classe Student com membros de dados privados:

#include <iostream>
#include <string>

class Student {
private:
    // Private data members
    std::string name;
    int age;
    double gpa;

public:
    // We'll add methods to interact with these private members in later steps
    void displayInfo() {
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
        std::cout << "GPA: " << gpa << std::endl;
    }
};

int main() {
    Student student;
    // Note: We can't directly access private members
    // student.name = "John"; // This would cause a compilation error

    student.displayInfo();
    return 0;
}

Vamos detalhar os conceitos-chave:

  1. Membros de Dados Privados:

    • Declarados usando o especificador de acesso private:
    • Não podem ser acessados diretamente de fora da classe
    • Fornecem proteção de dados e encapsulamento
  2. Tipos de Dados:

    • std::string name: Armazena o nome do aluno
    • int age: Armazena a idade do aluno
    • double gpa: Armazena a média geral do aluno
  3. Encapsulamento:

    • Membros privados só podem ser acessados através de métodos públicos
    • Impede a modificação direta de dados internos

Compile o programa:

g++ student.cpp -o student
./student

Exemplo de saída ao executar o programa:

Name:
Age: 0
GPA: 0

Pontos chave:

  • Membros privados são ocultos do acesso externo
  • Eles só podem ser modificados através de métodos da classe
  • Isso ajuda a manter a integridade e o controle dos dados

Implementar Funções Membro Públicas

Nesta etapa, você aprenderá como implementar funções membro públicas em C++. Funções membro públicas permitem acesso controlado a membros de dados privados e fornecem maneiras de interagir com objetos de classe.

Abra o arquivo student.cpp no WebIDE e modifique a classe Student para incluir funções membro públicas:

#include <iostream>
#include <string>

class Student {
private:
    std::string name;
    int age;
    double gpa;

public:
    // Setter methods to modify private data members
    void setName(std::string studentName) {
        name = studentName;
    }

    void setAge(int studentAge) {
        if (studentAge > 0 && studentAge < 120) {
            age = studentAge;
        } else {
            std::cout << "Invalid age!" << std::endl;
        }
    }

    void setGPA(double studentGPA) {
        if (studentGPA >= 0.0 && studentGPA <= 4.0) {
            gpa = studentGPA;
        } else {
            std::cout << "Invalid GPA!" << std::endl;
        }
    }

    // Getter methods to access private data members
    std::string getName() {
        return name;
    }

    int getAge() {
        return age;
    }

    double getGPA() {
        return gpa;
    }

    // Display method to print student information
    void displayInfo() {
        std::cout << "Student Information:" << std::endl;
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
        std::cout << "GPA: " << gpa << std::endl;
    }
};

int main() {
    Student student;

    // Using public member functions to set and get data
    student.setName("Alice Johnson");
    student.setAge(20);
    student.setGPA(3.75);

    // Display student information
    student.displayInfo();

    // Demonstrate getter methods
    std::cout << "\nStudent Name: " << student.getName() << std::endl;
    std::cout << "Student Age: " << student.getAge() << std::endl;
    std::cout << "Student GPA: " << student.getGPA() << std::endl;

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Student Information:
Name: Alice Johnson
Age: 20
GPA: 3.75

Student Name: Alice Johnson
Student Age: 20
Student GPA: 3.75

Pontos chave sobre funções membro públicas:

  • Fornecem acesso controlado a membros de dados privados
  • Setters permitem modificação com validação
  • Getters permitem a leitura de dados privados
  • Ajudam a manter o encapsulamento e a integridade dos dados

Criar Construtores com Diferentes Parâmetros

Nesta etapa, você aprenderá como criar construtores com diferentes parâmetros em C++. Construtores são funções membro especiais que inicializam objetos quando eles são criados.

Abra o arquivo student.cpp no WebIDE e modifique a classe Student para incluir múltiplos construtores:

#include <iostream>
#include <string>

class Student {
private:
    std::string name;
    int age;
    double gpa;

public:
    // Default constructor
    Student() {
        name = "Unknown";
        age = 0;
        gpa = 0.0;
    }

    // Constructor with name parameter
    Student(std::string studentName) {
        name = studentName;
        age = 0;
        gpa = 0.0;
    }

    // Constructor with name and age parameters
    Student(std::string studentName, int studentAge) {
        name = studentName;
        age = studentAge;
        gpa = 0.0;
    }

    // Full constructor with all parameters
    Student(std::string studentName, int studentAge, double studentGPA) {
        name = studentName;
        age = studentAge;
        gpa = studentGPA;
    }

    // Display method to print student information
    void displayInfo() {
        std::cout << "Student Information:" << std::endl;
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
        std::cout << "GPA: " << gpa << std::endl;
    }
};

int main() {
    // Using different constructors
    Student student1;  // Default constructor
    Student student2("Alice Johnson");  // Constructor with name
    Student student3("Bob Smith", 22);  // Constructor with name and age
    Student student4("Charlie Brown", 20, 3.75);  // Full constructor

    std::cout << "Student 1:" << std::endl;
    student1.displayInfo();

    std::cout << "\nStudent 2:" << std::endl;
    student2.displayInfo();

    std::cout << "\nStudent 3:" << std::endl;
    student3.displayInfo();

    std::cout << "\nStudent 4:" << std::endl;
    student4.displayInfo();

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Student 1:
Student Information:
Name: Unknown
Age: 0
GPA: 0

Student 2:
Student Information:
Name: Alice Johnson
Age: 0
GPA: 0

Student 3:
Student Information:
Name: Bob Smith
Age: 22
GPA: 0

Student 4:
Student Information:
Name: Charlie Brown
Age: 20
GPA: 3.75

Pontos chave sobre construtores:

  • Construtores têm o mesmo nome da classe
  • Eles inicializam os membros de dados do objeto
  • Podem ter múltiplos construtores com diferentes parâmetros
  • Chamados automaticamente quando um objeto é criado

Escrever Destrutor para Limpeza de Recursos

Nesta etapa, você aprenderá sobre destrutores em C++, que são funções membro especiais responsáveis por limpar recursos quando um objeto é destruído. Demonstraremos como escrever um destrutor e entender sua importância no gerenciamento de memória.

Abra o arquivo student.cpp no WebIDE e modifique o código para incluir um destrutor e alocação de memória dinâmica:

#include <iostream>
#include <string>

class Student {
private:
    std::string name;
    int age;
    double gpa;
    char* dynamicBuffer;  // Simulating dynamic memory allocation

public:
    // Constructors
    Student() {
        name = "Unknown";
        age = 0;
        gpa = 0.0;
        dynamicBuffer = new char[50];  // Allocate dynamic memory
        std::cout << "Default Constructor Called" << std::endl;
    }

    Student(std::string studentName) : name(studentName), age(0), gpa(0.0) {
        dynamicBuffer = new char[50];
        std::cout << "Parameterized Constructor Called" << std::endl;
    }

    // Destructor
    ~Student() {
        // Clean up dynamically allocated memory
        delete[] dynamicBuffer;
        std::cout << "Destructor Called for " << name << std::endl;
    }

    void displayInfo() {
        std::cout << "Student Information:" << std::endl;
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
        std::cout << "GPA: " << gpa << std::endl;
    }
};

int main() {
    // Demonstrating object creation and destruction
    {
        std::cout << "Creating first student:" << std::endl;
        Student student1("Alice Johnson");
        student1.displayInfo();

        std::cout << "\nCreating second student:" << std::endl;
        Student student2("Bob Smith");
        student2.displayInfo();
    }  // Objects go out of scope here, destructors are called

    std::cout << "\nExiting main function" << std::endl;
    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Creating first student:
Parameterized Constructor Called
Student Information:
Name: Alice Johnson
Age: 0
GPA: 0

Creating second student:
Parameterized Constructor Called
Student Information:
Name: Bob Smith
Age: 0
GPA: 0

Destructor Called for Bob Smith
Destructor Called for Alice Johnson

Exiting main function

Pontos chave sobre destrutores:

  • Definidos com ~ seguido pelo nome da classe
  • Chamados automaticamente quando um objeto é destruído
  • Usados para liberar recursos alocados dinamicamente
  • Ajuda a prevenir vazamentos de memória
  • Sem tipo de retorno e sem parâmetros

Características importantes do destrutor:

  • Chamado quando o objeto sai do escopo
  • Invocado automaticamente pelo compilador
  • Crucial para limpar a memória dinâmica
  • Ajuda a gerenciar recursos do sistema de forma eficiente

Usar Especificadores de Acesso (public, private, protected)

Nesta etapa, você aprenderá sobre especificadores de acesso em C++ e como eles controlam a visibilidade e acessibilidade dos membros da classe. Exploraremos as diferenças entre os níveis de acesso public, private e protected.

Abra o arquivo student.cpp no WebIDE e modifique o código para demonstrar os especificadores de acesso:

#include <iostream>
#include <string>

class Student {
private:
    // Private members: accessible only within the class
    std::string name;
    int age;
    double gpa;

protected:
    // Protected members: accessible within the class and its derived classes
    std::string school;

public:
    // Public members: accessible from anywhere
    Student(std::string studentName, int studentAge, double studentGPA) {
        name = studentName;
        age = studentAge;
        gpa = studentGPA;
        school = "Default School";
    }

    // Public method to demonstrate access to private members
    void displayInfo() {
        std::cout << "Student Information:" << std::endl;
        std::cout << "Name: " << name << std::endl;  // Accessing private member
        std::cout << "Age: " << age << std::endl;
        std::cout << "GPA: " << gpa << std::endl;
        std::cout << "School: " << school << std::endl;
    }

    // Public method to modify private members
    void updateGPA(double newGPA) {
        if (newGPA >= 0.0 && newGPA <= 4.0) {
            gpa = newGPA;
        }
    }
};

class GraduateStudent : public Student {
public:
    GraduateStudent(std::string name, int age, double gpa)
        : Student(name, age, gpa) {
        // Can access protected 'school' member from base class
        school = "Graduate School";
    }

    void displaySchool() {
        std::cout << "School: " << school << std::endl;
    }
};

int main() {
    Student student("Alice Johnson", 20, 3.75);
    student.displayInfo();  // Public method accessing private members

    // Uncommenting the lines below would cause compilation errors
    // student.name = "John";  // Error: Cannot access private member
    // student.age = 25;       // Error: Cannot access private member

    student.updateGPA(3.90);  // Modifying private member through public method
    student.displayInfo();

    GraduateStudent gradStudent("Bob Smith", 25, 3.90);
    gradStudent.displayInfo();
    gradStudent.displaySchool();

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Student Information:
Name: Alice Johnson
Age: 20
GPA: 3.75
School: Default School
Student Information:
Name: Alice Johnson
Age: 20
GPA: 3.90
School: Default School
Student Information:
Name: Bob Smith
Age: 25
GPA: 3.90
School: Graduate School
School: Graduate School

Pontos chave sobre especificadores de acesso:

  • private: Membros são acessíveis apenas dentro da mesma classe
  • protected: Membros são acessíveis dentro da classe e suas classes derivadas
  • public: Membros são acessíveis de qualquer lugar
  • Ajudam a controlar o acesso aos dados e a manter o encapsulamento

Implementar Herança entre Classes

Nesta etapa, você aprenderá sobre herança em C++, um conceito fundamental da programação orientada a objetos que permite criar novas classes com base em classes existentes.

Abra o arquivo student.cpp no WebIDE e modifique o código para demonstrar a herança:

#include <iostream>
#include <string>

// Base class
class Person {
protected:
    std::string name;
    int age;

public:
    // Constructor
    Person(std::string personName, int personAge) {
        name = personName;
        age = personAge;
    }

    // Method to display basic information
    void displayInfo() {
        std::cout << "Name: " << name << std::endl;
        std::cout << "Age: " << age << std::endl;
    }
};

// Derived class: Student inherits from Person
class Student : public Person {
private:
    double gpa;
    std::string major;

public:
    // Constructor that calls base class constructor
    Student(std::string studentName, int studentAge, double studentGPA, std::string studentMajor)
        : Person(studentName, studentAge) {
        gpa = studentGPA;
        major = studentMajor;
    }

    // Additional method specific to Student
    void displayStudentInfo() {
        // Calling base class method
        displayInfo();
        std::cout << "GPA: " << gpa << std::endl;
        std::cout << "Major: " << major << std::endl;
    }
};

// Another derived class: Employee inherits from Person
class Employee : public Person {
private:
    std::string company;
    double salary;

public:
    // Constructor that calls base class constructor
    Employee(std::string employeeName, int employeeAge, std::string employeeCompany, double employeeSalary)
        : Person(employeeName, employeeAge) {
        company = employeeCompany;
        salary = employeeSalary;
    }

    // Additional method specific to Employee
    void displayEmployeeInfo() {
        // Calling base class method
        displayInfo();
        std::cout << "Company: " << company << std::endl;
        std::cout << "Salary: $" << salary << std::endl;
    }
};

int main() {
    // Creating objects of derived classes
    Student student("Alice Johnson", 20, 3.75, "Computer Science");
    std::cout << "Student Information:" << std::endl;
    student.displayStudentInfo();

    std::cout << "\n";

    Employee employee("Bob Smith", 35, "Tech Corp", 75000.0);
    std::cout << "Employee Information:" << std::endl;
    employee.displayEmployeeInfo();

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Student Information:
Name: Alice Johnson
Age: 20
GPA: 3.75
Major: Computer Science

Employee Information:
Name: Bob Smith
Age: 35
Company: Tech Corp
Salary: $75000

Pontos chave sobre herança:

  • Classe base (Person) contém atributos comuns
  • Classes derivadas (Student, Employee) herdam da classe base
  • Use : public BaseClassName para herdar
  • Pode adicionar novos atributos e métodos nas classes derivadas
  • Pode usar métodos da classe base nas classes derivadas

Sobrescrever Métodos da Classe Base

Nesta etapa, você aprenderá como sobrescrever métodos da classe base em C++, permitindo que as classes derivadas forneçam sua própria implementação de métodos herdados da classe base.

Abra o arquivo student.cpp no WebIDE e modifique o código para demonstrar a sobrescrita de métodos:

#include <iostream>
#include <string>

class Animal {
protected:
    std::string name;

public:
    Animal(std::string animalName) : name(animalName) {}

    // Virtual keyword allows method to be overridden
    virtual void makeSound() {
        std::cout << "Some generic animal sound" << std::endl;
    }

    // Virtual method for displaying information
    virtual void displayInfo() {
        std::cout << "Animal Name: " << name << std::endl;
    }
};

class Dog : public Animal {
private:
    std::string breed;

public:
    Dog(std::string dogName, std::string dogBreed)
        : Animal(dogName), breed(dogBreed) {}

    // Override makeSound method
    void makeSound() override {
        std::cout << "Woof! Woof!" << std::endl;
    }

    // Override displayInfo method
    void displayInfo() override {
        // Call base class method first
        Animal::displayInfo();
        std::cout << "Breed: " << breed << std::endl;
    }
};

class Cat : public Animal {
private:
    std::string color;

public:
    Cat(std::string catName, std::string catColor)
        : Animal(catName), color(catColor) {}

    // Override makeSound method
    void makeSound() override {
        std::cout << "Meow! Meow!" << std::endl;
    }

    // Override displayInfo method
    void displayInfo() override {
        // Call base class method first
        Animal::displayInfo();
        std::cout << "Color: " << color << std::endl;
    }
};

int main() {
    // Create animal objects
    Animal genericAnimal("Generic Animal");
    Dog myDog("Buddy", "Labrador");
    Cat myCat("Whiskers", "Orange");

    // Demonstrate polymorphic behavior
    std::cout << "Generic Animal:" << std::endl;
    genericAnimal.displayInfo();
    genericAnimal.makeSound();

    std::cout << "\nDog:" << std::endl;
    myDog.displayInfo();
    myDog.makeSound();

    std::cout << "\nCat:" << std::endl;
    myCat.displayInfo();
    myCat.makeSound();

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Generic Animal:
Animal Name: Generic Animal
Some generic animal sound

Dog:
Animal Name: Buddy
Breed: Labrador
Woof! Woof!

Cat:
Animal Name: Whiskers
Color: Orange
Meow! Meow!

Pontos chave sobre a sobrescrita de métodos:

  • Use a palavra-chave virtual na classe base para habilitar a sobrescrita
  • Use a palavra-chave override na classe derivada para sobrescrever explicitamente
  • Pode chamar o método da classe base usando BaseClass::method()
  • Permite diferentes implementações para o mesmo método
  • Habilita o comportamento polimórfico

Criar Funções Friend para Controle de Acesso

Nesta etapa, você aprenderá sobre funções amigas (friend functions) em C++, que permitem que funções externas ou outras classes acessem membros privados e protegidos de uma classe.

Abra o arquivo student.cpp no WebIDE e modifique o código para demonstrar funções amigas:

#include <iostream>
#include <string>

class BankAccount {
private:
    std::string accountHolder;
    double balance;

    // Declare friend functions
    friend void displayAccountDetails(const BankAccount& account);
    friend class AccountManager;

public:
    // Constructor
    BankAccount(std::string name, double initialBalance) {
        accountHolder = name;
        balance = initialBalance;
    }

    // Method to deposit money
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
};

// Friend function that can access private members
void displayAccountDetails(const BankAccount& account) {
    std::cout << "Account Holder: " << account.accountHolder << std::endl;
    std::cout << "Current Balance: $" << account.balance << std::endl;
}

// Friend class that can access private members
class AccountManager {
public:
    // Method that can access private members of BankAccount
    void transferFunds(BankAccount& from, BankAccount& to, double amount) {
        if (from.balance >= amount) {
            from.balance -= amount;
            to.balance += amount;
            std::cout << "Transfer successful!" << std::endl;
        } else {
            std::cout << "Insufficient funds!" << std::endl;
        }
    }
};

int main() {
    // Create bank accounts
    BankAccount account1("Alice Johnson", 1000.0);
    BankAccount account2("Bob Smith", 500.0);

    // Use friend function to display account details
    std::cout << "Account 1 Details:" << std::endl;
    displayAccountDetails(account1);

    std::cout << "\nAccount 2 Details:" << std::endl;
    displayAccountDetails(account2);

    // Use friend class to transfer funds
    AccountManager manager;
    std::cout << "\nTransferring $200 from Alice to Bob:" << std::endl;
    manager.transferFunds(account1, account2, 200.0);

    std::cout << "\nUpdated Account Details:" << std::endl;
    displayAccountDetails(account1);
    displayAccountDetails(account2);

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

Account 1 Details:
Account Holder: Alice Johnson
Current Balance: $1000

Account 2 Details:
Account Holder: Bob Smith
Current Balance: $500

Transferring $200 from Alice to Bob:
Transfer successful!

Updated Account Details:
Account Holder: Alice Johnson
Current Balance: $800
Account Holder: Bob Smith
Current Balance: $700

Pontos chave sobre funções amigas:

  • Declaradas usando a palavra-chave friend
  • Podem acessar membros privados e protegidos de uma classe
  • Declaradas dentro da definição da classe
  • Podem ser funções individuais ou classes inteiras
  • Quebram a encapsulação, portanto, use com moderação

Utilizar Membros e Métodos Estáticos

Nesta etapa, você aprenderá sobre membros e métodos estáticos em C++, que são compartilhados entre todas as instâncias de uma classe e pertencem à própria classe, em vez de objetos individuais.

Abra o arquivo student.cpp no WebIDE e modifique o código para demonstrar membros e métodos estáticos:

#include <iostream>
#include <string>

class University {
private:
    std::string name;
    static int totalStudents;  // Static member variable
    static double totalTuition;  // Another static member variable

public:
    // Constructor
    University(std::string universityName) : name(universityName) {}

    // Method to add students
    void addStudents(int count) {
        totalStudents += count;
    }

    // Method to add tuition
    void addTuition(double amount) {
        totalTuition += amount;
    }

    // Static method to display total students
    static void displayTotalStudents() {
        std::cout << "Total Students Across All Universities: "
                  << totalStudents << std::endl;
    }

    // Static method to display total tuition
    static void displayTotalTuition() {
        std::cout << "Total Tuition Collected: $"
                  << totalTuition << std::endl;
    }

    // Static method to calculate average tuition
    static double calculateAverageTuition() {
        return (totalStudents > 0) ?
               (totalTuition / totalStudents) : 0.0;
    }
};

// Initialize static member variables outside the class
int University::totalStudents = 0;
double University::totalTuition = 0.0;

int main() {
    // Create university objects
    University harvard("Harvard University");
    University mit("MIT");
    University stanford("Stanford University");

    // Add students and tuition
    harvard.addStudents(5000);
    harvard.addTuition(75000000.0);

    mit.addStudents(4500);
    mit.addTuition(65000000.0);

    stanford.addStudents(4200);
    stanford.addTuition(60000000.0);

    // Call static methods directly on the class
    std::cout << "University Statistics:" << std::endl;
    University::displayTotalStudents();
    University::displayTotalTuition();

    // Calculate and display average tuition
    std::cout << "Average Tuition per Student: $"
              << University::calculateAverageTuition() << std::endl;

    return 0;
}

Compile e execute o programa:

g++ student.cpp -o student
./student

Exemplo de saída:

University Statistics:
Total Students Across All Universities: 13700
Total Tuition Collected: $2e+08
Average Tuition per Student: $14598.5

Pontos chave sobre membros e métodos estáticos:

  • Compartilhados entre todas as instâncias de uma classe
  • Declarados usando a palavra-chave static
  • Podem ser acessados sem criar um objeto
  • Pertencem à classe, não a objetos individuais
  • Úteis para rastrear informações em toda a classe

Resumo

Neste laboratório, você aprendeu como definir uma classe com membros de dados privados, que é um conceito essencial na programação orientada a objetos. Membros de dados privados ajudam a encapsular e proteger o estado interno de um objeto. Você também aprendeu sobre a importância das funções membro públicas, que permitem o acesso controlado aos membros de dados privados. Isso ajuda a manter a integridade e o controle dos dados. Além disso, você explorou o uso de construtores, destrutores, especificadores de acesso, herança, sobrescrita de métodos (method overriding), funções amigas (friend functions) e membros e métodos estáticos, todos os quais são princípios fundamentais da programação orientada a objetos em C++.