C++之類與函式
1.類的作用域:①每個類都有自己的作用域,類成員都在類的作用域內,成員函式內可任意訪問成員變數和其他成員函式②物件可以通過.直接訪問公有成員,指向物件的指標通過->也可以直接訪問物件的公有成員③在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。
//類體外定義成員
class Student{
public:
char* _name;
public:
void show();
}
void Student::show()
{
cout<<_name<<endl;
}
//類內定義成員函式
class Student{
public:
char* _name;
public:
void show()
{
cout<<_name<<endl;
}
}
int main()
{
Student s1;
s1._name="peter";
s1.show();
Student s2;
s2._name="edwin";
s2.show();
return 0;
}
2.沒有成員的類空間大小為1
結構體記憶體對其規則: ①第一個成員在與結構體變數偏移量為0的地址處。②其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。 VS中預設的值為8 gcc中的預設值為4 ③結構體總大小為最大對齊數(每個成員變數除了第一個成員都有一個對齊數)的整數倍。 ④如果嵌套了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體 的對齊數)的整數倍。
3.隱含的this指標:①每個成員都有一個指標形參②編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件地址作實參傳遞給成員函式的第一個形參this指標。③this指標是成員函式隱含指標形參,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時 顯示傳遞物件的地址給this指標。
void display()
{
cout<<_year<<endl;
}
void display(data* this)
{
cout<<this->_year<<endl;
}
4.建構函式:成員變數變成私有的,需對它們進行初始化化,必須用一個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時 呼叫的函式稱為建構函式(constructor)
建構函式是特殊的成員函式:①函式名與類名同名②無返回值③建構函式可以過載④物件構造(物件例項化)時系統自動呼叫對應的建構函式⑤ 建構函式可以在類中定義,也可以在類外定義⑥如果類定義中沒有給出建構函式,則C++編譯器自動產生一個預設的建構函式,但只要我們定義了一個建構函式,系統就不會自動 生成預設的建構函式⑦無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有一個
class Date
{
public :
// 1.無參建構函式
Date ()
{
}
// 2.帶參建構函式
Date (int year, int month , int day )
{
_year = year ; _month = month ; _day = day ;
}
private :
int _year ; int _month ; int _day ;
};
void TestDate1 () {
Date d1 ; // 呼叫無參建構函式
Date d2 (2015, 1, 1); // 呼叫帶參的建構函式
Date d3 (); // 注意這裡沒有呼叫d3的建構函式定義出 d3
}
帶預設引數的建構函式:
class Date {
public : // 3.預設引數的建構函式
Date (int year = 2000, int month = 1, int day = 1)
{
_year = year ; _month = month ; _day = day ;
}
// 4.半預設引數的建構函式(不常用)
Date (int year, int month = 1)
{
_year = year ; _month = month ; _day = 1;
}
private :
int _year ; int _month ; int _day ;
};
void Test() {
Date d1 ; // 呼叫預設建構函式
Date d2 (2015, 1, 9); // 呼叫預設建構函式
}
注:若預設引數宣告和定義分離,則可以在宣告或定義中給預設參5.拷貝建構函式(建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(Copy Constructor),拷貝建構函式是特殊的建構函式。):一個建構函式的過載。建構函式無this。它的引數傳參必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。
class Date
{
public :
Date()
{
}
// 拷貝建構函式
Date (const Date& d)
{
_year = d ._year; _month = d ._month; _day = d ._day;
}
private :
int _year ; int _month ; int _day ;
};
void TestDate1 ()
{
Date d1 ; // 下面兩種用法都是呼叫拷貝建構函式,是等價的。
Date d2 (d1); // 呼叫拷貝建構函式
Date d3 = d1; // 呼叫拷貝建構函式
}
eg;
class date
{
public:
date(const date& d)
{
_year=d._year;
_month=d._month;
_day=d._day;
}
}
在類的成員變數中可以直接訪問同類物件的私有/保護成員,C++的訪問限定符是以類為單位的,也就是說在這個單位內的成員可以互相訪問。