Ir ao conteúdo
  • Cadastre-se

noçoes sobre sobrecarga de operadores


Cambalinho

Posts recomendados

eu ja pesquisei muito sobre sobrecarga de operadores e nada me explica o que preciso de entender :(

os exemplos falam da propria class e nao de 'entrada' e 'saida' da class :(

desculpem a pergunta: mas qual é a diferença entre estes 2:

nomedaclass(int val);
nomedaclass operator =(int val);

(e costumam usar o '&'(endereço) e nao entendi o porque)

...

aserio desculpem a pergunta, mas quero entender melhor isto da sobrecarga de operadores...

alem disso o construtor e a sobrecarga podem entrar em conflito?

Link para o comentário
Compartilhar em outros sites

nomedaclass(const nomedaclass& val);

O primeiro é um construtor de cópia, ele cria o objeto copiando o que veio por parâmetro.

nomedaclass& operator =(const nomedaclass& val);

O segundo é uma atribuição de cópia, ela copia o objeto que está sendo atribuído.

O problema é que as pessoas usam uma sintaxe errada para inicializar os objetos.

Desnecessário, atribuição em cópia depois da inicialização. Possível otimização do compilador para o caso 2.


CLASSE obj = obj2;

Inicialização em cópia.


CLASSE obj {obj2};

Para você brinca aí no seu compilador, coloque BREAKPOINTS e entenda o fluxo.


#include <iostream>

using namespace std;

class TT
{
int value;

public:
// Desnecessário, já é fornecido por padrão
TT(const TT& val)
{
value = val.value;
}

// Desnecessário, já é fornecido por padrão
TT& operator=(const TT& val)
{
value = val.value;

return *this;
}

// Somos obrigados a fornecer o construtor padrão, pois especificamos outras versões.
TT(int val) : value{ val } {};
};

int main(int argc, char** argv) {
TT obj{ 1 };

// Bom
TT obj2{ obj };

// Ruim, compilador otimiza para o caso acima, não chama operator= nos bons compiladores.
TT obj3 = obj;

TT obj4 = TT{ 2 };

TT obj5 = { 0 };

// Copia
obj5 = obj4;

return 0;
}

Link para o comentário
Compartilhar em outros sites

nomedaclass(const nomedaclass& val);

O primeiro é um construtor de cópia, ele cria o objeto copiando o que veio por parâmetro.

nomedaclass& operator =(const nomedaclass& val);

O segundo é uma atribuição de cópia, ela copia o objeto que está sendo atribuído.

O problema é que as pessoas usam uma sintaxe errada para inicializar os objetos.

Desnecessário, atribuição em cópia depois da inicialização. Possível otimização do compilador para o caso 2.


CLASSE obj = obj2;

Inicialização em cópia.


CLASSE obj {obj2};

Para você brinca aí no seu compilador, coloque BREAKPOINTS e entenda o fluxo.


#include <iostream>

using namespace std;

class TT
{
int value;

public:
// Desnecessário, já é fornecido por padrão
TT(const TT& val)
{
value = val.value;
}

// Desnecessário, já é fornecido por padrão
TT& operator=(const TT& val)
{
value = val.value;

return *this;
}

// Somos obrigados a fornecer o construtor padrão, pois especificamos outras versões.
TT(int val) : value{ val } {};
};

int main(int argc, char** argv) {
TT obj{ 1 };

// Bom
TT obj2{ obj };

// Ruim, compilador otimiza para o caso acima, não chama operator= nos bons compiladores.
TT obj3 = obj;

TT obj4 = TT{ 2 };

TT obj5 = { 0 };

// Copia
obj5 = obj4;

return 0;
}

muito obrigado pela explicaçao, mas usas-tes o operador de copia do construtor como todos os exemplos na net...

falame mais sobre entrada a saida de dados(int\strings\outros tipos) da class, para eu entender melhor sobre o construtor e o operador igual para estas situaçoes

Link para o comentário
Compartilhar em outros sites

Entenda que esse uso é completamente incorreto, outros não vão entender porque TT = "string".

Não é assim que se trata essas operações e sim com GET e SET.


#include <iostream>

using namespace std;

class TT
{
int value;
string str;
public:
TT(int value, const string& str)
{
this->value = value;
this->str = str;
}

TT& operator= (int value)
{
this->value = value;

return *this;
}

TT& operator= (const string& str)
{
this->str = str;

return *this;
}
};

int main(int argc, char** argv) {
TT obj { 1, "string" };

obj = 2;
obj = "changed";

return 0;
}

Link para o comentário
Compartilhar em outros sites

Entenda que esse uso é completamente incorreto, outros não vão entender porque TT = "string".

Não é assim que se trata essas operações e sim com GET e SET.


#include <iostream>

using namespace std;

class TT
{
int value;
string str;
public:
TT(int value, const string& str)
{
this->value = value;
this->str = str;
}

TT& operator= (int value)
{
this->value = value;

return *this;
}

TT& operator= (const string& str)
{
this->str = str;

return *this;
}
};

int main(int argc, char** argv) {
TT obj { 1, "string" };

obj = 2;
obj = "changed";

return 0;
}

muito obrigado pelo exemplo.

responde-me a mais 1 coisa que penso que esta incompleto ou talvez errado na minha class: eu só fiz contructores de entrada de dados, mas alem de poder usar o '(132)' ou '("sdafdsa") passo tambem usar o sinal de igual. os contrutores podem substituir o sinal de igual(falando em entrada para a class) ou nao?

Link para o comentário
Compartilhar em outros sites

muito obrigado pelo exemplo.

responde-me a mais 1 coisa que penso que esta incompleto ou talvez errado na minha class: eu só fiz contructores de entrada de dados, mas alem de poder usar o '(132)' ou '("sdafdsa") passo tambem usar o sinal de igual. os contrutores podem substituir o sinal de igual(falando em entrada para a class) ou nao?

Não, construtores apenas inicializam objetos.

Objetos já criados não podem ter seus construtores invocados, aí você precisa fornecer outros métodos.

No seu caso, espelhe os construtores nos assignments.

Link para o comentário
Compartilhar em outros sites

Não, construtores apenas inicializam objetos.

Objetos já criados não podem ter seus construtores invocados, aí você precisa fornecer outros métodos.

No seu caso, espelhe os construtores nos assignments.

desculpa se as perguntas foram muito basicas, mas como ja tinhas dado conta eu estava a precisar disto. muito obrigado por tudo

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...