面對對象:將系統看成對象的集合,對象之間通過交互作用來完成系統特定功能;
面對對象編程的特點:繼承、封裝、多態;
進入主題:
1.類的聲明
class 類名稱{
public:
公有成員(外部接口,允許來自類外的訪問)
private:
私有成員(只允許本類的函數訪問,類外部的任何函數不能訪問)
protected:
保護成員(與private類似,差別表現在繼承與派生)
}
2.成員函數
demo1.cpp
#include<iostream>
using namespace std;
class Test{
public:
int x_;
void init(int x,int y,int z);
void display(){
cout<<x_<<endl;
};
private:
int y_;
protected:
int z_;
};
void Test::init(int x,int y,int z){
x_=x;
y_=y;
z_=z;
}
int main(){
Test t;
t.init(1,2,3);
t.display();
return 0;
}
類內實現成員函數叫做內聯函數:如display();
類外實現成員函數:Test::init()
標準寫法:Test.h-放類的聲明
Test.cpp-放類的定義
main.cpp-主函數
3.class VS struct
class數據成員默認私有
struct數據成員默認公有
demo2.cpp
#include<iostream>
using namespace std;
class Test{
int x_;
int y_;
int z_;
};
struct Test1{
int x_;
int y_;
int z_;
void initXYZ(int x,int y,int z){
x_=x;
y_=y;
z_=z;
}
};
int main(){
Test t1;
Test1 t2;
//t1.x_=5;私有成員,必須通過成員函數來進行訪問
t2.x_=5;
t2.initXYZ(6,7,8);
cout<<sizeof(t1)<<endl;
cout<<sizeof(t2)<<endl;
system("pause");
return 0;
}
輸出結構一致,都爲12;對象大小與成員函數無關,只與成員變量有關;
當加入一個char成員時,結果變爲16,類遵循字對齊
4.對象的存儲模型
this 指針的作用:成員方法是共享的,怎麼辨別是哪個對象調用的方法?
this指針保存調用方法對象的地址
5.類的作用域
前項聲明:可以只聲明而不定義它。這個聲明有時被稱爲前向聲明。在聲明之後,定義之前,類是一個不完全類型,即只知是一個類,但不知道類中具體包含哪些成員。不完全類型只能以有限方式使用,不能實例化,只能用於定義指向該類型的指針及引用,或者用於聲明使用該類型作爲形參類型或者返回類型的函數。
class A;
class B{
public:
A* m_a;//不能用A m_a
}
#include "A.h"
class B{
public:
A* m_a;//(或者A m_a)
}
前向聲明的好處是:
不必要的#include 會增加編譯時間.
混亂隨意的#include可能導致循環#include,可能編譯錯誤;
6.嵌套和局部類
從作用域看,嵌套類被隱藏在外圍類之中,只能在外圍類中使用。如果在外圍類的作用域使用時,需要加名字限定。
嵌套類中的成員函數可以在它的類體外定義
嵌套類的成員函數對外圍類沒有訪問權,反之亦然
嵌套類僅僅是語法上的嵌入
demo4.c
#include<iostream>
using namespace std;
class Test{
public:
int x_;
class Inner{
public:
int num;
void func()
};
};
void Test::Inner::func(){
cout<<"hello world!"<<endl;
}
int main(){
class LocalClass//局部類
{
void func(){
}
};
Test t;
Test::Inner n;//定義嵌套類對象
t.x_==1;
cout<<t.x_<<endl;
n.num=2;//訪問嵌套類的成員
cout<<n.num<<endl;
n.func();//訪問嵌套類的成員方法
return 0;
}
7.局部類
定義在函數體內的類爲局部類,只在定義它的局部域可見。局部類的成員函數不惜被定義在類體中。
局部類中不能有靜態成員。