2015-07-31 1 views
1
#include<iostream> 
#include<fstream> 
using namespace std; 

class Integer { 
public: 
    int val; 
    Integer(int val = 0) { 
     this->val = val; 
    } 
    void setVal(int val) { 
     this->val = val; 
    } 
}; 

int main() 
{ 
    int val; 
    Integer i; 
    i.setVal(8); 
    cout << val << endl; 
} 

Когда я выполняю свой код, я получил 0. Я новичок в C++, я не понимаю this. Может ли кто-нибудь более подробно остановиться на этом вопросе?Как мы ссылаемся на поле, когда аргумент метода имеет одно и то же имя?

+0

Почему бы не использовать поисковую систему для объяснения этого в C++? – hoijui

+0

C++ не является Java, поэтому вам не следует просто прыгать и использовать геттеры/сеттеры везде. Ссылки 'const' устраняют почти все неады для геттеров и сеттеров. Во всяком случае, [они злы] (http://typicalprogrammer.com/doing-it-wrong-getters-and-setters/). – CoffeeandCode

ответ

5

Вы выводите неправильный val. Как написано, вы могли бы позвонить i.val, так как вы сделали элемент данных valобщедоступным, но вы также можете создать функцию («getter») для класса Integer. В любом случае, я рекомендую узнать о приватных данных и о том, как их использовать.

Поглотителя подход будет выглядеть как

// in the class 
int getVal() { 
    return val; // equal to return this->val 
} 

// in main() 
cout << i.getVal() << endl; 

Обратите внимание, что если вы измените основную функцию вы не используете Ваш предыдущий val в main() больше. Это также точка - теперь вы используете элемент данных класса!

Для обсуждения о том, как можно обойти нужно использовать этот указатель, как вы просили, проверить этот вопрос: Is using underscore suffix for members beneficial?

Кроме того, кажется, что вам не нужно включать fstream в этом точка.

+0

Хорошо, отлично работает с i.val. Зачем мне вводить функцию? –

+0

@RichardRublev. Обычно это улучшает инкапсуляцию, что означает, что вы, как программист, будете больше контролировать свои данные. Если вы не хотите, чтобы пользователи вашей функции могли изменять вашу переменную, не используя, например, функцию «setVal», переменная должна быть частной. Подробнее читайте здесь: http://www.tutorialspoint.com/cplusplus/cpp_data_encapsulation.htm –

+1

@RichardRublev IMHO вам не нужно вводить функцию, «геттеры» и «сеттеры» - это груз кукурузного мусора –

1

Вы создали связь между val в main и val внутри объекта i.

У них нет никаких отношений, кроме совместного использования имени.

  • удалить неустановленный val в main;
  • i.val вместо.
Смежные вопросы