Estou iniciando aqui um estudo sobre construtores. Considere o programa e seus comentários, pois deles tirarei as perguntas. Os comentários são tirados do livro “C++ guia para iniciantes –Sdhild. Espero que minhas dúvidas sejam úteis para outros...
Neste tópico também colocarei algumas dúvidas sobre funções que se relacionarem com os programas. Considere o primeiro programa:
#include <iostream>
using namespace std;
class classe
{
int valor;
public:
classe (int i)
{
valor=i;
cout << "Dentro do construtor:\n";
}
~classe() {cout << "Destuindo:\n";}
int pegavalor() {return valor;}
};
void display (classe obj)
{
cout << obj.pegavalor() << "\n";
}
int main()
{
classe a(10);
cout << "valor ´a´ antes da chamada de display() ";
display(a);
cout << "Valor de ´a´ depois de display() retornar ";
display(a);
system ("pause");
return 0;
}
/* Como você pode ver, há uma chamada para o construtor (que ocorre
quando "a" é criado), mas há duas chamadas para o destrutor. Vamos ver
porque este é o caso.
Quando um objeto é passado para uma função, uma cópia daquele objeto é
feita,(e esta cópia se torna o parâmetro da função). Isto siguinifica
que um novo objeto passa há existir.Quando a função termina, a cópia
do argumento (ou seja, o parâmetro) é destruida. Isto levanta duas per-
guntas fundamentais: primeiro, o construtor do objeto é chamado quando
a cópia é feita ? segundo, o destrutor do objeto é chamado quando a
cópia é destruida ? as respostas a principio, surpreender você.
Quando uma cópia de um argumento é feita durante uma chamada de função,
o construtor normal não é chamado. Ao invés disto o construtor , o
costrutor de cópia do objeto é chamado. Um construtor de cópia define
como uma cópia de um objeto é feita. (...) No entanto, se uma classe
não definir explicitamente um construtor de cópia, então C++ fornece um
por default. O construtor de cópia default cria uma cópia de modo de
bit (ou seja identica) do objeto. A razão pela qual uma cópia de modo
de bit é feita é fácil de entender se você pensar a respeito. Como um
construtor normal é usado para inicializar algum aspecto de um objeto, ele
não deve ser chamado para fazer uma cópia de um objeto já
existente. Tal chamada alteraria o conteúdo do objeto. Ao passar
um objeto para uma função, você quer usar o estado atual do objeto, não
seu estado inicial.
No entanto,quando a função termina e a cópia do objeto usada como um
argumento é destruída, a função destrutor é chamada. Isto é necessário
porque o objeto saiu do escopo.É por isso que o programa anterior
tinha duas chamadas para o destruidor. A primeira foi quando o
parâmetro para display() saiu do escopo. A segunda foi quando "a" dentro
de main() foi destruída quando o programa terminou */
1 – Considerando,que ouve uma segunda chamada de construtor/destrutor defult, isso não explica como o construtor criado, foi ativado, pois dentro de main() não há nenhuma chamada tipo:
classe();
ou
~classe();
Como então construtores são ativados, independente de serem de cópia ? basta defini-los dentro da classe ?
2- Se eu defini-los como uma função de classe, ou seja,
classe:: classe()
{
var1=valor1;
var2=valor2;
};
e usar essas variáveis inicializadas no construtor, poderei usar diretamente em main(), sem precisar chamar o construtor. Pergunto: no caso de construtores como esse, que não são parametrizados, precisa de destrutor ?
3 – Considerando, que o construtor não é parametrizado, para ele destruir os objetos bastaria chamar o construtor vazio ou se deve mencionar as variáveis de alguma forma no destrutor ?
4- No programa acima, há funções como display(), que foram definidas fora da classe, e antes da função main(), percebi, que estas funções não precisam ter o protótipo citado, notei, que se eu declarar o protótipo antes do include, tipo:
void display (classe obj);
No programa acima, dará erro. Por que ? se estou informando o protótipo e o mesmo não está definido na classe. .
5- O curioso, é que se eu definir essa função abaixo de main(), com protótipo antes do include, e sem relaciona -las a classe, também dará erro. Por quê ? não teria que seguir as regras de C ?
6- O fato de display() não estar prototipada na classe, e ter sido implementada fora dela, indica que display() não é função membro, correto ?
Pergunta
Castro
:rolleyes:
Estou iniciando aqui um estudo sobre construtores. Considere o programa e seus comentários, pois deles tirarei as perguntas. Os comentários são tirados do livro “C++ guia para iniciantes –Sdhild. Espero que minhas dúvidas sejam úteis para outros...
Neste tópico também colocarei algumas dúvidas sobre funções que se relacionarem com os programas. Considere o primeiro programa:
1 – Considerando,que ouve uma segunda chamada de construtor/destrutor defult, isso não explica como o construtor criado, foi ativado, pois dentro de main() não há nenhuma chamada tipo: ou Como então construtores são ativados, independente de serem de cópia ? basta defini-los dentro da classe ? 2- Se eu defini-los como uma função de classe, ou seja, e usar essas variáveis inicializadas no construtor, poderei usar diretamente em main(), sem precisar chamar o construtor. Pergunto: no caso de construtores como esse, que não são parametrizados, precisa de destrutor ? 3 – Considerando, que o construtor não é parametrizado, para ele destruir os objetos bastaria chamar o construtor vazio ou se deve mencionar as variáveis de alguma forma no destrutor ? 4- No programa acima, há funções como display(), que foram definidas fora da classe, e antes da função main(), percebi, que estas funções não precisam ter o protótipo citado, notei, que se eu declarar o protótipo antes do include, tipo:No programa acima, dará erro. Por que ? se estou informando o protótipo e o mesmo não está definido na classe. .
5- O curioso, é que se eu definir essa função abaixo de main(), com protótipo antes do include, e sem relaciona -las a classe, também dará erro. Por quê ? não teria que seguir as regras de C ?
6- O fato de display() não estar prototipada na classe, e ter sido implementada fora dela, indica que display() não é função membro, correto ?
Obrigado
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.