// cliString.cpp
// Cliente da Variação 2 sobre a Versão 1 de cString  ( Implementação 1 )
// 7 de Novembro de 2000


#include <iostream.h>
#include "cString.h"


void main()
{
	char *str1 = "Santarem";
	char data[] = "7 de Novembro de 2000";
	char aula[] = "LP1";

	cString s1, s2, s3;

	// VERIFIQUE com o DEBUG : 
	//	. a chamada da função operator<< 
	cout << "s1 = \"" << s1 ;
	cout << "\"\t"  << "Comprimento : " << s1.Comprimento() << endl;
	cout << "s2 = \"" << s2 ;
	cout << "\"\t" << "Comprimento : " << s2.Comprimento()  << endl;


	// VERIFIQUE com o DEBUG : 
	//	. Construtor : Conversão de str1 para um objecto temporário da classe cString
	//	. Atribuição do objecto temporário a s1 ( por defeito, cópia da memória dos objectos ) 
	//	. Destrutor : destruição do objecto temporário

	s1 = str1;

	s2 = "ESGS";


	cout << "s1 = \"" << s1 ;
	cout << "\"\t"  << "Comprimento : " << s1.Comprimento() << endl;
	cout << "s2 = \"" << s2 ;
	cout << "\"\t" << "Comprimento : " << s2.Comprimento()  << endl;
	
	// Atribuição de um objecto a outro objecto  
	// VERIFIQUE com o DEBUG que não há a chamada de qualquer método ou função
	// Atribuição por defeito entre objectos da mesma classe : cópia da memória do objecto 
	s3 = s1;  
	
	cout << "s3 = \"" << s3 << endl;
	
	
	// VERIFIQUE com o DEBUG : 
	//	. Chamada do método operator +=
	//	. Chamada do destrutor á saída do método operator += . Que objecto foi destruído ?
	//  Conceito de COPY CONSTRUCTOR ( Construtor por Cópia ) - ( por defeito : cópia da memória do objecto ) 
	//     Usado de forma invisível pelo compilador para efectuar a cópia de um objecto passado por valor 
	s3 +=  s2; 
	

	// VERIFIQUE com o DEBUG : 
	//	. Chamada duas vezes do construtor : Conversão das strings ", " e data para objectos temporários da classe cString
	//  . Chamada duas vezes da função operator+
	//	. Chamada duas vezes do destrutor : destruição dos objectos temporários
	// OBSERVAR que :
	//	. Os 2 objectos destruídos não correspondem aos dois objectos atrás construidos. 
	//    São objectos criados no retorno da função operator+ com o Construtor por Cópia,  
	//    usado de forma invisível pelo compilador para efectuar a cópia de um objecto retornado por valor 
	//  . Os 2 objectos temporários que vimos construir são passados para a função operator+, 
	//    sendo destruídos à saída desta.

	s1 = s1 + ", " + data; 



	// s2 += ", aula de ";
	// s2 += aula;
	s2 = s2 + ", aula de " + aula;
	
	cout << "s1 = \"" << s1 << endl;
	cout << "s2 = \"" << s2 << endl;
	
	// É necessário a conversão explícita
	// Sem a conversão explicita, , o compilador interpreta adição de ponteiros 
	s3 = cString(data) + " Operator Overloading" ;
	cout << "s3 = \"" << s3 << endl;
		
}

