fork download
  1. #include <iostream>
  2.  
  3. using std::cout;
  4. using std::endl;
  5. using namespace std;
  6.  
  7. class Objeto{
  8. public:
  9. int valor;
  10.  
  11. Objeto(){
  12. this->valor = 2;
  13. }
  14. };
  15.  
  16. void prop1(Objeto arg) {
  17. arg.valor = 5; // Não afeta o objeto original
  18. }
  19.  
  20. void redef1(Objeto arg) {
  21. Objeto novo;
  22. novo.valor = 10;
  23. arg = novo; // Não afeta o objeto original
  24. }
  25.  
  26. void prop2(Objeto* arg) {
  27. arg->valor = 5; // Afeta o objeto original
  28. }
  29.  
  30. void redef2(Objeto* arg) {
  31. Objeto* novo = new Objeto();
  32. novo->valor = 10;
  33. arg = novo; // Não afeta o objeto original
  34. }
  35.  
  36. void prop3(Objeto& arg) {
  37. arg.valor = 50; // Afeta o objeto original
  38. }
  39.  
  40. void redef3(Objeto& arg) {
  41. Objeto novo;
  42. novo.valor = 100;
  43. arg = novo; // Afeta o objeto original
  44. }
  45.  
  46. void prop4(Objeto& arg) {
  47. arg.valor = 50; // Afeta o objeto original
  48. }
  49.  
  50. void redef4(Objeto& arg) {
  51. Objeto* novo = new Objeto();
  52. novo->valor = 100;
  53. arg = *novo; // Afeta o objeto original
  54. }
  55.  
  56. int main() {
  57. Objeto valor; // Um objeto no stack
  58. Objeto* ponteiro = &valor; // Um ponteiro para um objeto no stack ou no heap
  59. Objeto& referencia = valor; // Uma referência para um objeto no stack ou no heap
  60.  
  61. cout << "Tipo valor" << endl;
  62. cout << "Valor inicial: " << valor.valor << endl;
  63. prop1(valor);
  64. cout << "Após mudar propriedade: " << valor.valor << endl;
  65. redef1(valor);
  66. cout << "Após redefinir: " << valor.valor << endl;
  67. cout << endl;
  68.  
  69. cout << "Tipo ponteiro" << endl;
  70. cout << "Valor inicial: " << (*ponteiro).valor << endl;
  71. prop2(ponteiro);
  72. cout << "Após mudar propriedade: " << ponteiro->valor << endl;
  73. redef2(ponteiro);
  74. cout << "Após redefinir: " << ponteiro->valor << endl;
  75. cout << endl;
  76.  
  77. cout << "Tipo referência" << endl;
  78. cout << "Valor inicial: " << referencia.valor << endl;
  79. prop3(referencia);
  80. cout << "Após mudar propriedade: " << referencia.valor << endl;
  81. redef3(referencia);
  82. cout << "Após redefinir: " << referencia.valor << endl;
  83. cout << endl;
  84.  
  85. // Alternativa
  86. cout << "Tipo referência (alternativa)" << endl;
  87. Objeto& referencia2 = *(new Objeto()); // Uma referência para um objeto no heap
  88. cout << "Valor inicial: " << referencia2.valor << endl;
  89. prop4(referencia2);
  90. cout << "Após mudar propriedade: " << referencia2.valor << endl;
  91. redef4(referencia2);
  92. cout << "Após redefinir: " << referencia2.valor << endl;
  93. cout << endl;
  94. }
  95.  
  96.  
Success #stdin #stdout 0s 3228KB
stdin
Standard input is empty
stdout
Tipo valor
Valor inicial: 2
Após mudar propriedade: 2
Após redefinir: 2

Tipo ponteiro
Valor inicial: 2
Após mudar propriedade: 5
Após redefinir: 5

Tipo referência
Valor inicial: 5
Após mudar propriedade: 50
Após redefinir: 100

Tipo referência (alternativa)
Valor inicial: 2
Após mudar propriedade: 50
Após redefinir: 100