类的使用注意事项
整篇以這個學生類為例。
class Student { public:Student() {}//默認構造函數形式~Student() {}//默認析構函數形式string GetName(){return name;}int GetAge(){return age;}float GetScore(); private:string name;int age;float score; };float Student::GetScore()//在類內聲明成員函數,在類外定義成員函數 {return score; }1.當且僅當沒有定義任何構造函數的時候,編譯器才會提供默認參數。
當我們不定義構造函數的時候,如果想要用類創建對象而不初始化,則必須定義一個不接受任何參數的默認構造函數,如果我們沒有寫,編譯器會自動提供。
所以對待Student類我們沒有寫22構造函數的時候,可以用語句Student stu1;來創建對象stu1。但是一旦我們自己寫了構造函數,那么編譯器不會給我們提供默認構造函數了。
比如:
創建stu1會報錯,因為我們自己定義了構造函數,就不能寫和我們構造函數不匹配的構造方式了。創建stu2和stu3才是正確的。stu2是隱式調用構造函數。stu3是顯示的調用構造函數。這倆作用是等價的。stu4也是正確的,這稱為列表初始化。可以正常使用我們寫的構造函數。
2.類內定義成員函數都將會自動被編譯器當作內聯函數處理。
如果愿意的話,可以在類中聲明成員函數,在類外定義成員函數的時候用inline限定符即可。
內聯函數的特殊規則是要求使用它們的文件中都對其進行定義。確保內聯定義對多文件程序中的所有文件都可用時,最簡單的方法是將內聯定義放在定義類的頭文件當中。
在類聲明中定義方法等同于用原型替換方法定義。然后在類聲明的后面將定義改寫為內聯函數。也就是說和把類成員函數用inline限定符在類外定義是等價的。
3.構造函數的形參名盡量不要與類內成員名相同。
注意,是成員函數形參盡量不要與類內成員變量同名。如果同名的話,如下代碼:
我們是想要把形參age賦值給對象包含的變量age,但是我們分不清哪個age是哪個,編譯器也分不清,最終會是形參age本身給形參age本身賦值。所以運行結果:
當然,我們可以用this指針指向的age表明哪個是對象的age,比如下面代碼:
這樣編譯器就知道前面一個age是對象包含的age了,運行結果:
雖然加上this指向就可以了,但是仍然要盡量避免形參與成員變量同名,因為我們一般在成員函數內用成員變量名的時候,為了簡便,是不會加上this指針指向的。所以為了出錯,還是盡量注意形參不要與成員變量同名。
4.const成員函數
class Student { public:Student(string n,int a,float s) :score(s){name = n;a = age;}~Student() {}//默認析構函數形式void show(){cout << name << endl;cout << age << endl;cout << score << endl;}private:string name;int age;float score; };int main() {const Student stu("xiaomeng", 21, 95);stu.show();/errorreturn 0; }stu有const限定符,編譯器不知道show是否會修改stu的成員,所以不會讓其調用。編譯器只允許const對象調用const成員函數。
所以我們需要把show函數修改一下:
這樣就可以了,在函數后面加上const,之所以const加在后面是因為show函數的參數是隱藏的,有一個this指針參數,我們把const加在后面,就是告訴編譯器這個函數不要修改this指針的任何東西。
總結
- 上一篇: C++11新增的关键字decltype(
- 下一篇: struct和class之间问题(+引发