每天學點C++

---------------------------------不積小流,無以成江海;不積跬步,無以至千里-------------------------------------

1.explicit主要用於 "修飾 "構造函數. 指明構造函數只能顯示使用,目的是爲了防止不必要的隱式轉化
2.基類派生子類時,希望派生類重寫哪些函數,需要由基類指定,指定方法爲加virtual修飾,不加virtual修飾則表明希望派生類繼承而非重寫該功能。
class A {
public:
       void bookName();
       virtual int bookPrice();
};
class B : public A {
public:
      virtual int bookPrice();
};
B::bookPrice不會調用A::bookPrice
但B::bookName 輸出的結果仍是A::bookName的

3.
#include<iostream>
using namespace std;
class A {
public:
     void bookNameA(string _string) {
            cout<<"A::bookName(string)"<<endl;
     }
     virtual int bookPrice() {
            cout<<"A::bookPrice()"<<endl;
     }

};
class B : public A {
public:
        virtual int bookPrice() {
             cout<<"B::bookPrice()"<<endl;
        }
       void bookName(string _string,string _etring) {
             cout<<"B::bookName(string,string)"<<endl;
       }
 //代替從A繼承
      void bookName(string _string) {
            cout<<"B::bookName(string)"<<endl;
     }
};
int main(){
        A a;
        B *b = new B;
       a.bookNameA("a");
       a.bookPrice();
       b->bookName("a","b");
       b->bookName("a");//若從A繼承,不在B中寫該函數,則會報錯,重新在B中寫一個和A同樣的情況,則不會報錯
        b->bookNameA("a");//A中該函數改名以後,則可以利用B的對象指針調用
        b->bookPrice();
        //b->bookName("a");
       delete b;
        b = NULL;
        return 0;
}
注意
 1:當B*b;而不是B*b = new B;時,程序會報段錯誤,爲什麼?
 2:class A中 bookNameA寫成bookName時,會報錯,A中的bookName(string)和B中的bookName(string,string)參數不同,B公有繼承A,同名不同參的函數爲何不能繼承?
 3:B中加入和A中同樣的函數,即同名不同參,只是不再是繼承而來,則程序不會報錯,爲什麼?
 4:當派生類從基類public繼承時,派生類的函數名和基類函數名相同時:(1)如果參數也相同,則子類覆蓋基類函數。如果基類爲virtual,這便是重寫(2)如果參數不同,則編譯報錯;然而在同

一個類內出現此種情況則不會報錯,這便是重載(重載:同一個類內的同名不同參的函數,重寫:通過繼承實現,不同類的同名同參且基類函數使用virtual修飾的函數)

4.
static_cast:DestType dest_type = static_cast<DestType>(SourceType) 將SourceType轉換成DestType類型的
mutable:將某個變量指定爲可修改的(正常情況下,const修飾的類對像的成員變量不可修改,使用mutable修飾某變量以後,該變量便可被修改)

5.
#include<iostream>
using namespace std;
class ConstTest{
public:
        ConstTest():a(0){}
        void changeValue()const;
private:
        int a;
};
void ConstTest::changeValue()const{

        cout<<"++a is "<<++a<<endl;
}
int main(){
        ConstTest _constTest;
        _constTest.changeValue();
return 0;
}
(1)編譯時報錯,因爲changeValue()爲const型函數,不能修改類的成員變量
(2)聲明和實現必須同時加const,否則編譯報錯(個人觀點:如果一個函數對成員變量操作比較頻繁,但又不希望該函數對成員變量做任何可能的改變,那就趕緊行動,在第一個{前面加上const吧)
(3)_constTest.changeValue();changeValue()函數有一個隱形的實參,當函數內對對應類類型的變量進行操作時,自動對應爲該函數所在對象的變量(猜測隱形實參應該就是this)

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