const成員函數,內聯函數,友元函數,static成員

原文鏈接:https://blog.csdn.net/qq_38646470/article/details/79795538
專欄鏈接:https://blog.csdn.net/column/details/20026.html
[TOC]
#1.const成員函數
const修飾成員函數
在成員函數後面加const,const修飾this指針所指向的對象,也就是保證調用這個const成員函數的對象在函數內不會被改變。

class Date
{
public :
void Display ()
{
    cout<<"year:" <<_year<< endl;
    cout<<"month:" <<_month<< endl;
    cout<<"day:" <<_day<< endl<<endl ;
}

void Display () const
{
    cout<<"year:" <<_year<< endl;
    cout<<"month:" <<_month<< endl;
    cout<<"day:" <<_day<< endl<<endl;
}
private :
    int _year ; // 年
    int _month ; // 月
    int _day ; // 日
};
void Test ()
{
    Date d1 ;
    d1.Display ();
    const Date d2;
    d2.Display ();
}

const對象不可以調用非const成員函數可以調用const成員函數
非const對象可以調用非const成員函數和const成員函數
const成員函數內可以調用其它的const成員函數不可以調用非const成員函數
非const成員函數內可以調用其它的const成員函數非const成員函數

#2.內聯函數
以inline修飾的函數叫做內聯函數,編譯時C++編譯器會調用內聯函數的地方展開,沒有函數壓棧的開銷,內聯函數提升程序運行的效率。

. inline是一種以空間換時間的做法,省去調用函數額開銷。所以代碼很長或者有循環/遞歸的的函數不適宜使用內聯。
. inline對於編譯器而言只是一個建議,編譯器會自動優化,如果定義爲inline的函數體內有循環遞歸等等,編譯器優化時會忽略掉內聯。
. inline必須函數定義放在一起,才能成爲內聯函數,僅將inline放在聲明前是不起不作用的。
. 定義在類內的成員函數默認定義爲內聯函數。

但是在一般的編譯器下看不出內聯函數的效果,因爲編譯器會自動優化。接下來給大家在linux下查看。

#3.友元
友元函數:
在C++中友元函數允許在類外訪問該類中的任何成員,就象成員函數一樣,友元函數用關鍵字friend說明。
. 友元函數不是類的成員函數。
. 友元函數可以通過對象訪問所有成員,私有和保護成員也一樣。
友元函數:

友元類:

#4.static成員

#5.N中構造拷貝構造的優化
看一段代碼:

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));
} 

回答下面的問題:
Test1中調用了次AA的拷貝構造函數。
Test2中調用了
次AA的拷貝構造函數。
Test3中調用了___次AA的拷貝構造函數。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章