К сожалению, в приведенном ниже коде я не создал/не назвал ни одного объекта, и при компиляции я не получил никаких ошибок, а также смог получить доступ к функции-члену. Насколько мне нужно это поведение, так это что-то временное, созданное в стеке, если да, то если я хочу получить доступ к чему-то позже в коде, могу ли я получить к нему доступ.
#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;
}
Student("Goofupp", 27, 1001)
создает временный объект. Его время жизни будет длиться до конца текущего выражения. Как только выражение завершено, объект разрушается и перестает существовать.
Не могли бы вы попытаться переписать свой вопрос понятным языком, его очень сложно читать. Хотите знать, что происходит с временным объектом в этом утверждении: Student("Goofupp", 27, 1001).getInfo();
. Или вы хотите знать, почему этот Student("Goofupp", 27, 1001);` разрешен в C++ и компилятор не жалуется? Или что-то еще.
Код действителен; здесь нет ошибки. Вы спрашиваете о Student("Goofupp",27,1001).getInfo();
? При этом создается временный объект, вызывается функция-член этого объекта, а затем уничтожается объект.
Student;
было бы незаконно, как и int;
, но int(99);
совершенно законно (но бесполезно), как и Student("Goofupp", 27, 1001);
Эта линия
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 Очевидно, он не скомпилируется. Я должен дать весь код. Это было просто для демонстрации. И если вы добавите только соответствующие заголовки, все будет нормально скомпилироваться.
это было бы потому, что ты исправил опечатку :D
Это была не такая уж большая опечатка. Однако, что касается ссылок, я признаю, что они сбивали с толку, по крайней мере, новичка.
Объект может быть создан с именем или без него. Для простоты, без имени он существует до следующего
;
, а с именем он существует до следующего}
(конечно, как и все в C++, это бесконечно сложнее, если вдаваться в подробности).