
c++期末知識點快速復習,最全整理(四)
- 四、某些關鍵詞的用法
- 1.const限定詞
- 1.1.常物件
- 1.2.常成員函式
- 1.3.常資料成員
- 1.4.物件常參考
- 2.組合類
- 3.友元
- 3.1 介紹:
- 3.2 友元函式
- 3.3 友元類
- 4.this指標
- 5.static變數
- 5.1.定義
- 5.2.記憶體空間及初始化
- 5.3.static成員變數
- 5.4.static成員函式
四、某些關鍵詞的用法
1.const限定詞
1.1.常物件
將物件限定為const物件,即為常物件,
特性:
1.常物件在生存期它的所有資料成員都不可以改變
2.常物件在定義時就必須進行初始化,且不能被更新
3.常物件中的成員函式必須為常成員函式才能呼叫,否則就會出錯
const修飾形式:
1.const 類名 物件名([引數串列])
2.類名 const 物件名([引數串列])
代碼演示:假設已定義一個Time類,有年月日三個成員變數
Time const t1(2021,6,9);//定義t1常物件
//或const Time t1(2021,6,9);
注意:
如果一定要修改某個常物件的成員變數的值,可以將公式宣告為mutable
mutable int count;
這樣就可以用宣告為const的常成員函式來修改它的值,
1.2.常成員函式
常物件只能呼叫常成員函式,這樣保證常物件的資料成員不能修改,
特性:
1.函式實作時需要帶上const關鍵字
2.常成員函式不能更新物件的資料成員,也不能呼叫非常成員函式,
3.常成員函式只能呼叫常成員函式,常成員函式也能被普通物件呼叫,
呼叫形式:
//在Time物件中對gethour方法定義為const成員函式
int Time::gethour() const
{
}
const關鍵字可以被用于參與對多載函式的區分,
const成員函式進行非const版本的多載,
編譯器可以根據情況選擇相應的多載函式,
如果物件是const,使用const版本的多載函式,如果是非const,使用非const版本的多載函式,
注意:
解構式和建構式不能進行const宣告,
因為建構式必須能夠修改物件,解構式需要對物件的記憶體進行回收,
1.3.常資料成員
使用const宣告的資料成員為常資料成員,
對于常資料成員,任何函式都不能對它進行賦值,也不能通過建構式賦值的方法進行賦值,只能通過初始化器進行賦值,
初始化器進行賦值:
class Time
{
private:
const int hour;
const int second;
const int minute;
};
Time::Time(int h,int s,int m)
:hour(h),second(s),minute(m)
{ }//注意花括號不能省略
1.4.物件常參考
物件的參考就是該物件的別名,物件名和參考名都指向相同的記憶體單元,
可以認為物件名和參考名的作用相同,屬于同一個東西,就像一個人有兩個名字一樣,
使用場景:
希望通過參考名只能呼叫物件中的公有成員,而不能修改它們
宣告形式:
const 類名 &參考名 = 物件名;
Time t1;
const Time &t2 = t1;//t1和t2指向同一段記憶體
偷來一張圖,嘿嘿,總結一下~

