Как строковый класс C ++ преобразовывает переменную в другую переменную? - PullRequest
3 голосов
/ 26 июня 2019

Только что начал писать код на C ++.Я хочу понять, как работает класс C ++, когда я хочу определить переменную и выдать ее с другим именем.

Извинения, если вопрос не имеет смысла.Код, который я имею, взят из известного учебника.Я не получаю никаких сообщений об ошибках;Я просто пытаюсь понять, как работает в C ++.У меня есть некоторый опыт работы с Python, и этот процесс смутил меня.

#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 ); 
}

Вывод получается нормально.

Обратите внимание на две переменные: courseName и nameOfCourse.В учебнике говорится, что переменная courseName преобразуется в переменную nameOfCourse в строке 17, где она выглядит так:

        string nameOfCourse;

Можете ли вы помочь мне понять, как происходит это преобразование?

Ответы [ 3 ]

4 голосов
/ 26 июня 2019

Если бы courseName было ссылкой (std::string&), то было бы правильно сказать, что в строке 17 courseName является привязанным к nameOfCourse (другими словами, для продолжительности из этого displayMessage вызова courseName будет просто другим именем для nameOfCourse).

Но 1. это называется «привязка ссылки», а не «преобразование переменной», и 2. это не то, что здесь происходит - nameOfCourse копируется в courseName, когда displayMessage named: Конструктор копирования std::string используется для создания копии nameOfCourse.

Переменные (и / или имена переменных) не «трансформируются» в C ++ (особенно не в контексте вызова по значению), поэтому, если здесь не возникает проблема перевода / транскрипции / общей коммуникации, книга просто неверна .

4 голосов
/ 26 июня 2019

Давайте разберем этот код, чтобы понять, что он делает:

#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() возобновляется

В этот момент программа завершает работу, потому что больше ничего не нужно делать.

2 голосов
/ 26 июня 2019

Параметр функции может иметь любое имя.

int display_int(int the_int) { cout << the_int << endl; }

Вы можете вызвать эту функцию любым из следующих способов:

display_int(5);
int hardyharhar = 42069;
display_int(hardyharhar);
display_int(999-333);
...