91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

友元函數<<的模板化

發布時間:2020-06-06 07:29:01 來源:網絡 閱讀:607 作者:匯天下豪杰 欄目:移動開發

1、構造函數的一種使用

int main(void){
    //Test t1 = 10;// 在構造函數中尋找只有一個參數的
    
    //手動的調用構造函數;
    Test t2 = Test(1, 2);  //直接調用構造函數--->匿名對象;
    //直接調用Test的有參構造函數,初始化t2對象;  只會調用一次構造函數(直接把匿名對象轉成t2);
    
}


2、構造與賦值語句

Test g(){
    
    //返回為對象,我就給你返回一個新的對象(匿名對象);
}

int main(void){
    Test t1(1, 2); 
    Test t2; 

    Test t3 = t1; //用t1初始化t3,調用拷貝構造函數;
    Test t3(t1);
    t2 = t1; //利用t1給t2賦值,調用賦值語句;

    Test m = g(); //函數的返回值為對象,用匿名對象初始化m,此時C++編譯器將直接把匿名對象轉化為有名對象m;
    m = g();//此時匿名對象將沒有用,賦值完成,沒有轉正,將被析構

}

//在定義類時,只要你寫了構造函數,則必須要用你自己寫的,此時C++編譯器將不會給你提供默認的構造和拷貝構造函
數


3、構造函數的執行順序

  執行順序:先執行被組合對象的構造函數,如果有多個,按定義順序執行,而不是按初始化列表的順序執行;
  析構函數的調用順序相反;

  初始化列表用來給const屬性賦值;

代碼如下:

#include<iostream>
using namespace std;

class A{
    public:
        A(int a){ 
            m = a;
        }   
    private:
        int m;
};
    //在構造中調用構造函數是一種危險的行為,里面是一個匿名對象;用完立即調用析構,
    //參數列表也可以在拷貝構造函數上面使用;
class B{
    public:  //構造函數的初始化列表:解決,在B類中,組合了A類對象,
            //根據構造函數的規則,寫了A類的構造函數,必須要用;
        B(int q, int a, int b, int c) : a1(b), a2(c), c(0){
            x = q;
            y = a;
        }   
    //執行順序:先執行被組合對象的構造函數,如果有多個,按定義順序執行,而不是按初始化列表的順序執行;
    //析構函數的調用順序相反;
    //構造調用順序:a1、a2、b
    //初始化列表用來給const屬性賦值;
    private:
        int x;
        int y;
        A a1;
        A a2;
        const int c;  //常量c必須初始化(通過參數列表)
};

int main(void){
    B b(1, 2, 3, 4);
}


4、new和delete

  new能執行類的構造函數,delete能行類的析構函數;

  malloc free new delete可以互換使用,只不過new先開辟空間-->調用構造;delete--->先析構,在釋放空間;


5、static

  靜態成員不占這個類的字節的大小;------->不屬于這個實例的,相當于全局變量;

(1)、代碼如下:

#include<iostream>
using namespace std;

class A{
    public:
        A(){}
        int getD(){
            return d;
        }
        void Add(){
            d++;
        }   
        static void getC(){ //靜態成員函數;
            //靜態方法只能調用靜態的成員、函數;
            cout<<"d:"<<d<<endl;

        }   
    private:
        int a;
        int b;
        int c;
        static int d;  //靜態成員變量
};

int A::d = 10; 

int main(void){
    A a;
    cout<<a.getD()<<endl;
    A::getC();

    cout<<sizeof(a)<<endl; //靜態成員不占這個類的字節的大小;
}

(2)、運行結果:

友元函數<<的模板化


6、賦值語句(重載=運算符難點)
  i>、先把舊的內存釋放掉;
  ii>、返回一個引用;  為了支持連等;
  iii>、根據大小分配內存;


7、繼承中的字節大小

  子類繼承父類,在訪問上有所限制,但是在內存空間上對屬性成員是全部的繼承了下來;靜態變量在全局區,所以對靜態變量不計入字節大小的計算;

  class M{};//空的類,占一個標示,1字節;


8、函數模板

  普通函數的調用:可以進行隱式的類型轉換
  函數模版的調用:將嚴格按照類型進行匹配,不會進行自動類型轉換;


9、友元函數的模板化

對友元函數實現<<運算符重載

(1)、代碼如下:

#include<iostream>
using namespace std;


//結論:友元函數的類模版比較復雜;

template<typename Type>
class Complex; //類的前置聲明
template<typename Type>
ostream& operator<<(ostream &out, const Complex<Type> &c);//友元函數的前置聲明


template<typename Type>
class Complex{
    public:
        friend ostream& operator<<<Type>(ostream &out, const Complex<Type> &c); //對<<的后面加上<Type>
;進行友元函數的模版化;
        Complex(Type a, Type b); 
        Complex(const Complex &c){}
        Complex& operator=(const Complex &c){}
        ~Complex(){}
    public:
        void printComplex();
        Complex operator+(const Complex &c);
    private:
        Type a;
        Type b;
};

//成員函數實現 + 
template<typename Type>
Complex<Type>::Complex(Type a, Type b){
    this->a = a;
    this->b = b;
}
template<typename Type>
void Complex<Type>::printComplex(){
    cout<<"a:"<<a<<" b:"<<b<<endl;

}
template<typename Type>
Complex<Type> Complex<Type>::operator+(const Complex<Type> &c){
    return Complex(a+c.a, b+c.b);
}

//友元函數實現<<運算符重載
template<typename Type>
ostream& operator<<(ostream &out, const Complex<Type> &c){
    out<<"("<<c.a<<", "<<c.b<<")";

    return out;   
}
int main(void){
    Complex<int> c1(1, 2);
    Complex<int> c2(3, 4);
    Complex<int> c3 = c1 + c2;
    cout<<c3<<endl;
    c3.printComplex();

    return 0;
}

(2)、運行結果

友元函數<<的模板化




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大竹县| 定南县| 商河县| 延长县| 彝良县| 北辰区| 库车县| 盱眙县| 隆尧县| 祥云县| 桐柏县| 锦屏县| 大连市| 柳江县| 河津市| 麻城市| 开原市| 东兰县| 平定县| 霍邱县| 平远县| 三台县| 徐水县| 商南县| 肥乡县| 敦化市| 灵山县| 湘潭市| 阳东县| 肃南| 托克逊县| 桂阳县| 黑河市| 韩城市| 佛冈县| 登封市| 同德县| 金塔县| 永仁县| 永修县| 施甸县|