Theory
Idea से typed code तक
आप theory जानते हैं: एक class एक blueprint है, एक object वह असली चीज़ है जो इससे बनी है (class-and-object lesson का Student example)।
अब canteen till को अपना पहला असली component चाहिए: एक Item। हर item का एक name और price है, और उसे bill पर ख़ुद को print करना है।
आज आप वह class लिखते हैं, line by line, और punctuation के वे दो pieces सीखते हैं जो तय करते हैं यह compile होगा या नहीं: एक semicolon और एक ::।
Formula
वह skeleton जो exam चाहता है
class ClassName {
private:
// member variables (data)
public:
// member functions (behaviour)
}; <- यह semicolon optional नहीं है
Member variables + member functions = members। इस shell को सही लिखना किसी भी "class declare कीजिए" सवाल में free marks है।
Practical
Item class, complete और honest
#include <iostream>
#include <cstring>
using namespace std;
class Item {
private:
char name[30]; // member variable
double price; // member variable
public:
void setData(const char itemName[], double itemPrice) {
strcpy(name, itemName); // defined INSIDE the class
price = itemPrice;
}
void display(); // only declared here...
};
// ...and defined OUTSIDE, attached with the scope resolution operator ::
void Item::display() {
cout << name << " Rs " << price << endl;
}
int main() {
Item chai; // object created from the class
chai.setData("Chai", 12.5); // members reached with the dot
chai.display(); // prints: Chai Rs 12.5
return 0;
}
Theory
हर line क्यों है
char name[30]; double price;member variables हैं: हर Item object को इनकी अपनी copy मिलती है।setData(...)एक class body के अंदर defined member function है (ऐसे functions को inline माना जाता है)।- class के अंदर
display();सिर्फ़ एक declaration है, एक promise। void Item::display() { }उस promise को बाहर पूरा करता है।Item::prefix (scope resolution operator) compiler को बताता है यह display Item का है, free world का नहीं।
Think first
इसे मन में trace कीजिए
main() एक दूसरा object बनाता है: Item dosa; dosa.setData("Dosa", 40); dosa.display();
tap करने से पहले: क्या dosa की price बदलने से chai की price disturb होती है? क्यों या क्यों नहीं?
Show the answer
नहीं। हर object member variables की एक अलग copy रखता है: chai का name/price और dosa का name/price अलग memory में रहते हैं। Member functions एक बार exist करते हैं और shared हैं, पर वे हमेशा उस object पर काम करते हैं जिसने उन्हें call किया (dot से पहले वाला)। तो dosa.display() Dosa Rs 40 print करता है जबकि chai Chai Rs 12.5 ही रहता है।
Quiz
यह code compile होने में fail होता है: class Item { public: void show(); } void show() { cout << "hi"; } कौन से DO fixes चाहिए?
- class की closing brace के बाद एक semicolon जोड़िए, और function को void Item::show() के रूप में define कीजिए
- public specifier हटा दीजिए, और show का नाम बदलकर display कर दीजिए
- show() को class के ऊपर move कीजिए, और return 0 जोड़िए
- सिर्फ़ semicolon missing है; function definition जैसा लिखा है वैसा ठीक है
Show the answer
class की closing brace के बाद एक semicolon जोड़िए, और function को void Item::show() के रूप में define कीजिए
दो अलग errors: class body को }; से ख़त्म होना चाहिए (missing semicolon सबसे common class-declaration error है), और बाहर की definition Item::show() होनी चाहिए, वरना आपने show नाम का एक असंबंधित free function define किया जबकि member undefined रहता है। Option D सबको लुभाता है: free function compile होता है, पर class के अंदर किया गया promise कभी पूरा नहीं होता।
Watch out
Punctuation के दो traps
`};` के बाद semicolon: इसे भूलने से confusing errors आते हैं जो class की जगह आपकी file की NEXT line को point करते हैं। जब एक class के ठीक बाद एक अजीब error दिखे, पहले semicolon check कीजिए।
Bare definitions: class के बाहर void display() {} एक नया free function है, आपका member नहीं। सिर्फ़ void Item::display() {} class से जुड़ता है। बाक़ी सब सही होने पर भी examiners missing Item:: के लिए marks काटते हैं।
Theory
यह class बढ़ने वाली है
Item जानबूझकर plain है। आने वाले lessons में इसे अपनी category के लिए एक enum मिलता है (snack, meal, drink), फिर constructors ताकि यह बनते ही ख़ुद को initialise कर ले, और बाद में एक inheritance family में एक जगह। इस lesson का skeleton याद रखिए: इस subject की हर richer class यही shell है, बस ज़्यादा members के साथ।
Summary
Key takeaways
- class Name { specifiers, members }; से declare कीजिए और आख़िरी semicolon कभी मत भूलिए।
- Member variables data रखते हैं; हर object को इनकी अपनी copy मिलती है।
- Member functions behaviour define करते हैं: class के अंदर (inline) या बाहर ClassName:: के साथ।
- :: scope resolution operator है: यह एक बाहरी definition को उसकी class से जोड़ता है।
- Name obj; से objects बनाइए और dot से members तक पहुँचिए: obj.function()।
- Memory hook: shell, semicolon, और घर आने के लिए ::।