---------------------------------不積小流,無以成江海;不積跬步,無以至千里-------------------------------------
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)