音樂網(wǎng)站開發(fā)畢業(yè)論文創(chuàng)建網(wǎng)站需要多少資金
這篇文章的主要內(nèi)容是const以及權(quán)限問題、static關(guān)鍵字、友元函數(shù)和友元類,希望對(duì)大家有所幫助,點(diǎn)贊收藏評(píng)論支持一下吧!
更多優(yōu)質(zhì)內(nèi)容跳轉(zhuǎn):
專欄:重生之C++啟程(文章平均質(zhì)量分93)
目錄
const以及權(quán)限問題
1.const修飾內(nèi)置類型
(1).const修飾普通變量
(2).const修飾指針變量
2.const修飾自定義類型
3.const修飾函數(shù)
(1).const修飾函數(shù)形參
(2).const修飾函數(shù)返回類型
4.權(quán)限的放大、縮小、平移
static的效果
(1).靜態(tài)成員變量
(2).靜態(tài)成員函數(shù)
友元函數(shù)&友元類
(1).友元函數(shù)
(2).友元類
const以及權(quán)限問題
1.const修飾內(nèi)置類型
const名叫常量限定符,用來(lái)限定特定變量,使得這個(gè)變量不可被修改,這在特定的情況是非常實(shí)用的,比如一些只讀不可寫的變量,可以用const來(lái)限定。
(1).const修飾普通變量
在C++或者C語(yǔ)言中,const修飾普通變量的形式如下:
const int a = 10;
也可以將const和變量相鄰
int const a = 10;
對(duì)于普通變量,這兩種寫法是一樣的,都是限制a變量,使得a變量不可被修改。
強(qiáng)行修改會(huì)出現(xiàn)編譯錯(cuò)誤。這就是常量限定符的作用。
(2).const修飾指針變量
先給出變量a的指針p
int a = 10;
int* p = &a;
這里兩點(diǎn)非常重要:const直接修飾p,會(huì)導(dǎo)致p不可改變,即指針指向不能改變。
? ? ? ? ? ? ? ? ? ??????????????const直接修飾*p,會(huì)導(dǎo)致*p不可改變,即指針指向的內(nèi)容不可改變。
此時(shí),會(huì)出現(xiàn)以下三種const對(duì)指針變量p的修飾
(1)const int* p = &a;
等價(jià)寫法:int const * p = &a;
此時(shí),const在*p前面,直接修飾*p,即指針指向的內(nèi)容(*p)不可改變,但指針指向(p)可以改變。
(2)int* const p = &a;
此時(shí),const在p前面,直接修飾p,即指針指向(p)不可改變,指針指向的內(nèi)容(*p)可以改變。?
(3)const int* const p = &a;
此時(shí)const雙重限定,既在*p前面,又在p前面,即指針指向(p)和指針指向內(nèi)容(*p)都不可改變。?
2.const修飾自定義類型
const也可以修飾自定義類型對(duì)象,賦予對(duì)象常屬性,保護(hù)對(duì)象內(nèi)的成員變量不可被修改。const對(duì)象調(diào)用它的成員函數(shù)時(shí),this指針也是const類型。
有關(guān)this指針詳細(xì)介紹:重生之我要學(xué)C++第三天(類和對(duì)象)_無(wú)極太族的博客-CSDN博客
用Date類來(lái)舉例:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{const Date d1;//創(chuàng)建const類型對(duì)象d1return 0;
}
此時(shí),用d1調(diào)用成員函數(shù)
d1.Print();
會(huì)出現(xiàn)編譯錯(cuò)誤。原因是const對(duì)象調(diào)用成員函數(shù)時(shí),傳給成員函數(shù)的this指針也是const類型。
但是此時(shí)成員函數(shù)的隱式形參是非const類型的this指針
void Print(Date* const this)//這個(gè)const是默認(rèn)的,保證指向不能改變但是指向的內(nèi)容還是可以改變
就會(huì)將const對(duì)象指針傳給非const對(duì)象指針,涉及權(quán)限的放大:const對(duì)象的成員變量是不可以修改的,但是這個(gè)this指針只是指向不能改變,指向的內(nèi)容還是可以改變。
要想解決這個(gè)問題,就需要將成員函數(shù)內(nèi)的隱式形參this指針改為const類型。下面介紹const和函數(shù)有關(guān)概念來(lái)解決這個(gè)問題。
3.const修飾函數(shù)
(1).const修飾函數(shù)形參
const修飾函數(shù)形參的作用是用const類型對(duì)象來(lái)接收實(shí)參,保證實(shí)參不會(huì)被改變。在成員函數(shù)中,形參還有隱式的this指針,用來(lái)接受對(duì)象的地址。但是由于這個(gè)形參是隱式的,我們無(wú)法直接將其改為const類型。這時(shí)只需要在成員函數(shù)后面加上const
void Print()const
{cout << _year << "/" << _month << "/" << _day << endl;
}
相當(dāng)于給隱式的this指針加上const(前面的const)
void Print(const Date* const this)
這樣const對(duì)象就可以調(diào)用對(duì)象的這個(gè)const成員函數(shù)了。?
在這里const加在*this前面,意味著this指向?qū)ο蟮膬?nèi)容不可以改變。
const修飾this指針還可以構(gòu)成函數(shù)重載:在對(duì)象調(diào)用的時(shí)候,const對(duì)象和非const對(duì)象分別調(diào)用
const void Print()const //const對(duì)象調(diào)用:只讀
{cout << _year << "/" << _month << "/" << _day << endl;
}
void Print() //非const對(duì)象調(diào)用:可讀可寫
{cout << _year << "/" << _month << "/" << _day << endl;
}
(2).const修飾函數(shù)返回類型
const修飾函數(shù)的返回類型可以限制對(duì)象,保證返回對(duì)象不可被改變。
4.權(quán)限的放大、縮小、平移
在C++中,權(quán)限只能平移,縮小。禁止放大。例如:
const int a = 10;int& b = a;
此時(shí)會(huì)出現(xiàn)編譯錯(cuò)誤,因?yàn)閍是const類型,不能改變。但是引用b不是const類型,b可以間接改變a,所以會(huì)編譯錯(cuò)誤。?這就是權(quán)限的放大。
const int a = 10;
const int& b = a;
這樣就是權(quán)限的平移。
int a = 10;
const int& b = a;
這就是權(quán)限的縮小。?
注意:隱式類型轉(zhuǎn)換中間會(huì)生成臨時(shí)變量,臨時(shí)變量具有常性。
舉個(gè)栗子:
double d = 1.1;
int& a = d;
此時(shí)編譯錯(cuò)誤,原因不是類型不匹配,而是d賦值給int類型引用a時(shí),會(huì)將d先隱式類型轉(zhuǎn)換為const int& 類型,這時(shí)候只需將代碼改為
double d = 1.1;
const int& a = d;
就可以通過編譯。?
static的效果
定義:聲明為static的類成員稱為類的靜態(tài)成員,用static修飾的成員變量,稱之為靜態(tài)成員變量;用 static修飾的成員函數(shù),稱之為靜態(tài)成員函數(shù)。靜態(tài)成員變量一定要在類外進(jìn)行初始化。
(1).靜態(tài)成員變量
在類中static修飾的變量稱為靜態(tài)成員變量,由于static修飾,該成員變量在靜態(tài)區(qū)存放,屬于該類。類的所用對(duì)象公用,并不單獨(dú)屬于某個(gè)對(duì)象(這個(gè)特點(diǎn)和成員函數(shù)類似),所以靜態(tài)成員變量的定義不在參數(shù)列表中,必須在類外面進(jìn)行定義,類里負(fù)責(zé)靜態(tài)成員變量的聲明。
#include<iostream>
using namespace std;
class A
{
private:static int _a;//聲明
};
int A::_a = 0;//類外定義
int main()
{A a;return 0;
}
(2).靜態(tài)成員函數(shù)
在類中static修飾的成員函數(shù)稱為靜態(tài)成員函數(shù),由于static修飾,該成員函數(shù)屬于類。由于靜態(tài)成員函數(shù)沒有隱式this指針,在特定對(duì)象調(diào)用時(shí),只能訪問該類的靜態(tài)成員變量,不能訪問對(duì)象的非靜態(tài)成員變量??梢灶惷?:靜態(tài)成員函數(shù)名 直接調(diào)用。
補(bǔ)充,類外面突破類域的三種方式(友元下面介紹):
不使用友元訪問成員變量或者成員函數(shù)必須是共有的。
1.創(chuàng)建對(duì)象,通過 對(duì)象. ? ? ? ? ? 適用于訪問公有(靜態(tài)、非靜態(tài))成員變量和函數(shù)。
2.對(duì)象指針,通過 指針-> ? ? ? ?當(dāng)指針為空時(shí),可以訪問公有成員函數(shù)(靜態(tài)非靜態(tài))和公有靜態(tài)成員變量。因?yàn)楣谐蓡T函數(shù)和公有靜態(tài)成員變量都不屬于對(duì)象,不會(huì)有解引用空指針的錯(cuò)誤。當(dāng)指針不為空,和對(duì)象的訪問權(quán)限相同。
3.通過 類名:: ? ? ?適用于訪問公有靜態(tài)成員變量和公有靜態(tài)成員函數(shù)。此處只能訪問屬于類的靜態(tài)屬性的成員。
友元函數(shù)&友元類
(1).友元函數(shù)
定義:友元函數(shù)可以直接訪問類的私有成員,它是定義在類外部的普通函數(shù),不屬于任何類,但需要在類的內(nèi)部聲明,聲明時(shí)需要加friend關(guān)鍵字。例如:
#include<iostream>
using namespace std;
class A
{friend void Print(A& a);//友元函數(shù)聲明
private:int _a=1;
};
void Print(A& a)//友元函數(shù)定義
{cout << a._a << endl;//friend就可以直接訪問類的私有成員
}
int main()
{A a;Print(a);return 0;
}
注意:
1.友元函數(shù)不能用const修飾
2.一個(gè)函數(shù)可以是多個(gè)類的友元函數(shù)
(2).友元類
友元類可以直接訪問類的私有成員,友元類和另一個(gè)類相互獨(dú)立,只允許該類的友元類訪問該類的私有成員,不允許該類訪問友元類的私有成員。
class Time
{friend class Date; // 聲明日期類為時(shí)間類的友元類,則在日期類中就直接訪問Time類
中的私有成員變量
public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接訪問時(shí)間類私有的成員變量_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year;int _month;int _day;Time _t;
};
友元類特性:
1.友元關(guān)系是單向的,不具有交換性。 比如上述Time類和Date類,在Time類中聲明Date類為其友元類,那么可以在Date類中直接 訪問Time類的私有成員變量,但想在Time類中訪問Date類中私有的成員變量則不行。
2.友元關(guān)系不能傳遞 如果C是B的友元, B是A的友元,則不能說明C時(shí)A的友元。
3.友元關(guān)系不能繼承。
今天的分享就到這里啦,如果對(duì)大家有幫助的話,記得收藏,希望程序猿們可以三連支持以下,會(huì)繼續(xù)分享知識(shí)!謝謝閱讀!