1、const成員函數:
在成員函數後面加const,const修飾this指針所指向的對象,也就是保證調用這個const成員函數的對象在函數內不會被改變
思考以下幾種場景
1. const對象可以調用非const成員函數和const成員函數嗎? x
2. 非const對象可以調用非const成員函數和const成員函數嗎? 對
3、const成員函數內可以調用其它的const成員函數非const成員函數嗎?
前對 後x
4、非const成員函數內可以調用其它的const成員函數非const成員函數嗎?對
權限可以被縮小,但是不可以被放大。const權限小,非const權限大
int a = 10;
int *p1 = &a;//值可以被改變
const int *p2 = &a;//把a的地址給給p2,通過改變p指向的內容改變值
int const*p3 = &a;//同上
p1 = p2; //不可以
p2 = p1;//可以 權限問題
///////////////////////////////////
//p1 、p2、p3都可以被改,p4,p5不能被改
int *const p4 = &a;//p4不能被改
const int* const p5 = &a;//都不能被改
2、inline(內聯)
以inline修飾的函數叫做內聯函數,編譯時C++編譯器會調用內聯函數的地方展開,沒有 函數壓棧的開銷,內聯函數提升程序運行的效率。
1. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的的函數不適宜使用內聯。
2. inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義爲inline的函數體內有循環/遞歸等等,編譯器優化時會忽略掉 內聯。
3. inline必須函數定義放在一起,才能成爲內聯函數,僅將inline放在聲明前是不起不作用的。
4. 定義在類內的成員函數默認定義爲內聯函數。
問題–C++建議以const/枚舉/內聯去替代宏,爲什麼?
宏的優點:
1. 增強代碼的複用性。
2. 提高性能。
宏也有很多缺點:
1. 不方便調試宏。(因爲預編譯階段進行了替換)
2. 導致代碼可讀性差,可維護性差,容易誤用。
3. 沒有類型安全的檢查。
3、友元函數: 在C++中友元函數允許在類外訪問該類中的任何成員,就象成員函數一樣,友元函數用關鍵字friend說明。
1. 友元函數不是類的成員函數。
2. 友元函數可以通過對象訪問所有成員,私有和保護成員也一樣
友元是突破訪問限定符的一種函數
#include<iostream>
#include<stdlib.h>
using namespace std;
class Date
{
friend bool operator<(Date& aa1, Date& aa2);//去掉則不能訪問類內的成員函數,b要訪問a必須在a中聲明b是a的朋友
public:
Date(int a1, int a2)
: _a1(a1)
, _a2(a2)
{}
private:
int _a1;
int _a2;
};
bool operator<(Date& aa1, Date& aa2)
{
return aa1._a1 < aa2._a2;
}
int main()
{
Date(1, 2);
Date(2, 3);
system("pause");
return 0;
}
友元類也是相同的聲明方法B要訪問A,就必須在A中聲名B;
class Time
{
// Date是Time 的友元,所以 Date可以訪問Time的所有成員。
**friend class Date;**
private :
int _hour ;
int _minute ;
int _second ;
};
class Date
{
public :
void Display ()
{
cout<<"year:" <<_year<< endl;
cout<<"month:" <<_month<< endl;
cout<<"day:" <<_day<< endl;// 定義爲友元類後,可以訪問Time類對象的所有成員
cout<<"hour:" <<_t. _hour<<endl ;
cout<<"minute:" <<_t. _minute<<endl ;
cout<<"second:" <<_t. _second<<endl <<endl;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
Time _t ;
};
void Test ()
{
Date d1 ;
d1.Display ();
}
4、static成員函數:
類的靜態成員
1. 類裏面static修飾的成員,成爲靜態類成員。
2. 類的靜態成員是該類型的所有對象對象所共享。
注意靜態成員函數沒有隱含this指針參數,所以可以使用類型::作用域訪問符直接調用靜態成員函數。
代碼如下:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Date
{
public:
Date()
{
cout << "Date()" << endl;
count++;
}
void Display()
{
cout << "年:" << _year << endl;
cout << "月" << _month << endl;
cout << "日" << _day << endl;
}
static void printcount()
{
cout << "Date count:" << count<<endl;
}
private:
int _year;
int _month;
int _day;
private:
static int count;//靜態成員變量,用於統計創建個數
};
int Date::count = 0;
void test()
{
Date d1, d2;
//訪問靜態成員
Date::printcount();
}
int main()
{
test();
system("pause");
return 0;
}
1)、靜態成員函數不可以訪問非靜態的成員
2)、 非靜態的成員函數可以訪問靜態成員
5、
Test1中調用了 _ 次AA的拷貝構造函數 _ 次AA的賦值運算符函數的重載。 Test2中調用了
次AA的拷貝構造函數,_ 次AA的賦值運算符函數的重載。 Test3中調用了 次AA的拷貝構造函數, 次AA的賦值運算符函數的重載。 class AA {}; AA f (AA a) { return a ; } void Test1 () { AA a1 ; a1 = f(a1); } void Test2 () { AA a1
; AA a2 = f(a1); }void Test3 () { AA a1 ; AA a2 = f(f(a1)); }
答案:
1) 2 1
2) 2 0
3) 3 0