English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C++ permite que umafunçãoEoperadorespecifica várias definições, chamadas deOverload de funçãoESobrecarga de Operadores.
Overload de declaração é uma declaração de função ou método que tem o mesmo nome que uma função ou método já declarado no escopo, mas suas listas de parâmetros e definição (implementação) são diferentes.
ao chamar umaOverload de funçãoouOverload de operadorao sobrecarregar, o compilador compara o tipo de parâmetro que você está usando com o tipo de parâmetro definido e decide qual definição é mais apropriada. O processo de seleção da função de overload mais apropriada ou do operador de overload é chamado deDecisão de overload.
Dentro do mesmo escopo, pode-se declarar várias funções com o mesmo nome que têm funcionalidades semelhantes, mas os parâmetros formais dessas funções iguais (referindo-se ao número, tipo ou ordem dos parâmetros) devem ser diferentes. Você não pode sobrecarregar funções apenas diferenciando-se pelo tipo de retorno.
O exemplo a seguir mostra funções com o mesmo nome print() usado para imprimir diferentes tipos de dados:
#include <iostream> using namespace std; class printData { public: void print(int i) cout << "Os números inteiros são: " << i << endl; } void print(double f) cout << "Os números de ponto flutuante são: " << f << endl; } void print(char c[]) cout << "A string é: " << c << endl; } }; int main(void) { printData pd; // Imprimir número inteiro pd.print(5); // Imprimir número de ponto flutuante pd.print(500.263); // Imprimir string char c[] = "Hello C++"; pd.print(c); return 0; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
Os números inteiros são: 5 Os números de ponto flutuante são: 500.263 A string é: Hello C++
Você pode redefinir ou sobrecarregar a maioria dos operadores C++ operadores integrados. Dessa forma, você pode usar operadores personalizados de tipos personalizados.
Os operadores sobrecarregados são funções com nomes especiais, cujo nome é composto pelo keyword operator seguido do símbolo do operador a ser sobrecarregado. Como outras funções, os operadores sobrecarregados têm um tipo de retorno e uma lista de parâmetros.
Box operador+(const Caixa&);
declara o operador de adição para somar dois objetos Caixa, retornando o objeto Caixa final. A maioria dos operadores sobrecarregados pode ser definida como função não membro comum ou como função membro da classe. Se definirmos a função acima como função não membro da classe, precisaremos passar dois parâmetros para cada operação, conforme mostrado a seguir:
Box operador+(const Caixa&, const Caixa&);
O exemplo a seguir usa funções de membros para demonstrar o conceito de sobrecarga de operadores. Aqui, o objeto é passado como parâmetro e suas propriedades são usadas this operadores para acessar, conforme mostrado a seguir:
#include <iostream> using namespace std; class Caixa { public: double getVolume(void) { return comprimento * largura * altura; } void setComprimento(double len) { comprimento = len; } void setLargura(double bre) { largura = bre; } void setHeight(double hei) { height = hei; } // sobre carga + usado para somar dois objetos Box Box operador+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // comprimento double breadth; // largura double height; // altura }; // função principal do programa int main( ) { Box Box1; // declaração Box1tipo de Box Box Box2; // declaração Box2tipo de Box Box Box3; // declaração Box3tipo de Box double volume = 0.0; // armazenar volume na variável // Box1 detalhamento Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 detalhamento Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 volume volume = Box1.getVolume(); cout << "Box1volume: " << volume << endl; // Box2 volume volume = Box2.getVolume(); cout << "Box2volume: " << volume << endl; // somar dois objetos, obter Box3 Box3 = Box1 + Box2; // Box3 volume volume = Box3.getVolume(); cout << "Box3volume: " << volume << endl; return 0; }
Quando o código acima for compilado e executado, ele produzirá o seguinte resultado:
Box1volume: 210 Box2volume: 1560 Box3volume: 5400
A lista de operadores sobrecarregáveis é a seguinte:
operadores aritméticos binários | + (adição),-(subtração),*(multiplicação),/(divisão), %(resto) |
operadores de comparação | == (igual), != (diferente), < (menor), > (maior), <= (menor ou igual), >= (maior ou igual) |
operadores lógicos | ||(ou lógico), &(e lógico), !(negação lógica) |
operadores unários | + (positivo),-(negativo),*(ponteiro), &(endereço) |
operadores de incrementação e decremento | ++(incremento),--(decremento) |
operadores bit a bit | |(ou bit a bit), &(e bit a bit), ~(negação bit a bit), ^(ou exclusivo bit a bit), <<(esquerda),>>(direita) |
operadores de atribuição | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= |
alocação e liberação de espaço | new, delete, new[], delete[] |
outros operadores | ()(chamada de função),-(acesso de membro),,(vírgula),[](índice) |
A lista de operadores não sobrecarregáveis é a seguinte:
.: Operador de Acesso a Membros
.*, ->*:: Operador de Acesso a Ponto de Membros
::: Operador de Domínio
sizeof: Operador de Tamanho
?:: Operador de Condição
#: Símbolo de Pré-processamento
A seguir são fornecidos exemplos de sobrecarga de operadores de variedades, para ajudar você a entender melhor o conceito de sobrecarga.