對象指的是類的實例,類不佔有內存空間,只有實例化出的對象佔內存空間。空類對象(無成員變量的類)的大小是1,因爲空類同樣可以被實例化,每個實例在內存中都有獨一無二的地址。
class A {}; int main() { A a; cout<<sizeof(a)<<endl;//1 }
面向對象的三大特性:封裝、繼承、多態
有三種訪問限定符:public、protected、private
1. public成員可從類外部直接訪問,private/protected成員不能從類外部直接訪問。
2. 每個限定符在類體中可使用多次,它的作用域是從該限定符出現開始到下一個限定符之前或類體結束前。
3. 類體中如果沒有定義限定符,則默認爲私有的。
4. 類的訪問限定符體現了面向對象的封裝性。
類的作用域
1. 每個類都定義了自己的作用域,類的成員(成員函數/成員變量)都在類的這個作用域內,成員函數內可任意訪問成員變量和其它成員
函數。
2. 對象可以通過 . 直接訪問公有成員,指向對象的指針通過 -> 也可以直接訪問對象的公有成員。
3. 在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。
類實例化對象
1.類只是一個模型一樣的東西,限定了類有哪些成員,定義出一個類並沒有分配實際的內存空間來存儲它。
2.一個類可以實例化出多個對象,實例化出的對象佔用實際的物理空間存儲類成員變量。
3.做個比方。類實例化出對象就像現實中使用建築設計圖建造出房子,類就像是設計圖,只設計出需要什麼東西,但是並沒有實體的建築
存在,同樣的類也只是一個設計,實例化出的對象才能實際存儲數據,佔用物理空間。
#include <iostream> using namespace std; class student { public: void display(); void display() { cout<<"name:"<<_name<<" "<<"age"<<_age<<endl; } public: char *_name; int _age; }; void student::display() { cout<<"name:"<<_name<<" "<<"age"<<_age<<endl; } void test() { student s1; student *p = &s1; s1._name = "sam"; s1._age = 14; p->_name = "mike"; p->_age = 15; //s1._num = "195947"; //s1._sex = "nan"; s1.display(); p->display(); } int main() { test(); }
類對象存儲模型
所以每個對象的大小爲類中所有成員變量的大小之和,當然這裏也遵循內存對齊原則。
class A { char ch ; double d ; }; class B { char ch1 ; A a ; char ch2 ; }; int main() { A a; B b; cout<<sizeof(a)<<endl;//16 cout<<sizeof(b)<<endl;//32 return 0; }