C++ – Inicialização de membros em construtores

A inicialização dos membros de uma classe não é permitida na definição da mesma.
Isto significa que, no exemplo da classe Ponto, seria impossível escrever x=0 e y=0 (ver linhas 14 e 15 de ponto.h):

ponto.h

#ifndef PONTO_H
#define PONTO_H

class Ponto
{
public:
	Ponto();
	double getX();
	double getY();
	void setX(double);
	void setY(double);

private:
	double x=0;
	double y=0;
};

#endif //PONTO_H


ponto.cpp

#include "ponto.h"

Ponto::Ponto()
{
	x = 0.0;
	y = 0.0;
}

double Ponto::getX()
{
	return x;
}

double Ponto::getY()
{
	return y;
}

void Ponto::setX(double novo)
{
	x = novo;
}

void Ponto::setY(double novo)
{
	y = novo;
}

main.cpp

#include
#include "ponto.h"

int main()
{
	Ponto p1;
	std::cout << "(" << p1.getX() << "," << p1.getY()<< ")" << std::endl;
}

Não sendo possível inicializar os membros de uma classe na sua definição, podemos sempre recorrer ao construtor da mesma.

No exemplo anterior, basta remover a inicialização dos membros privados para conseguirmos compilar com sucesso.

#ifndef PONTO_H
#define PONTO_H

class Ponto
{
public:
Ponto();

private:
double x;
double y;
};
#endif //PONTO_H

No entanto, a linguagem C++ permite contornar esta limitação, recorrendo a uma lista inicializadora de membros.

Esta representa um tipo especial de construtor, que permite  inicializar os membros dado de uma classe.

Segue-se um exemplo completo que, comparativamente com o anterior, recorre a uma lista inicializadora de membros.

ponto.h
#ifndef PONTO_H
#define PONTO_H

class Ponto
{
public:
	Ponto();
	double getX();
	double getY();
	void setX(double);
	void setY(double);

private:
	double x;
	double y;
};

#endif //PONTO_H

ponto.cpp

#include "ponto.h"

Ponto::Ponto(): x(0), y(0)
{
	// Mais código relativo à construção do objeto
}

double Ponto::getX()
{
	return x;
}

double Ponto::getY()
{
	return y;
}

void Ponto::setX(double novo)
{
	x = novo;
}

void Ponto::setY(double novo)
{
	y = novo;
}

main.cpp

#include
#include "ponto.h"

int main()
{
	Ponto p1;
	std::cout << "(" << p1.getX() << "," << p1.getY()<< ")" << std::endl;
}

Baixar exemplo

Para aprofundar este assunto consultem, por exemplo, este artigo:

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s