Давайте разберем этот код, чтобы понять, что он делает:
#include <iostream>
#include <string> //program uses C++ standard string class
using namespace std;
// Gradebook class definition
class GradeBook
public:
void displayMessage( string courseName )
{
cout << "Welcome to the Grade Book for\n" << courseName << "!"
<< endl;
}
};
int main()
{
string nameOfCourse;
GradeBook myGradeBook;
// prompt for and input course name
cout << "Please enter the course name: " << endl;
getline( cin, nameOfCourse );
cout << endl;
myGradeBook.displayMessage( nameOfCourse );
}
Начиная с метода main()
, когда ваша программа запускается, происходит следующее:
int main()
{
string nameOfCourse;
Atс этого момента программа началась и инициализировала переменную типа string
.Это вызывает конструктор по умолчанию для string
, который создает строку с размером 0 (так что пустая строка).
Чтобы создать строку, программа выделяет место для строки в стеке программы.Это пространство используется конструктором по умолчанию при инициализации строки.
Когда программа запущена, имена, выбранные для переменных, не имеют никакого значения, и они нигде не отслеживают то, что вы назвали переменной.
GradeBook myGradeBook;
Здесь вы объявляете, что объект GradeBook
существует.Поскольку GradeBook
пусто, в оптимизированной программе на самом деле ничего не происходит.Он никогда не «создается», потому что нечего создавать.Компилятор может указать программе назначить GradeBook
адрес на основе текущего местоположения стека, но поскольку ваш код нигде не использует адрес myGradeBook
, это также может не произойти.
cout << "Please enter the course name: " << endl;
Первая часть (cout << "Please enter the course name: "
) отправляет это сообщение на стандартный вывод.Часть << endl
добавляет новую строку и очищает буфер, используемый стандартным выводом.endl
на самом деле является функцией, и это будет эквивалентно написанию endl(cout << "Please enter the course name: ")
.
getline(cin, nameOfCourse);
Считывает данные со стандартного ввода до конца строки.Это помещает эти данные в nameOfCourse
.Чтобы поместить эти данные в nameOfCourse
, программа изменяет ячейку памяти, назначенную ей nameOfCourse
, вызывая соответствующие функции-члены string
(возможно, функцию-член append
, которая добавляет текст в строку).
cout << endl;
Добавляет новую строку и снова очищает буфер.
myGradeBook.displayMessage( nameOfCourse );
Для вызова displayMessage
происходят следующие вещи: - Если в регистрах есть какие-либо данные, программа сохраняет их в стек (чтобы освободить регистры) - Программа выполняетместо в стеке для courseName
- программа вызывает конструктор копирования типа string
, создавая новую строку в пространстве, выделенном для courseName
- программа переходит к месту, где начинается машинный код для displayMessage
- displayMessage
выполняется - displayMessage
возвращает - метод main()
возобновляется
В этот момент программа завершает работу, потому что больше ничего не нужно делать.