2.組合類
定義:在一個類的資料成員中出現一個或多個類的物件,那這個類就叫做組合類,
組合類建構式定義的一般形式為:
類名::類名(形參表):內嵌物件1(形參表), 內嵌物件2(形參表),…
{
//類的初始化
}
其中,“內嵌物件1(形參表), 內嵌物件2(形參表),…”為初始化串列,用來完成對內嵌物件的初始化,
注意:
如果有多個內嵌物件,需要按它們在類中的宣告順序來呼叫他們對應的建構式,最后在執行本類的建構式,
#include<bits/stdc++.h>
using namespace std;
class Location
{
private:
string loc;
public:
Location(string s):loc(s){}
};
class Time
{
private:
int hour;
int minute;
int second;
Location l;
public:
Time(int h,int m,int se,string s):l(s)
{
hour = h;
minute = m;
second = se;
}
};
int main()
{
Time t(12,12,12,"China");
return 0;
}
3.友元
3.1 介紹:
在一個類中,使用關鍵字friend將別的模塊(一般函式、其它類的成員函式或其它類)宣告為本類的友元,這樣類中本來隱藏的資訊(私有和保護成員)就可以被友元訪問,
可以說是friend為訪問本類開了一個特殊的權限,本來內部的私有成員和保護成員不可以被外界訪問,但是宣告為friend的函式在外部可以訪問到本類的私有成員,
友元提供了不同類或物件的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制,
注意:
友元并不是類的成員,
3.2 友元函式
1、在類體內說明,在函式的型別說明符前加關鍵字friend;
2、在類體外定義,定義格式與普通函式相同;
3、友元函式是非成員函式,在呼叫上與普通函式相同;
4、友元函式可以直接訪問該類中的私有成員,
下面以多載輸入輸出運算子為例來說明:
//實作對復數類的輸入輸出
#include<iostream>
using namespace std;
class CComplex
{
private:
double real,imag;
public:
CComplex(double r=0,double i=0):real(r),imag(i){}
//內部宣告
friend istream& operator >> (istream& in,CComplex &c);
friend ostream& operator << (ostream& out,CComplex c);
};
//外部實作
istream& operator >> (istream& in,CComplex &c)
{
cout<<"請輸入實部和虛部\n";
in >> c.real >> c.imag;
return in;
}
ostream& operator << (ostream& out,CComplex c)
{
if(c.imag<0)//虛部小于0
{
out<<c.real<<c.imag<<"i\n";
return out;
}
else if(c.imag==0)//虛部等于0
{
out<<c.real<<'\n';
return out;
}
else //虛部大于0
{
out<<c.real<<"+"<<c.imag<<"i\n";
return out;
}
}
int main()
{
CComplex cc;
cin>>cc;
cout<<cc;
return 0;
}
3.3 友元類
當說明一個類為另一個類的友元時,友元類中的所有成員函式都是另一個類的友元函式,
也就是說友元類中的所有成員函式都可訪問該類的私有變數,
宣告形式:
friend class 類名;
注意:
1.友元關系不能傳遞,B類是A類的友元,C類是B類的友元,但C類并不是A類的友元,
2.友元關系是單向的,若B類是A類的友元,B類成員函式可以訪問A類的私有變數,但是反過來A類成員函式并不能訪問B類的私有變數,
4.this指標
this指標表示正在呼叫函式物件的地址,
什么意思呢?
當物件s 呼叫 s.set(2,15,1998) 時,成員函式除了接收傳遞的3個引數外,還接收到正在呼叫成員函式的物件s 的地址,這個地址放入隱含的形參this 指標中,
等同于執行 this=&s; 陳述句,
所以對成員函式內資料成員的訪問都隱含地加上了this 指標,
因此, month=m;
等價于 this->month=m; 或 s.month=m;
this指標存的就是目前本物件的地址,
this指標的一個用處:
當成員函式中出現和成員變數同名的變數時,系統無法區分這些變數,使用this指標可以指向本類的成員變數,而另外一個變數就可以使用
Time(int hour,int minute,int second)
{
this->hour = hour;//把引數hour的值賦給類中的hour私有變數
this->minute = minute;
this->second = second;
}
以下是完整的代碼:
#include<iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
Time(int hour,int minute,int second)
{
this->hour = hour;
this->minute = minute;
this->second = second;
}
void print()
{
//下面兩種方式是一樣的,都代表本類的成員變數
// cout<<hour<<":"<<minute<<":"<<second<<'\n';
cout<<this->hour<<":"<<this->minute<<":"<<this->second<<'\n';
}
};
int main()
{
Time t(12,12,12);
t.print();
return 0;
}
輸出結果:
12:12:12
5.static變數
5.1.定義
引入static變數,表示這個變數為某個類的所有物件所共用,不單獨屬于某個物件,而是屬于整個類,
靜態資料成員的值對所有物件都是一樣的,如果改變它的值,則各物件中該資料成員的值都同時改變,
下面一個圖可以表示:

在類作用域內,可以通過類名和域運算子“∷”參考靜態資料成員,而不論類物件是否存在,
5.2.記憶體空間及初始化
-
記憶體空間
靜態資料成員不隨物件的建立而分配空間,也不隨物件的撤銷而釋放,
靜態資料成員是在程式編譯時被分配空間的,到程式結束時才釋放空間, -
初始化
- 不能用建構式初始化賦值;
- 不能放在主函式中初始化;
- 在程式定義該類的任何物件之前,對類中的static資料成員單獨初始化;
初始化形式:
資料型別 類名::static資料成員名 = 初始化值;
注:
- 在初始化陳述句中不必加static,
- 如果未對靜態資料成員賦初值,則編譯系統會自動賦予初值0,
5.3.static成員變數
static成員變數宣告為公有時,外部可以通過三種方式訪問到:
- 通過物件名打點訪問
- 通過類名和域運算子“∷”參考靜態資料成員
- 通過靜態成員函式進行訪問,~靜態成員函式下面會介紹,
如果宣告為私有的變數,只能通過內部的成員函式間接訪問,
代碼演示:
#include<iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
static int year;//靜態變數
Time(int hour,int minute,int second)
{
this->hour = hour;
this->minute = minute;
this->second = second;
}
void print()
{
cout<<"year:"<<year<<"\n";
cout<<hour<<":"<<minute<<":"<<second<<'\n';
}
};
int Time::year = 2021;//靜態變數初始化
int main()
{
//訪問靜態公有的變數
cout<<"year:"<<Time::year<<"\n";
Time t1(12,12,12),t2(10,10,10);
t1.print();
t2.print();
return 0;
}
運行結果:
year:2021
year:2021
12:12:12
year:2021
10:10:10
可以看到上面的year都是2021,所有的Time物件公用一個靜態資料year,
5.4.static成員函式
靜態成員函式與靜態成員變數幾乎是一樣的道理,表示對于同一個類的所有物件共享的成員函式,一般宣告為公有,
注意:
- 靜態成員函式沒有this指標,靜態成員函式不屬于某個物件,為該類的所有物件共享,所以靜態成員函式沒有this指標
- 靜態成員函式可以通過類名或物件直接訪問
- 靜態成員函式只能直接訪問靜態成員變數(函式),而不能直接訪問普通成員變數(函式)
代碼示例:
#include<iostream>
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
static int year;
Time(int hour,int minute,int second)
{
this->hour = hour;
this->minute = minute;
this->second = second;
}
static void print();
};
int Time::year = 2021;//靜態變數初始化
void Time::print()
{
cout<<"year:"<<year<<"\n";
}
int main()
{
cout<<"year:"<<Time::year<<"\n";
Time t1(12,12,12),t2(10,10,10);
t1.print();
t2.print();
return 0;
}
運行結果:
year:2021
year:2021
year:2021
偷張圖總結以下,嘿嘿嘿~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287422.html
標籤:其他
