C++學習記錄二
強制型別轉化
C中:char *ptr; C++中:double num = 5;
int *p = (int *)ptr; int count =static_cast<int>num;
指標型別間轉化:reinterpret_cast<T>expr
Const int p = 5;
int num = const_cast<int>p;//去掉const屬性
面向物件的優點:
可維護,複用,擴充套件,靈活(活字印刷術)
面向物件的三大特點:封裝(維護)、繼承(複用)、多型(擴充套件)、[抽象也是特點]
類的宣告:
class Test
{
public:
intx_;//能在類外訪問
protected:
inty_;//類外不能訪問
private:
intz_;//類外不能訪問 }
int main()
{
Test t;
t.x_= 5;//public可能在類外進行訪問
cout<< “t.x_ = ” << t.x_ << endl;
return0;
=>t.x_= 5
t.y_= 6;//成員Test::y_不可訪問
t.z_= 7;//同上
}
不能在類內直接初始化
命名規範:
1、 類的命名:第一個字母大寫
2、 類內成員:名字_,如x_、y_、z_
3、 函式:駝峰命名,第一個單詞以小寫字母開始,每第二個單詞的首字母大寫或每個單詞首字母均大寫
類是一種使用者自定義的型別,宣告形式:
class 類名稱
{
public:
公有成員(外部介面)類與外部的介面,任何外部函式都可以訪問公有型別資料和函式
private:
私有成員 只允許本類中的函式訪問
protected:
保護成員 與private類似,差別:繼承與派生時對派生類的影響不同
};
*struct與class
1、用struct宣告類,如果對其成員不作private或public的宣告,系統將其預設為public(公用的);
2、用class定義的類,如果不作private或public宣告,系統將其預設為private(私有的);
3、結構體也支援限定,不能繼承,類可繼承
#include <iostream>
using namespace std;
Class Test
{
public:
intx_;
voidsetX(int x)
{
x_= x;
}
void setY(int y)
{
y_ = y;
}
void setZ(int z)
{
z_ = z;
}
int getx()
{
return x_;
}
int gety()
{
return y_;
}
int getz()
{
return z_;
}
}
int main()
{
Testt;
t.setX(5);
t.setY(6);
t.setZ(7);
cout<< “t.x_” << t.getX() <<endl;
cout<< “t.y_” << t.getY() << endl;
cout<< “t.z_” << t.getZ() << endl;
return0;
}
結果:
t.x_ = 5
t.y_ = 6
t.z_ = 7
類內定義的成員函式,編譯器預設為inline
類內成員函式可互相呼叫
成員函式定義在類外
Test.h Test.cpp Main.cpp g++ Main.cpp Test.cpp -o Main
Test.h
#ifndef _TEST_H
#define _TEST_H_
class Test
{
int x_;
int y_;
int z_;
public:
voidinitXYZ(int x, inty, int z);
voiddisplayXYZ();
};
#endif
Test.cpp
#include <iostream>
#include "Test.h"
using namespace std;
void Test::initXYZ(intx, int y, intz)
{
x_ = x;
y_ = y;
z_ = z;
}
void Test::displayXYZ()
{
cout << "t.x_= " << x_ << endl;
cout << "t.y_= " << y_ << endl;
cout << "t.z_= " << z_ << endl;
}
Main.cpp
#include <iostream>
#include "Test.h"
int main()
{
Test t;
t.initXYZ(1,2,3);
t.displayXYZ();
return0;
}
結果:
t.x_ = 1
t.y_ = 2
t.z_ = 3
成員函式可類內實現(預設inline)也可類外實現(一般採用類外)
封裝特點:保護成員屬性
Test* t1 = new Test();
t1->initXYZ(1,2,4);
物件的儲存模型
*物件的大小隻與成員屬性有關,與類中的方法無關 Test t1;
與結構體一樣的對齊方式。物件的大小有成員決定 Test t2;
方法共享在同一段空間
不同的物件使用的是同一個函式程式碼段,利用This指標來指向不同的物件
this指標:
保留呼叫物件地址,自動傳參
傳參時間:呼叫方法的時候,動態的呼叫完消失
前向宣告:
當一個類中要呼叫另一個類時
①包括標頭檔案(代價較大)
②前向宣告不能含有物件的實體,即前向宣告的類不能例項化。一定要是物件的指標或引用。
A.h
#ifndef _A_H_
#define _A_H_
#include "B.h"//加標頭檔案
class A
{
public:
A();
~A();
private: //加標頭檔案
B b; //加標頭檔案
};
#endif
B.h
#ifndef _B_H_
#define _B_H_
class A;//前向宣告
class B
{
public:
B();
~B();
private: //前向宣告
A *a; //前向宣告
};
#endif
A.cpp
#include <iostream>
#include "A.h"
using namespace std;
A::A()
{
cout << "initA!"<< endl;
}
A::~A()
{
cout << "destoryA!" << endl;
}
B.cpp
#include <iostream>
#include "B.h"
using namespace std;
B::B()
{
cout << "initB!" << endl;
}
B::~B()
{
cout << "destoryB!" << endl;
}
Main.cpp
#include <iostream>
#include "A.h"
#include "B.h"
int main()
{
return 0;
}