C++學習筆記(七)--操作符過載 友元函式 類的繼承 訪問控釋protected
C++ Primer Plus的閱讀大概到這邊也就先暫時告一段落了(因為開學了!!)
然後近期找來了C++ Primer稍微翻了翻覺得確實寫得比Plus要好一些,而且加入了C++11的新特性,但是無論哪本書對於這些最基本的功能應用大抵也是差不多的,所以也沒覺得看的是Plus就會少學很多東西,況且plus確實是比primer講得淺顯了很多。
寫這個系列的初衷其實也是熟悉C++中到底有啥,應該怎麼用,故而對於原理基本沒有任何挖掘,但想來在日後很多專案以及實戰中會對我們以後真切需要的那部分理論會有更深刻的認識(大抵我還是認為多做比多看書有用吧~)
廢話不多說咯,本文分為下面幾塊~
操作符過載
友元函式:過載操作符時如果過載了類似於class*double,那麼顯然不能用double*class,這時候就需要我們定義外部的能訪問內部變數的函式來拯救世界了。
類的繼承:繼承一個類所有public部分加上新的東西生成新的一個類,雖然是親兒子但是private部分還是不允許直接訪問。
訪問控制protected: 只有在類的繼承裡有效,相當於專門留給親兒子繼承類的介面,裡面的東西對於繼承類相當於public但對於外部相當於private
第一段程式碼:操作符過載以及友元函式,都寫得很淺顯,各個功能塊也有備註
#include<iostream>
class 時間 {
private:
int 小時;
int 分鐘;
public:
時間();//建構函式
時間(int hours, int minutes);
時間 operator+(const 時間 & t)const;
void 展示();
friend 時間 operator*(double 倍數, const 時間&t);//友元隨意放在哪兒,不受public和private影響
friend void operator<<
};
時間::時間() { 小時 = 分鐘 = 0; }
時間::時間(int hours, int minutes) { 小時 = hours; 分鐘 = minutes; }
時間 時間::operator+(const 時間 &t)const {
時間 sum;
sum.分鐘 = 分鐘 + t.分鐘;
sum.小時 = 小時 + t.小時 + sum.分鐘 / 60;
sum.分鐘 %= 60;
return sum;
}
void 時間::展示() {
std::cout << "總時間為:" << 小時 << "小時" << 分鐘 << "分鐘" << std::endl;
}
////友元函式//////
時間 operator*(double 倍數, const 時間&t){//定義的時候不要寫friend
時間 result;
long totalminutes = 倍數*(t.分鐘 + t.小時 * 60);
result.分鐘 = totalminutes % 60;
result.小時 = totalminutes / 60;
return result;
}
void operator<<(std::ostream&os, const 時間&t) {
os <<"過載<<顯示:"<< t.小時 << " 小時" << t.分鐘 << " 分鐘" << std::endl;
}
int main() {
時間 一(2, 13);
時間 二(3, 54);
/////////////////過載+////////////////////
時間 三 = 一 + 二;
std::cout << "此處為操作符+的過載:" << std::endl;
三.展示();
時間 四 = 3 * 三;
std::cout << "友元函式的應用3*class:" << std::endl;
四.展示();
std::cout << 四;
system("pause");
}
-------------------------------------------------------------------------
第二段程式碼:類的繼承的用法以及protected:
#include<iostream>
using namespace std;
class 基類 {
public:
基類();
int 帥比;
int 測試值 = 0;
void show();
private:
int 分數=0;
protected://專門為親兒子派生類準備的,裡面相當於可以只有派生類可以訪問的private
int 乖兒砸=0;
};
基類::基類() { 測試值 += 1; }
void 基類::show() { cout << "private內數值為:"<<分數<<endl; }
class 派生類:public 基類 {
public:
//void show2();
派生類();//派生類的建構函式,可以看到即便是派生類的建構函式還是要先呼叫一下基類的建構函式的
void show();//可以重寫
};
派生類::派生類() { 測試值 += 1; }
//void 派生類::show2() { cout << "233"; }
void 派生類::show() { cout << "重新構建了show()函式但是基類的private不能訪問了,測試值為"<<測試值<<endl; }
int main() {
派生類 一;
基類 二;
一.show();
二.show();
system("pause");
}
最後祝大家開學愉快~//要幫老闆幹活兒啦~~