C++ 學習筆記----類篇

?

(一)基本概念:

1、類與對象:

1 //聲明類
2 class Human {
3 
4        //... Data members and methods go here
5 
6 };
7 
8 //定義對象
9 Human human;  

?

2、通常用class聲明類,struct也可以,只不過在信息隱藏機制上有點區別;struct默認是public,而class默認是private;只能在類的成員函數或friend函數中訪問類的非公有成員;

3、成員選擇符:' . ' 和 ' -> ';

4、成員函數的定義:

  兩種方式:一種在類內定義,所定義的成員函數都是inline類型的;一種是在類外定義;在類外定義時,要使用 ‘::’ 域解析符,在類外定義成員函數,如果聲明時,使用inline關鍵字,可使在類外定義的成員函數強制變成內聯函數

 1 class Person {
 2 
 3       public :
 4              void setAge( unsigned n );
 5              unsigned getAge() const;
 6       private :
 7              unsigned age;
 8 
 9 };
10 
11 //define class method;
12 
13 void Person::setAge( unsigned n ){
14        age = n;
15 }
16 unsigned Person::getAge(){
17        return age;
18 }

?

5、效率和健壯性:

(1)通過引用來傳遞和返回對象:

  一般來說,對對象的傳遞和返回應該使用“引用”,因為這樣可以提高效率;

  注意:在返回引用類型的對象時,如果是在類內定義的對象,要加上static修飾,否則這個對象對其他函數時不可見的;

1 C& get(){
2 
3       static C c1;  //注意static修飾符;
4       c1.set(123);
5       return C1;
6 
7 }

?

(2)const類型參數的對象引用:

 1 class C{
 2 
 3       public:
 4           void setName(const string& n){  name = n;  } 
 5           //通過const的修飾,setName()不會修改n的值;
 6           //... other public members;
 7  
 8       priavte:
 9           string name;
10 
11 };

?

(3)const成員函數:

  如果一個成員函數不會直接或間接地改變該函數所屬對象的任何數據成員,最好把這個成員函數標記為const;稱這樣的成員函數為只讀函數;它只能調用其他的const成員函數;

  例如:int get() const { ? return num ; ? }

 1 //下面展示const的三種用法:
 2 
 3 class C {
 4 
 5       public :
 6             //set()中的const表明它不會修改參數n的值;
 7             void set (const string& n) {  name = n ; }
 8             //前面的const表明誰也不能通過這個引用來修改name的值;
 9             //第二個const表明get()不會修改name的值;
10             const string& get() const {   return name ;  }
11       private:
12             string name;
13 
14 };

?

?(二)構造函數與析構函數:

?

1、構造函數:主要用來對數據成員進行初始化,并負責在對象創建時需要處理的事務,對類的健壯性有著重要作用;

  特點:函數名與類名相同;沒有返回類型;自動調用;可重載;行為與其他函數相同;可在類中定義,也可在聲明之外定義;

  (1)約束對象的創建:

    如果定義了非默認的構造函數,而沒有定義默認的構造函數,則系統不會提供默認的構造函數;

  (2)在類C的構造函數中錯誤的使用單一的C類型參數; 例如: class C { ?public : ?C (C obj);? } //紅色標注的是錯誤的;

     在拷貝構造函數可以有一個C參數,但那是一個引用;?例如:class C { ?public :??C (C& obj);? } ? //紅色標注的是正確的,因為它是一個拷貝構造函數;

?

2、拷貝構造函數:

  (1)在默認情況下,系統會自動生成一個拷貝構造函數,將源對象所有數據成員的值逐一賦值給目標對象相應的數據成員;

    兩種原型:例如:Person( Person& ); ? ? ? ? ? ?Person( const Person& )

  (2)自定義拷貝構造函數:第一個以后的參數都必須有默認值;例如:

    Person( const Person& p , bool married = false ?);

    當一個類包含指向動態存儲空間指針類型的數據成員,則應為這個類設計拷貝構造函數;

    //應當舉例說明:::::暫略

?

    通過自定義構造函數可禁止通過傳值方式傳遞和返回類對象:因為傳值需要拷貝,把拷貝構造函數設為私有,可禁止傳值;

 1 class C {
 2 
 3       public :
 4            C();
 5       private:
 6            C( C& ); //把拷貝構造函數設為私有;
 7 
 8 };
 9 
