物件導向(上)
一,引用的應用
swap.cpp
#include
using namespace std;
int main(void)
void swap1(int a, int b)//傳遞的是實參a,b的複製,也就是副本
void swap2(int* a, int* b)//傳遞的是實參a,b的位址
void swap3(int& a, int& b)//引用的本質還是指標
例項二:交換字串
int main(void)
void swap4(const char* pa, const char* pb)
//沒有實現交換 兩個引數指標是實參的副本
//可以將const char*替換為int進行看看
因為實參和形參都是指標。傳遞的是指標的值,還是值交換,所以沒有改變
void swap5(const char** pa, const char** pb)//這個是可以進行交換的
void swap6(const char*& pa, const char*& pb)//這個也是可交換的
注:指標和引用從右向左看
當我們傳遞乙個比較大的數值的時候,我們也可能會使用引用
這樣用來提高效率
例如int main(void)
struct student
void print1(student s)
結果是:3
2,動態型別轉換:dynamic_cast《型別》(變數);
用在具有多型特性的父子類之間的轉換
3,常量型別轉換:const_cast《型別》(變數);
去除指標或者引用上的const屬性。
const int cn = 100;
int* pn = &cn;
*pn = 200;
const int cn = 100;
int* pn = const_cast(&cn);
*pn = 200;
cout << *pn << "," << cn;
結果是:200,100
cn=100是從暫存器中讀取的,而不是讀取cn=200的記憶體中的
const volatile int cn = 100;
int* pn = const_cast(&cn);
*pn = 200;
cout << *pn << "," << cn;
結果是:200,200
4,重解釋型別轉換:reinterpret_cast《型別》(變數);
允許對任意型別的指標進行轉換
在指標和整形之間進行轉換(32位的系統整形和指標都是4個位元組)
char * p = null;
int n = reinterpret_cast(p);
double* pf = reinterpret_cast(p);
三,c++之父給c程式設計師的建議
1,盡量少用巨集,而用const/enum、inline和模板
2,變數隨用隨宣告
3,少用malloc 和 free,代之以new/delete
4,避免使用void*,指標算數,聯合和強制型別轉換
5,少用char*字串,代之以string
string.cpp
#include
#include
using namespace std;
int main(void)
c++中
string str ("hello");
str += " world";
cout << str << endl;
string str2;
str2 = str1;
string型別可以直接賦值,而char陣列型別的字串需要使用
strcopy
c++中字串的比較可以使用大於小於等於
c中字串的比較需要使用函式strcmp
6,oop思想。過程/步驟-->物件/行為和屬性
四,物件導向程式設計
1,什麼是物件?
萬物皆物件
屬性和行為
程式就是一組物件,及其相互作用的描述
2,什麼是類?
類是對物件的抽象。根據屬性和行為的共性。
程式就是通過類的描述去表達物件及其相互關係
3,類和物件的關係
類是物件的抽象和描述,物件是類的具體化
4,訪問控制修飾符
訪問控制限定符 訪控屬性 自己 子類 其他
public 公有 ok ok ok
protected 保護 ok ok no
private 私有 ok no no
注:類的預設訪問控制屬性是私有的。但是結構的預設訪問控制
屬性是公有的。
student.cpp
#include
using namespace std;
class student//帶參建構函式
void print(void)
這時通過無參構造時候建立物件
student s2();//錯誤,編譯器會理解為函式宣告
student s2;//正確
堆中建立物件陣列
類名* 物件陣列指標 = new 類名[元素個數];
如:student* psa = new student[3];
//上面的陣列都是通過無參構造進行初始化的
只有在c++2011標準中才可以使用
student* psa = new student[3];
delete psa;
五,建構函式
1,預設的無參建構函式
如果乙個類中沒有定義任何建構函式,系統就會自動提供乙個無參建構函式
如果為乙個類定義了建構函式,系統就不會在為該類提供任何建構函式了。
2,建構函式可以過載
3,初始化列表
student(string strname,int nage):m_strname(strname),m_nage(nage)
1)需要對類型別的成員變數做初始化
class date
}class student
date dt;//編譯錯誤,因為沒有對應的建構函式
}這種情況下需要使用初始化列表
非初始化列表,先建立再賦值
初始化列表,邊建立邊賦值
2)含有引用或常量型別成員
常量是必須在宣告的同時進行初始化
引用頁必須在宣告的同時進行初始化
class student//帶參建構函式
void print(void)
void show(void)
private:
int& m_r;
const int m_c;
};int main(void)
初始化的順序不是取決於初始化列表,而是取決於成員變數的定義
初始化列表中的定義最好不要相互依賴
六,類的宣告和定義可以相互分離
類的宣告在.h檔案
類的定義在.cpp檔案中
s.h檔案----------student類的宣告
#ifndef _s_h
#define _s_h//防止重包含
#include //c中的是#include
using namespace std;
class student
#endif //_s_h
s.cpp---------------student類的實現,注意student::別忘記
#include "s.h"
#include
student::student(const string& strname,
int nage):m_strname(strname),m_nage(nage)
void student::print(void)
#include "s.h"
int main(void)
%2d 設定字寬
setfill('0')
setw(2);
C 之物件導向
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!話說三國時期,曹操帶領百萬大軍攻打東吳,大軍在長江赤壁駐紮,軍船連成一片,眼看就要滅掉東吳,統一天下,曹操大悅,於是晏眾文武,在酒席間,曹操詩興大發,不覺吟道 喝酒唱歌,人生真爽 眾文武其呼 丞相好詩!於是一臣子速命印刷工匠刻版印刷,以便流傳天下。...
C 學習雜記之 物件導向
1 物件是類的乙個例項 instance 重要的是類的設計而不是物件的設計,類要注重行為的設計而不是資料 的設計,所以類中先public 成員函式。2 繼承與程式復用性的關係 1 b繼承a,則b必須是a的一種 如果b是a的一部分,則不允許b繼承a的功能 2 通過繼承,實現了後來寫的程式可以使用以前寫...
C 基礎之物件導向(二)
友元函式 1 一般在操作符過載時會使用,其他情況很少使用。2 在a類中宣告函式b是a類的友元函式,則函式b可以訪問a的資料成員。3 友元函式至少有乙個引數 這個引數為宣告類的引用 因為 全域性函式是沒有this指標的,我們只能通過引數來確定訪問的是那個物件的資料成員 如果全域性函式找不到this指標...