今天總結一周來的學習。學習的主要內容是c++基礎知識,主要從下面幾個主要的點總結: 模板基類
連結 基類中調用虛函數多態失效了 基類中虛解構函式的重要性
連結 友元函數和類操作符重載
連結 C++類和C語言的關係
給一個連結。
類建構函式初始化列表出現的原因
1.如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的建構函式,沒有預設建構函式。這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的建構函式,如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。
2、類成員中若有const修飾,必須在對象初始化的時候,給const屬性賦值
當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化。
函數返回靜態變數引用,可以做左值
示範程式:
#include <stdio.h>int getA1(){ static int a =10 ; a ++ ; return a;}int* getA2(){ static int a =20 ; a++; return &a;}int& getA3(){ static int a =30; a ++; printf("a:%d\n",a); return a;}int main(){ int cc = getA1(); printf("cc:%d\n",cc); int*w = getA2(); printf("w:%d\n",*w); int t = getA3();//a:31 printf("t:%d\n",t); //getA() = 100; //左運算元必須為左值 //getA2() = (int*)100; //不能作為左值 *getA2()=100; printf("*getA2():%d\n",*getA2()); getA3() = 100; getA3(); return 0;}
運行結果:
cc:11w:21a:31t:31*getA2():101a:32a:101
類模板中的static變數
直接給個例子吧:
#include <iostream>using namespace std;template<typename T>class AA{public: AA() { a++; } static T a; void printA() { cout<<"a:"<<a<<endl; }};template<typename T>T AA<T>::a = 0;int main(){ AA<int> aa1; aa1.printA(); AA<int> aa2; aa2.printA(); AA<int> aa3; aa3.printA(); AA<char> bb1; bb1.a = 'a'; bb1.printA(); AA<char> bb2; bb2.printA(); AA<char> bb3; bb3.printA(); return 0;}
輸出結果為:
a:1a:2a:3a:aa:ba:c
再給一個人家畫的圖:
不明白的話,自己再找csdn大牛寫的文章,這裡只做拋磚引玉了。
12. 抽象類別,你的痛。。。
抽象類別是含有純虛方法的類。記住了:只要類中出現純虛方法(例如:virtual void func()=0;就是一個純虛函數),那麼這個類就是抽象類別。抽象類別雖然有很多禁忌,但歸根結底就是抽象類別不能建立對象。為了充分瞭解這個抽象類別,舉幾個抽象類別的禁忌:
#include <stdio.h>class B{public: virtual void print()=0; virtual void func()=0; B(){} B(int a, int b=0){printf("%d:%d\n",a,b);}};int main(){ //B b;//抽象類別不能建立對象 B *p; //抽象類別可以使用指標 //抽象類別不能作為函數傳回值和函數參數 //B fun1(); //void fun2(B); B& fun3(B&);//抽象類別引用可以作為函數參數和函數傳回值}
為什麼會出現抽象類別不能作為函數參數和函數傳回值的問題。抽象類別引用卻可以呢。我的理解是抽象類別在做函數參數和函數傳回值時,會產生隱式的賦值或是建立抽象類別對象。因為,抽象類別不能執行個體化,那麼抽象類別作為函數參數和函數傳回值的時候就會出錯了。為什麼引用可以呢。我的解釋是引用實際上就是一個地址,地址不會有抽象類別的初始化產生的。