Ponteiros e Referências
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 13 de 104.
Agora que você entende a memória da pilha e do heap, vamos explorar as ferramentas que permitem trabalhar diretamente com locais de memória: ponteiros e referências.
Um ponteiro armazena o endereço de memória de outra variável. Você o declara com * e obtém um endereço usando &.
int value = 42;
int* ptr = &value; // ptr armazena o endereço de value
std::cout << ptr; // Imprime o endereço de memória
std::cout << *ptr; // Desreferencia: imprime 42Uma referência é um alias para uma variável existente. Depois de vinculada, ela sempre se refere a essa variável. Você a declara com &.
int value = 42;
int& ref = value; // ref é um alias para value
ref = 100; // Altera value para 100
std::cout << value; // Imprime 100Principais diferenças:
| Ponteiros | Referências |
|---|---|
| Podem ser nulos | Devem ser inicializadas |
| Podem ser reatribuídos | Não podem ser religadas |
Use * para acessar o valor | Acesse o valor diretamente |
| Podem apontar para nada | Sempre válidas |
Ambos são essenciais para passar objetos para funções com eficiência, sem fazer cópias, e para trabalhar com memória alocada no heap. As referências são mais seguras e simples, enquanto os ponteiros oferecem mais flexibilidade quando você precisa reatribuir ou verificar se há um valor nulo.
Desafio
FácilVamos criar um sistema simples de manipulação de valores que demonstra como ponteiros e referências funcionam de maneira diferente ao modificar dados.
Você criará dois arquivos para organizar seu código:
ValueOps.h: defina três funções que modificam valores inteiros de maneiras diferentes:doubleByPointer(int* ptr): recebe um ponteiro e dobra o valor para o qual ele apontatripleByReference(int& ref): recebe uma referência e triplica o valorswapValues(int* a, int* b): recebe dois ponteiros e troca os valores para os quais eles apontam
main.cpp: leia dois inteiros da entrada e demonstre ponteiros e referências:- Imprima os valores originais:
"Original: <first> <second>" - Use
doubleByPointerno primeiro valor e, em seguida, imprima:"After double: <first>" - Use
tripleByReferenceno segundo valor e, em seguida, imprima:"After triple: <second>" - Use
swapValuespara trocar os dois valores e, em seguida, imprima:"After swap: <first> <second>"
- Imprima os valores originais:
Ao chamar funções com ponteiros, lembre-se de usar o operador de endereço (&) para passar o endereço da variável. As referências funcionam de maneira mais natural: basta passar a variável diretamente.
Inclua seu arquivo de cabeçalho em main.cpp usando #include "ValueOps.h".
Experimente você mesmo
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// Leia dois inteiros da entrada
int first, second;
cin >> first;
cin >> second;
// Imprima os valores originais
cout << "Original: " << first << " " << second << endl;
// TODO: Use doubleByPointer no primeiro valor (passe o endereço usando &)
// TODO: Imprima após dobrar
// TODO: Use tripleByReference no segundo valor (passe a variável diretamente)
// TODO: Imprima após triplicar
// TODO: Use swapValues para trocar ambos os valores (passe os endereços usando &)
// TODO: Imprima após a troca
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online