none
Вопрос по конструкторам RRS feed

  • Вопрос

  • Проблемный код:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Class1 MyClass1 = new Class1();
                Class1 MyClass2 = new Class1(5);
                MessageBox.Show(MyClass1.ToString());
            }
        }
    
        class Class1
        {
            int x;
    
            public Class1()
            {
                x = 0;
            }
    
            public Class1(int a)
            {
                x = a;
            }
    
            public override string ToString()
            {
                return x.ToString();
            }
        }

    В следующем коде x становиться равным 5:

                Class1 MyClass2 = new Class1(5);

    Почему в следующем коде значение x показывает как 0, а не 5?:

                MessageBox.Show(MyClass1.ToString());


    • Изменено Ziya Ceferov 26 августа 2012 г. 17:29
    26 августа 2012 г. 17:23

Ответы

  • Так у Вас первый экземпляр Class1 MyClass1 = new Class1(); создаётся без аргумента ( с конструктором без аргумента), а в этом случае x = 0. Метод ToString() вызывается на уровне экземпляра, а не на уровне класса.

    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 17:54
    26 августа 2012 г. 17:27
    Модератор
  • Да, именно так. А если оно объявлено с модификатором static, то будет общим и для MyClass1 и MyClass2.
    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 18:47
    26 августа 2012 г. 18:43
    Модератор

Все ответы

  • Так у Вас первый экземпляр Class1 MyClass1 = new Class1(); создаётся без аргумента ( с конструктором без аргумента), а в этом случае x = 0. Метод ToString() вызывается на уровне экземпляра, а не на уровне класса.

    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 17:54
    26 августа 2012 г. 17:27
    Модератор
  • Метод ToString() вызывается на уровне экземпляра, а не на уровне класса.

    Если поточнее метод ToString() взывает конструктор без параметра? Проверил не так, тогда как?
    • Изменено Ziya Ceferov 26 августа 2012 г. 17:32
    26 августа 2012 г. 17:32
  • Не метод вызывает, а объект class1 инициализируется с конструктором без параметров, а так как Вы в нём присваиваете x=0, то он и отображается. При создании объекта вызывается только один конструктор, котрый Вы указали после new, в этом случае -

    public Class1()
            {
                x = 0;
            }

    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 17:49
    • Снята пометка об ответе Ziya Ceferov 26 августа 2012 г. 18:37
    26 августа 2012 г. 17:40
    Модератор
  • "Значит число 0 кроме сохранения в память экземпляра x, ещё сохраняется в память экземпляра MyClass1, всё верно?" - чило 0 хранится в x, а сам x в MyClass1.
    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 18:48
    • Снята пометка об ответе Ziya Ceferov 26 августа 2012 г. 18:49
    26 августа 2012 г. 17:57
    Модератор
  • чило 0 хранится в x, а сам x в MyClass1.
    Значит число x отдельно с различными значениями может храниться и в MyClass1 и в MyClass2?
    26 августа 2012 г. 18:37
  • Да, именно так. А если оно объявлено с модификатором static, то будет общим и для MyClass1 и MyClass2.
    • Помечено в качестве ответа Ziya Ceferov 26 августа 2012 г. 18:47
    26 августа 2012 г. 18:43
    Модератор
  • Привет.

    Вам нужно почитать что-нибудь про объектно-ориентированное программирование, тогда все станет более понятней, как хранятся данные и к чему они принадлежат.


    Для связи [mail]

    28 августа 2012 г. 9:07