@lexzus07

Вызов функции с аргументами?

Вызываю элемент-функцию displayMessage объекта myGradeBook с аргументами.
Почему в функцию displayMessage класса GradeBook нужно вписывать string nameOfCourse, если мы и так в main вызвали её с такими аргументами? Поидее аргументы должны передаться при вызове из main. И почему string nameOfCourse а не nameOfCourse(имя объекта класса в main)?

Я недавно начал изучать C++ и это вопрос моей логики. Заранее благодарен!

#include <iostream> //	Директива препроессора	ввод\вывод данных
using std::cout;	
using std::cin;
using std::endl;

#include <string>	//	программа использует класс string из стандартной библиотеки C++
using std::string;
using std::getline;

class GradeBook
{
	public:
		
		void displayMessage(string nameOfCourse)	//	почему string + nameOfCourse?
	{

		cout << "Welcome to GradeBook for\n" << nameOfCourse << "!" << endl;
	
	}

};

int main()
{
	
	string nameOfCourse;	
	GradeBook myGradeBook;
		
		cout << "Please enter the course name:" << endl;
		getline(cin, nameOfCourse);	//	функция с аргументами
		cout << endl;

	myGradeBook.displayMessage(nameOfCourse);	//	вызываем функцию и передаем аргументы

return 0;
}
  • Вопрос задан
  • 245 просмотров
Решения вопроса 3
@sitev_ru
sitev.ru - мой блог ...
>>Почему в функцию displayMessage класса GradeBook нужно вписывать string nameOfCourse
Потому что это описание функции, задаём строковый тип параметра
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Гуглите что такое явная типизация. А если начали изучать C++, то возьмите книгу (синенькую и с лебедями) Страуструпа, и изучайте. Тогда подобные вопросы отпадут.
Ответ написан
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
В C++ мы должны явно указывать типы принимаемых аргументов функции. Дело в том, что при вызове функции нужно как-то скопировать аргументы(или ссылки на них если мы указали &) в функцию. Для того, чтобы это сделать, компилятору надо знать что он будет копировать.
Как вариант, он мог бы об этом догадаться сам по тому, как вы вызываете функцию (что-то похожее происходит с шаблонными функциями). Однако есть проблема, что код функции может принадлежать библиотеке. Но библиотека может компилироваться отдельно и ничего не знать о том, как ее функции будут вызваны. Более того, в с++ каждый *.cpp файл компилируется отдельно, и мы не можем узнать как именно нас вызывают в другом файле.
Другой вариант -- разбираться что нам передают прямо в момент выполнения программы. По такому принципу работает python и многие другие языки с динамической типизацией. Это может быть удобно, однако на порядки медленней по сравнению с компилируемым вариантом.
Обратите внимание, что имя параметра функции никак не зависит от имени того что в нее передают. void displayMessage(string const &anyNameYouLike)//OK
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы