как получить доступ к переменной класса внутри конструктора, чтобы назначить их без использования этого указателя в C ++ - PullRequest
0 голосов
/ 19 октября 2019

Как можно получить доступ к переменной класса, чтобы присвоить ее значение, когда переменная класса и параметр имеют одно и то же имя, без использования указателя this? Я использовал class_name::variable_name внутри конструктора вместо this указателя на объект. Для лучшего понимания см. Код ниже.

#include<iostream>
using namespace std;
class abc
{
    int x;
    public:
        abc(int x)
        {
            abc::x=x;
        }
        void prnt()
        {
            cout<<x;
        }
};
int main(void)
{
    abc A(2);
    A.prnt();
    return 0;
}

Как это возможно без использования указателя this?

Ответы [ 4 ]

1 голос
/ 19 октября 2019

Во-первых: я бы не использовал одно и то же имя, даже если это возможно.

Во-вторых: вы должны инициализировать переменные вашего класса, а не переписывать их позже внутри тела конструктора! Это может, если не оптимизировать, привести к нежелательному вызову конструктора по умолчанию для элементов-членов.

Большинство людей используют соглашения о кодировании для функций параметров и переменных-членов, возможно, что-то вроде этого:

class abc
{
    int x;

    public:
        abc(int x_): x{ x_ } // use initializer list and not constructor body!
    {
    }
};

В списке инициализаторов вы можете использовать одно и то же имя для конструктора parm и члена var. Но, как я уже сказал, мне лично это не нравится!

Как подсказка к комментариям: вам следует избегать зарезервированных идентификаторов, как описано в этом ответе: Каковы правила использования подчеркивания в идентификаторе C ++?

1 голос
/ 19 октября 2019

Переименуйте этот параметр или элемент и / или используйте список инициализации (вы должны сделать это в любом случае).

abc(int x) : x(x) { }

Лично я бы назвал переменную-член m_xа затем сделать

abc(int x) : m_x(x) { }
0 голосов
/ 19 октября 2019

Пункт 1: У вас нет двух x с. Параметр x. Полное имя пользователя x: abc::x.

Пункт 2: Компилятор умный.

Когда он единственный Джон вокруг, вы можете позвонить Джону Смиту Джону, и окружающие обычно могут выяснить, к кому вы обращаетесь. В комнате, полной Джонса, вам может понадобиться использовать его полное имя. В случае нескольких Джонов Смитов, вам может потребоваться сделать еще один шаг и использовать Джона Пола Смита.

В большой комнате вам может не понравиться позвонить Джону Полу Смиту Джону, если другие Джонс будут дальше. Все рядом будут считать, что вы имеете в виду ближайшего Джона. Если они не правы, вы, коммуникатор, должны быть более явными.

Компилятор делает то же самое. Поведение по умолчанию - использовать ближайший x, тот, который имеет наименьшую видимую область видимости. Это будет параметр x. Если вы хотите использовать x, который находится дальше, вы используете однозначное имя.

Примечания:

Хотя этот случай легко избежать и является легким источником ошибок, что делает его плохим решением, вы обнаружите, что время от времени вам необходимо более полно квалифицировать идентификаторы дляпример, когда вы хотите вызвать функцию-член базового класса из производного класса после того, как производный класс переопределил функцию.

Связано, это одна из причин, по которой using namespace std; это , как правило, плохоидея .

0 голосов
/ 19 октября 2019

На самом деле, ваш код компилируется, запускается и работает в MSVC (хотя я не был уверен, что так и будет). Но, кроме (лучшего) предложения, сделанного в комментариях, вы также можете использовать список инициализаторов:

abc(int x) : x { x }
{
}

Но я бы все равно назвал этот «плохой» стиль кодирования.

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