Вызов объекта без его создания, в CPP

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

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;

    Person(std::string n, int a) : name(n), age(a) {}
    void getInfo() {
        std::cout << "Name : " << name << std::endl;
        std::cout << "Age : " << age << std::endl;
    }
};

class Student : public Person {
public:
    int rollNo;
    Student(std::string n, int a, int r) : Person(n, a), rollNo(r) {}

    void getInfo() {
        std::cout << "Name : " << name << std::endl;
        std::cout << "Age : " << age << std::endl;
        std::cout << "Roll No : " << rollNo << std::endl;
    }
};

int main(int argc, const char* argv[]) {
    Student("Goofupp", 27, 1001).getInfo();  // does any memory also created here ?? how to understand this behaviour

    Student rahul("Rahul", 23, 1002);  // there is block of memory allocated for rahul

    rahul.getInfo();

    return 0;
}

Я ожидал ошибки, говорящей, что «объявление ничего не определяет», как мы получаем, когда определяем, как показано ниже.

int main()
{
  int;     
  cout<<"hello\n";     
  return 0; 
}

Объект может быть создан с именем или без него. Для простоты, без имени он существует до следующего ;, а с именем он существует до следующего } (конечно, как и все в C++, это бесконечно сложнее, если вдаваться в подробности).

Yksisarvinen 23.07.2024 15:51
Student("Goofupp", 27, 1001) создает временный объект. Его время жизни будет длиться до конца текущего выражения. Как только выражение завершено, объект разрушается и перестает существовать.
Some programmer dude 23.07.2024 15:52

Не могли бы вы попытаться переписать свой вопрос понятным языком, его очень сложно читать. Хотите знать, что происходит с временным объектом в этом утверждении: Student("Goofupp", 27, 1001).getInfo(); . Или вы хотите знать, почему этот Student("Goofupp", 27, 1001);` разрешен в C++ и компилятор не жалуется? Или что-то еще.

pptaszni 23.07.2024 15:54

Код действителен; здесь нет ошибки. Вы спрашиваете о Student("Goofupp",27,1001).getInfo();? При этом создается временный объект, вызывается функция-член этого объекта, а затем уничтожается объект.

Pete Becker 23.07.2024 15:55
Student; было бы незаконно, как и int;, но int(99); совершенно законно (но бесполезно), как и Student("Goofupp", 27, 1001);
john 23.07.2024 16:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Эта линия

Student("Goofupp", 27, 1001).getInfo();

вызывает конструктор для создания экземпляра Student. Это временный объект, который перестает существовать после ; и не имеет имени. Потому что он остается активным до тех пор, пока ; вы не сможете вызвать метод.

К сожалению, в приведенном ниже коде я не создал[...] ни одного объекта [...]

Вы создаете временный объект.

К сожалению, в приведенном ниже коде я не [...] назвал ни один объект [...]

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

Я ожидал ошибки: «объявление ничего не определяет».

Такой ошибки нет, поскольку строка не является декларацией.

Это потому, что мы можем явно вызывать конструкторы класса. Вот почему строка:

Student("Goofupp",27,1001).getInfo();

работал правильно. Логика очень проста. Сначала он просто вызывает соответствующий конструктор, в вашем случае это было:

Student(string n, int a, int r);

Память для объекта была выделена благодаря вызову его конструктора. Затем для этого объекта вы вызвали метод getInfo(). getInfo() выдает некоторые отпечатки, а затем функция завершается. Объект нигде не хранился, поэтому он выходит за пределы области видимости и уничтожается деструктором после этой строки.

Ответ на ваш второй вопрос заключается в том, что это было временно, поэтому вы не сможете использовать его позже в коде. Чтобы использовать это, вы можете дать ему имя, назначить другому объекту Student или, возможно, передать его другой функции:

class Student { 
    public:
        //Provide a constructor
        Student (string _name, int _age, int _rollNo) : name(_name), age(_age), rollNo(_rollNo) {}

        void getInfo() {
            /* Give your implementation */
        }

    private:
        string name;
        int age;
        int rollNo;
};

void doSomething(Student s) {
    //Assuming this calls getInfo method
    s.getInfo();
}

int main() {

    Student s1 = Student("Example1", 20, 1000); //Assign it to other Student object
    Student s2("Example2", 20, 1001); //Give it a name
    
    doSomething(Student("Example3", 20, 1002)); //Or pass it to other function

    return 0;
}

по вашей ссылке «Неявные конструкторы, также известные как конструкторы по умолчанию, генерируются компилятором, когда класс не определяет какой-либо конструктор явно», в этом так много неправильного:/

463035818_is_not_an_ai 23.07.2024 16:32

...и ваш код не компилируется

463035818_is_not_an_ai 23.07.2024 16:32

@ 463035818_is_not_an_ai Очевидно, он не скомпилируется. Я должен дать весь код. Это было просто для демонстрации. И если вы добавите только соответствующие заголовки, все будет нормально скомпилироваться.

Newbie852 23.07.2024 16:38

это было бы потому, что ты исправил опечатку :D

463035818_is_not_an_ai 23.07.2024 16:39

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

Newbie852 23.07.2024 16:47

Другие вопросы по теме