Почему параметр не изменяется в конструкторе класса? - PullRequest
0 голосов
/ 10 июня 2018

Вот мой код.Я не понимаю, почему он не печатает 3, хотя в конструкторе класса param1 становится 3.

#include <iostream>

using namespace std;

class A{

    int valoare;
public:

    A(int param1 = 3):valoare(param1){}
    int getValoare(){return this -> valoare;}
};

int main()
{

    A vector[] = {*(new A(3)), *(new A(4)), *(new A(5)), *(new A(6))};
    cout << vector[2].getValoare();
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Возможно, вы захотите прочитать об аргументах по умолчанию: https://en.cppreference.com/w/cpp/language/default_arguments

Когда вы указываете аргумент для функции с аргументом defualt, он переопределяет это значение по умолчанию.Таким образом, ваш код будет распечатан 5.

В качестве примечания, у вашего кода есть утечка памяти, потому что вы выделили память с ключевым словом new и никогда не удаляли ее.Вы должны изменить объявление вашего вектора, то есть выделить память в стеке следующим образом:

Vector = {A(3), A(4), A(5), A(6)}
0 голосов
/ 10 июня 2018

Почему параметр не изменяется в конструкторе класса?

Он не печатает значение 3, поскольку вы задаете ему другое значение.

из cppreference :

Аргументы по умолчанию используются вместо отсутствующих конечных аргументов в вызове функции:

void point(int x = 3, int y = 4);

point(1,2); // calls point(1,2)
point(1);   // calls point(1,4)
point();    // calls point(3,4)
0 голосов
/ 10 июня 2018

Элемент с индексом 2 в векторе был построен как A(5), поэтому его значение ("valoare") равно 5. = 3 в определении функции - это аргумент по умолчанию - которыйиспользуется, если вы не указали один самостоятельно.Поэтому, если бы вы написали:

std::cout << A().getValoare();

, это вывело бы 3.

Но еще несколько замечаний по порядку:

  1. Предпочитаю английский-названия языков.valoare означает «значение» в некотором латинском или европейском языке, верно?Румынский что ли?Но люди, которые не говорят на этом языке, этого не знают.Поскольку для программирования необходимо в любом случае знать английский, это безопасный выбор для имен.
  2. Старайтесь не использовать имена для переменных, которые также являются именами классов в другом пространстве имен.Например, ваш vector имеет то же имя, что и std::vector, класс или, скорее, шаблон класса, в стандартной библиотеке.Попробуйте vec или my_vector или что-то еще более характерное.
  3. У вас утечка памяти!Почему вы используете new для создания значений?Просто используйте конструкцию, т. Е.

    A vector[] = { A(3), A(4), A(5), A(6) };
    

    просто отлично.

  4. В общем, вам следует избегать явного вызова new и delete , и вместо этого предпочитают классы RAII-стиля - которые выделяются при строительстве и освобождаются при уничтожении.Самое простое, что нужно сделать, - это переключиться на использование интеллектуальных указателей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...