10 void f( C ) { ... }  //Call by value
11 
12 C g() {  ...   }       //return by value
13 
14 int main()
15 {
16       C c1,c2;
17       f(c1);  //...Error,可改為  void f(C& obj) { ... }
18       c2 = g();   //....Error,可改為  C& g(){ ...  };
19 }

?

3、轉型構造函數:只有一個參數,用于類型間的轉換;例如,類C的轉型構造函數可將其他類型的變量轉型為類C類型的變量;

? ? ?注意關鍵字:explicit;

?

4、構造函數初始化程序:

 1 //在此程序中,對c進行賦值是非法的....
 2 class C {
 3      public :
 4           c() {
 5              x = 0;
 6              c = 0;   //Error . c is const
 7           }
 8      private:
 9           int x;
10           const int c;
11 };            

  應改為:這是初始化const成員變量的唯一方法;初始化列表僅在構造函數中有效;可初始化任何數據成員;

1 class C {
2       public :
3            C() : c( 0 ) {  x = 0; }
4       private :
5            int x;
6            const int c;    
7 };

?

5、構造函數與操作符new和new[]

  當使用動態方式為一個對象分配存儲空間時,C++操作符new和new[]比函數malloc和calloc做的更好, 因為它們會調用相應的構造函數;

?

6、析構函數:

  發生在如下情況:一是以某個類作為數據類型的變量超出了其作用范圍;一是用delete操作符刪除動態分配的對象;

  例如:~C(); ? ?//不帶參數,不能被重載;

?

7、構造函數與析構函數的調用順序:

  構造函數:先調用父類的構造函數,然后才是子類的構造函數;

  析構函數:先調用子類的析構函數,然后才是父類的析構函數;

?

(三)類數據成員與類成員函數:

  

  1、使用 ?static ?修飾, 屬于整個類,可被某個對象調用,也可被類調用(被類調用時,使用 :: 操作符);修飾詞一般只在聲明時使用;例如:

1 class C{
2 
3     private :
4          static int x ;
5 
6 };
7 
8 int C :: x = 0;   //無需加static

?

  2、在成員函數內部定義static變量:

    該類的所有的對象在調用這個成員函數時,將共享這個變量;

?

(四)指向對象的指針(->):

  1、用途:一是作為參數傳遞給函數,或是通過函數返回,一是使用操作符new和new[]動態創建對象,然后返回一個指向該對象的指針;

?

  2、常量指針this:在成員函數內部可以用this來訪問與成員函數的調用相關聯的對象;

    例如:void setID (const string& id) { ?this->id = id ; ?}?

?

?

?

////
//C++學習筆記
////

轉載于:https://www.cnblogs.com/china-victory/archive/2012/11/17/2774453.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ux和ui_設計社交餐廳策展應用程序— UX / UI案例研究

ux和uiSabor, which translates from “taste” or “flavor” in Spanish, is a concept for an iOS app designed to provide users with honest, reliable and relatable restaurant recommendations from friends and family. It is a social restaurant curation applicat…

你不知道的 script 標簽的 defer 與 async 屬性

我持續組織了近一年的源碼共讀活動,感興趣的可以 點此掃碼加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外:目前建…

我是怎么調試 Element UI 源碼的

我持續組織了近一年的源碼共讀活動,感興趣的可以 點此掃碼加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外:目前建…

java對象的理解

1、看生成幾個對象,就看new了幾次, Stu s1new Stu(“張三”); Stu s2s1;-這里也是生成了一個對象,只不過s1和s2指向了同一個對象 2、Stu s1new Stu(“張三”); Stu s2 new Stu(“李四”); s1s2;這里生成了兩個對象,但是…

模板緩沖_模板緩沖以及如何使用它可視化體積相交

模板緩沖介紹 (Introduction) The trendy thing in real-time rendering these days is ray-tracing. However, traditional rasterization hasn’t disappeared, and it won’t in the near future. I recommend this blog post on the subject: A hybrid rendering pipeline …

重磅!哈啰 Quark Design 正式開源,下一代跨技術棧前端組件庫

大家好,我是若川。我持續組織了近一年的源碼共讀活動,感興趣的可以 點此掃碼加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試…

對lua協程的一點理解

