2017-09-14 1 views
0

J'essayais de réviser mes concepts de programmation Orienté Objet. En passant par cet exemple C++ de base here, j'ai vu que le mot-clé this-> n'a pas été utilisé lors de la définition des valeurs pour les variables membres. J'ai ensuite modifié ce programme pour utiliser le mot-clé this. De manière surprenante, les deux fonctionnent (this et this).Quand utiliser `this` dans ce contexte en C++

#include <iostream>  // for cout and cin 

class Cat     // begin declaration of the class 
{ 
    public:     // begin public section 
    Cat(int initialAge);  // constructor 
    Cat(const Cat& copy_from); //copy constructor 
    Cat& operator=(const Cat& copy_from); //copy assignment 
    ~Cat();     // destructor 

    int GetAge() const;   // accessor function 
    void SetAge(int age); // accessor function 
    void Meow(); 
private:     // begin private section 
    int itsAge;    // member variable 
    char * string; 
}; 

// constructor of Cat, 
Cat::Cat(int initialAge) 
{ 
    itsAge = initialAge; 
    string = new char[10](); 
} 

//copy constructor for making a new copy of a Cat 
Cat::Cat(const Cat& copy_from) { 
    itsAge = copy_from.itsAge; 
    string = new char[10](); 
    std::copy(copy_from.string+0, copy_from.string+10, string); 
} 

//copy assignment for assigning a value from one Cat to another 
Cat& Cat::operator=(const Cat& copy_from) { 
    itsAge = copy_from.itsAge; 
    std::copy(copy_from.string+0, copy_from.string+10, string); 
} 

Cat::~Cat()     // destructor, just an example 
{ 
    delete[] string; 
} 

// GetAge, Public accessor function 
// returns value of itsAge member 
int Cat::GetAge() const 
{ 
    return itsAge; 
} 

// Definition of SetAge, public 
// accessor function 

void Cat::SetAge(int age) 
{ 
    // set member variable its age to 
    // value passed in by parameter age 
    itsAge = age; 
} 

// definition of Meow method 
// returns: void 
// parameters: None 
// action: Prints "meow" to screen 
void Cat::Meow() 
{ 
    cout << "Meow.\n"; 
} 

// create a cat, set its age, have it 
// meow, tell us its age, then meow again. 
int main() 
{ 
    int Age; 
    cout<<"How old is Frisky? "; 
    cin>>Age; 
    Cat Frisky(Age); 
    Frisky.Meow(); 
    cout << "Frisky is a cat who is " ; 
    cout << Frisky.GetAge() << " years old.\n"; 
    Frisky.Meow(); 
    Age++; 
    Frisky.SetAge(Age); 
    cout << "Now Frisky is " ; 
    cout << Frisky.GetAge() << " years old.\n"; 
    return 0; 
} 

Ma question est, devrions-nous, ou ne devrait pas nous utiliser mot-clé this dans ce contexte (lorsque vous définissez les valeurs des variables membres)? Merci!

Edit: Ou, est-ce une préférence personnelle comme mentionné here?

+0

Comme vous l'avez découvert, cela n'a pas d'importance. C'est surtout un problème de style. Parfois, cela ajoute de la clarté pour le lecteur en expliquant que la variable est une variable membre. –

+0

@BradS. Je peux me tromper ici, mais Java _mandate_ il? –

+5

Préférence personnelle. A propos de la seule fois où vous devriez utiliser 'this' si vous aimez marcher sur le côté sauvage et utiliser les mêmes noms pour les paramètres et les variables membres. – user4581301

Répondre

0

Dans le contexte de l'exemple, le mot-clé this est généralement utilisé pour l'auto-documentation afin de distinguer les membres non statiques de la classe des variables locales.

+0

Et les membres 'static' de la classe peuvent être invoqués sans aucun objet; si l'ambiguïté ne se pose pas en premier lieu, correct? –

+0

@UmedhSinghBundela Je n'ai pas compris votre question. Néanmoins, les variables locales peuvent masquer les membres de données statiques. Dans ce cas, les membres de données statiques sont précédés du nom de la classe, par exemple Cat :: static_member. En passant, vous pouvez également utiliser le nom de classe pour les membres de données non statiques au lieu du mot-clé this. –

+0

a obtenu votre point. Je vous remercie! :) –

0

Constructeur:

// constructor of Cat, 
Cat::Cat(int initialAge) 
{ 
    itsAge = initialAge; 
    string = new char[10](); 
} 

Vous devriez écrire cela comme:

// constructor of Cat, 
Cat::Cat(int itsAge) 
: itsAge(itsAge), 
string(new char[10]) 
{ 
} 

Copie constructeur:

//copy constructor for making a new copy of a Cat 
Cat::Cat(const Cat& copy_from) { 
    itsAge = copy_from.itsAge; 
    string = new char[10](); 
    std::copy(copy_from.string+0, copy_from.string+10, string); 
} 

Vous devriez écrire cela comme:

Cat::Cat(const Cat& copy_from) 
: itsAge(copy_from.itsAge), 
string(new char[10]) 
{ 
    std::copy(copy_from.string, copy_from.string+sizeof string, string); 
} 

Copier affectation:

//copy assignment for assigning a value from one Cat to another 
Cat& Cat::operator=(const Cat& copy_from) { 
    itsAge = copy_from.itsAge; 
    std::copy(copy_from.string+0, copy_from.string+10, string); 
} 

Vous devriez écrire cela comme:

Cat& Cat::operator=(const Cat& copy_from) 
{ 
    this->itsAge = copy_from.itsAge; 
    std::copy(copy_from.string, copy_from.string + sizeof string, string); 
} 

mutateur:

// Definition of SetAge, public 
// accessor function 

void Cat::SetAge(int age) 
{ 
    // set member variable its age to 
    // value passed in by parameter age 
    itsAge = age; 
} 

Vous devriez écrire cela comme:

void Cat::SetAge(int itsAge) 
{ 
    this->itsAge = itsAgege; 
} 

En Othe r mots:

  • utiliser des listes d'initialisation membres chaque fois que possible
  • utiliser le même nom pour les arguments que pour les membres, ils vont dans, pour économiser sur les identifiants et accroître la clarté
  • utilisation this-> si nécessaire pour éliminer l'ambiguïté ou erreur.
+0

Merci pour votre réponse, @EJP. –