深入理解c++成員函數

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

這裏寫圖片描述

發佈了66 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章