سلام ، شرمنده اگه دیر شد
اول بزار کل کد رو یه بار با دقت بررسی کنیم :
class GradeBook
{
public:
// function that sets the course name
void setCourseName( string name )
{
courseName = name; // store the course name in the object
} // end function setCourseName
// function that gets the course name
string getCourseName()
{
return courseName; // return the object's courseName
} // end function getCourseName
// function that displays a welcome message
void displayMessage()
{
// this statement calls getCourseName to get the
// name of the course this GradeBook represents
cout << "Welcome to the grade book for\n" << getCourseName() << "!"
<< endl;
} // end function displayMessage
private:
string courseName; // course name for this GradeBook
}; // end class GradeBook
خب ، این کلاس یه عضو داده ای private داره به اسم courseName ؛
اگه یادت باشه گفتم اعضای private فقط در دسترس توابع عضو خود کلاس هستند ، پس برای مقداردهی به این عضو داده ای ما باید از توابع عضو set و get کمک بگیریم ؛
تابع setCourseName ، عضو courseName رو با رشته ای که از ورودی میگیره مقداردهی میکنه ، اینو ببین :
شی myGradeBook ساخته شد، فعلا این شی خالیه , یعنی اگه با استفاده از تابع getCourseName بنویسی :
cout<<myGradeBook.getCourseName() ;
هیچی تو خروجی چاپ نمیشه ؛
حالا اینو ببین :
string str;
cout<<"Please enter a name: ";
cin>>str;
myGradeBook.setCourseName(str)
توی این کد کاربر خودش شی myGradeBook رو مقداردهی میکنه ، حالا اگه دوباره بنویسی :
cout<<myGradeBook.getCourseName() ;
میبینی که این دفعه توی خروجی همون اسمی که کاربر میده ، چاپ میشه ؛
این معنی همون جمله store the coursename in the object هستش ، یعنی شی توسط متغیر coursename مقداردهی میشود ؛
اگه تا اینجا سوالی نداری بریم سراغ سوال بعدیت :
تابع displaymessage هیچ پارامتری نداره. چرا؟
خب این تابع میخواد یه متن ثابت رو رو خروجی چاپ کنه ، یه چیزی مثل گزارش ، پس نیازی نداره که پارامتر داشته باشه ؛
چرا تابع setcoursename پارامتر عضو داره؟
چون این تابع وظیفه ش اینه که یه رشته رو بگیره و بریزه تو coursename ؛
توی cout ، بدون استفاده از شی تابع getcoursename رو خونده. آیا درسته؟
احتمالن یه خورده حواستو جمع میکردی خودت میگرفتی :دی :دی
ما تو تابع main از اشیا استفاده میکنیم ؛ اینجا ما تو خود کلاسیم ، پس تعریف شی اصلا معنی نداره
کد:
private: string courseName;
اومده قبل از اینکه کلاس تموم شه یه پارامتری رو به نام coursename از نوع string تعریف کرده که قبلاً (یعنی قبل از اینکه تعریف کنه) دو بار در دو تابع از اون استفاده کرده
کد:
void setCourseName( string name ) {
courseName = name; } string getCourseName() {
return courseName; }
خوب مگه ما نگفته بودیم تا قبل از اینکه از داده ای استفاده کنیم باید حتماً قبلش تعریفش کنیم؟ مثلا قبل از اینکه ما a رو با b جمع کنیم باید حتما بگیم int a, b درسته؟ پس چرا اینجا اینجوری نکرده؟
تازه مگه ما نگفتیم هر داده ای که تعریف میشه باید عضو تابعی باشه؟ پس چرا اینجا خارج از این سه تابع نوشته؟
حرفت کاملا منطقیه ولی تو برنامه نویسی ساخت یافته ؛
توی برنامه نویسی شی گرا وقتی یه کلاس طراحی میکنی ، اولین چیزی که بررسی میشه اعضای داده ای کلاسند ، یعنی فرق نمیکنه عضو داده ای رو کجای کلاس معرفی کنی
پس اینجا اول کلاس میدونه که یه عضو داده ای private به نام courseName داره و بعد توابع عضو رو بر همین اساس تحلیل میکنه ؛
البته اگه اعضای داده ای رو همون اول تعریف کلاس بنویسیم ، کد خواناتر میشه ؛
این خط از برنامه چه کاری رو انجام میده به نظرتون این خط اضافی نیست؟
کد:
cout <<"initial course name is:" << myGradeBook.getCourseName() << endl;
این خط میخواد فقط بگه که شی myGradeBook اول خالیه ،
امیدوارم تونسته باشم کمکت کنم ،
اگه سوالی بود در خدمتم