讀《Programming In Lua》協程那一章,比較困惑的還是procuer-consumer那個例子: function consumer(prod)while true dolocal x receive(prod)print(x)end endfunction receive(prod)local status, value coroutine.resume(prod)return value endfunct…

b端 ux 設計思維_借助系統思維從視覺設計過渡到UX

b端 ux 設計思維“How can I switch to UX?” This is a common question from visual designers because there’s a lot of overlap on the surface. But it can also be a difficult transition since UX encompasses much more below the surface.“如何切換到UX&#xff…

三面面試官:運行 npm run xxx 的時候發生了什么?

大家好,我是若川。近期發現好些小伙伴工作有2-3年了,基本不會寫腳手架,或者說沒學過腳手架。對腳手架大致是如何執行的基本不太知道。其實這類學習資料真的挺多的。而且我們基本天天 npm run dev,應該學習內部實現。不知道的小伙伴…

figma下載_Figma的自動版式實用

figma下載Figma’s Auto Layout has been around for a while, but not everyone’s aware of the benefits it brings. It doesn’t replace constraints, they’re still very much needed. The trick is to use the right feature where necessary. I want to show you how …

Qt通過ODBC讀取excel文件

之前替學校考試科用C Builder做過一個小的數據庫工具,處理excel表格用的,現在想轉換到Qt平臺下來,在網上搜了搜有一些利用OBDC讀取xls文件的教程: http://hi.baidu.com/kxw102/item/770c496d5736470ca0cf0f1d http://blog.sina.co…

真 · 三面面試官:運行 npm run xxx 的時候發生了什么?

昨晚沒權限我只放了鏈接,今天聯系開了白名單。昨天推文主要是為了投票,表明 Node.js 的重要性,有人評論是水文。今天重新轉載下。歡迎繼續點此去投票。投票顯示有高達近80% 表示不太會開發腳手架,看來大多數人確實沒有應用場景。可…

ovo svm_反思我在OVO擔任遠程產品設計實習生的時間

ovo svmIn a quiet bedroom accompanied only by the low humming of my laptop fan, I sat before a Google Hangouts meeting, and got to know my colleagues for the first time, unaware of the joy of a ride that was waiting for me at OVO Design.在一個安靜的臥室里&…

native的Socket向Android的LocalSocketServer發送漢字亂碼的問題

native的Socket發送字節流默認是GB2312的,所以在Java方面需要指定GB2312 byte[] buffer new byte[50]; StringBuffer strBuf new StringBuffer(); InputStream input receiver.getInputStream(); while((len input.read(buffer)) ! -1) {String newStr new Str…

最受讀者喜愛的前端書 Top 15【留言送書】

最受讀者喜愛的前端書Top 15JavaScript高級程序設計(第4版)| 中文版累計銷量32萬冊,JavaScript“紅寶書”全新升級 | 涵蓋ECMAScript 2019,全面深入,入門和進階俱佳 | 結合視頻講解配套編程環境,助你輕松掌…

圖文結合簡單易學的 npm 包的發布流程

大家好,我是若川。我持續組織了近一年的源碼共讀活動,感興趣的可以 點此掃碼加我微信 ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試…

擬態防御_擬態從未消失。 這就是為什么。

擬態防御Looking back on design languages, what Apple’s WWDC 2020 Keynote means for the future of design languages, and how we move on from here.回顧設計語言,Apple的WWDC 2020主題演講對設計語言的未來意味著什么,以及我們如何從這里繼續前進…

C++二維數組做形參

二位數組作為形參,目前僅知道兩種形式,一種直接采用二維數組,一種是用二維指針。以下是做的一個簡單的實例。 大家幫我看看,在實際應用中兩者有和優缺點。當然,有更好的方式更好了。 以下均應用在字符串數組中 void ar…

經常開發后臺管理系統,如何提升自己?推薦~【留言送書】

大家好,我是若川。之前送過N次書,可以點此查看回饋粉絲,現在又和博文視點合作再次爭取了幾本書,具體送書規則看文末。Vue.js是一套用于構建用戶界面的漸進式框架。與其他大型框架不同的是,它可以自底向上逐層應用。Vue…

lottie 動畫_使用After Effects和Lottie制作網絡動畫而不會損失質量

lottie 動畫A quick getting started guide快速入門指南 I recently took on a project where the team wanted to add some animated icons and a logo. Besides UX & UI design I am also a motion graphic designer so I took on the challenge of doing it with after…