成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java程序員學(xué)習(xí)一天半C++的感想

開(kāi)發(fā) 后端
大學(xué)期間,學(xué)了一學(xué)期的C語(yǔ)言,當(dāng)然包括學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí),用的也是C語(yǔ)言。當(dāng)時(shí)剛剛接觸計(jì)算機(jī),對(duì)于編程更是一無(wú)所知。上課學(xué)習(xí)學(xué)習(xí),偶爾會(huì)照著 書(shū)上敲一下代碼。大二下學(xué)期,就丟掉了不用了。最近由于工作的需要,要使用Java Native Interface,所以就學(xué)習(xí)了1天半的C++,對(duì)C++有了一點(diǎn)點(diǎn)的了解,寫(xiě)一下自己的理解。

大學(xué)期間,學(xué)了一學(xué)期的C語(yǔ)言,當(dāng)然包括學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí),用的也是C語(yǔ)言。當(dāng)時(shí)剛剛接觸計(jì)算機(jī),對(duì)于編程更是一無(wú)所知。上課學(xué)習(xí)學(xué)習(xí),偶爾會(huì)照著 書(shū)上敲一下代碼。大二下學(xué)期,就丟掉了不用了。最近由于工作的需要,要使用Java Native Interface,所以就學(xué)習(xí)了1天半的C++,對(duì)C++有了一點(diǎn)點(diǎn)的了解,寫(xiě)一下自己的理解。

 Java程序員學(xué)習(xí)一天半C++的感想

一天半時(shí)間,也學(xué)不多少東西,我主要就搞明白了下面幾個(gè)問(wèn)題:

1)指針

這么多年了,還記得在C語(yǔ)言時(shí),最難以理解的,應(yīng)該屬于指針了。還記得譚浩強(qiáng)的那本C語(yǔ)言書(shū)(書(shū)名是啥,真的忘了。不過(guò)作者譚浩強(qiáng)老師,絕大多 數(shù)的中國(guó)開(kāi)發(fā)人員應(yīng)該都知道的),前面大部分用的都是基本數(shù)據(jù)類(lèi)型(也就是Java中的原生類(lèi)型),后面一小部分突然講起了指針,當(dāng)時(shí)立馬就 蒙 圈了。不過(guò)好在最后還是理解了指針,雖然后來(lái)又忘記了。

指針是什么?

指針是一個(gè)存放另外一個(gè)東西的地址的變量。指針是一個(gè)變量,把一個(gè)具有特殊作用的變量稱(chēng)為指針。它的特殊作用就是:存放另外一個(gè)東西的內(nèi)存地址。也 就是說(shuō)指針變量的值代表了一個(gè)地址,這個(gè)地址是另外一個(gè)東西的。那另外一個(gè)東西是什么呢?就是我們說(shuō)的對(duì)象(或者實(shí)例)。在C++中,還為這個(gè)對(duì)象起了一 個(gè)別名:引用。

總結(jié)一下就是:指針變量指向一個(gè)對(duì)象(或者引用)。

*、&的使用

在聲明語(yǔ)句中:

*表示聲明的是指針,&表示引用。

這里說(shuō)的聲明語(yǔ)句,可以是變量聲明,也可以是函數(shù)聲明中。在函數(shù)聲明中,返回值、函數(shù)名、參數(shù)都可以聲明為指針。

在使用指針變量時(shí),

(* 變量名)代表取對(duì)象。(& 引用)代表取指針。

 

  1. void personTest(Person * p){ 
  2.     if(p!=NULL){ 
  3.         p->setAddress("Bei Jing, Hai Dian"); // 采用指針的方式賦值 
  4.         (*p).setName("Fang JiNuo");    // 采用對(duì)象的方式賦值。 
  5.         (*p).setAge(23); 
  6.         printf("show info:\n%s\n", (*p).toString()); 
  7.         delete p; 
  8.         p=NULL; 
  9.     } 
  10. }
函數(shù)指針、指針函數(shù) 

       這個(gè)兩個(gè)詞八個(gè)字,不知道有多少人載了跟頭,其實(shí)很好理解了。中國(guó)人說(shuō)話(huà),多以敘述的方式為主。這個(gè)兩個(gè)詞都是省略句,不過(guò)省略的是助詞。

函數(shù)指針全名是:函數(shù)名是指針。

指針函數(shù)全名是:返回值是指針的函數(shù)。

這兩個(gè)中,指針函數(shù)很容易理解了:

char * func(char[] p);這個(gè)函數(shù)就是一個(gè)指針函數(shù)。

函數(shù)指針,函數(shù)名是指針。指針也是變量,所以就可以理解為:函數(shù)名是變量。

下面是一個(gè)函數(shù)指針變量的聲明:

typedef int (* func) (int x);

然后把這個(gè)變量作為另外一個(gè)函數(shù)的參數(shù)來(lái)使用:

  1. typedef int (*func)(int arg); // 定義一個(gè)函數(shù)指針 
  2.  
  3. /* 一個(gè)函數(shù)指針的實(shí)現(xiàn) 
  4. * funcImpl就可以作為func的值進(jìn)行賦值。 
  5.  */ 
  6. int funcImpl(int arg){ 
  7.     return arg; 
  8.  
  9. /*  
  10. * 聲明一個(gè)函數(shù),將函數(shù)指針作為函數(shù)call的參數(shù) 
  11.  */ 
  12. void call(func f){ 
  13.     for(int i=0; i<10; i++){ 
  14.         cout << f(i) << endl; 
  15.     } 
  16.  
  17. // 進(jìn)行測(cè)試 
  18. int main(int argc, char* args[]) 
  19.     call(funcImpl); 

程序執(zhí)行結(jié)果是,打印出0到9。 

這個(gè)函數(shù)指針與下面JavaScript的代碼有同樣的作用:

  1. function funcImpl(int num){ 
  2.     return num; 
  3. (function call(f){ 
  4.     if(f){ 
  5.         if(f instance Function){ 
  6.             for(int i=0; i<10; i++){ 
  7.                alert(f(i)); 
  8.             } 
  9.         } 
  10.      } 
  11. })(funcImpl); 

當(dāng)然了與下面的Java代碼代碼也是一樣的: 

  1. interface Callback{ 
  2.     int doCall(int num); 
  3.  
  4. static void call(Callback callback){ 
  5.     if(callback==nullreturn
  6.     for(int i=0; i<10; i++){ 
  7.         System.out.println(callback(i)); 
  8.     } 
  9.  
  10. public static void main(string[] args ){ 
  11.     call(new Callback(){ 
  12.        public int doCall(int num){ 
  13.           return num; 
  14.        } 
  15.      }); 

在C#中,它還有另外一個(gè)名字,delegate。 

 其實(shí)它們都是傳說(shuō)中的鉤子函數(shù)callback。

2)頭文件、#include

       在大學(xué)時(shí),沒(méi)有寫(xiě)過(guò)頭文件,也沒(méi)有看過(guò)頭文件。所以頭文件對(duì)我來(lái)說(shuō),一直是個(gè)謎。不過(guò)在學(xué)習(xí)了Java、C#后,就自然而然的會(huì)將#include 頭文件理解為import、using等。

       那么頭文件中,會(huì)寫(xiě)什么呢?

       一般來(lái)說(shuō),會(huì)將聲明(類(lèi)中的字段、方法的聲明)寫(xiě)在.h文件中,將方法的實(shí)現(xiàn),寫(xiě)在cpp文件中。以此來(lái)達(dá)到接口與實(shí)現(xiàn)的分離。其他地方使用#include時(shí),就只會(huì)看到.h文件中的聲明,看不到具體的實(shí)現(xiàn)。

       另外要說(shuō)的是#include的兩種方式。 例如#include <xxxx.h>、#include “xxxx.h”。這兩種方式,還是有區(qū)別的,<>方式是先從系統(tǒng)目錄下找.h文件,” ”則是先從用戶(hù)目錄下去找.h文件。有點(diǎn)類(lèi)似于Java中ClassLoader了,默認(rèn)采用委托加載,也可以使用子類(lèi)優(yōu)先方式進(jìn)行加載。

創(chuàng)建實(shí)例與回收

       在C語(yǔ)言中,聲明一個(gè)變量,可以直接使用聲明的方式、也可以使用molloc的方式。

在C++中,又加入了一種new的方式,這種方式的寫(xiě)法與Java中是一樣的。

創(chuàng)建

釋放

聲明(隱式):創(chuàng)建的是對(duì)象本身,而不是指針

隱式釋放,不需要通過(guò)寫(xiě)代碼。因?yàn)槁暶鞯膶?duì)象在棧內(nèi),出棧后自動(dòng)釋放

molloc(顯示):該方法用于分配內(nèi)存,返回值是指針

使用free()進(jìn)行釋放

new :分配內(nèi)存,返回值是指針

使用delete 進(jìn)行釋放

Molloc、new 分配內(nèi)存后,返回值都是指針。且分配在內(nèi)存中Heap區(qū),不會(huì)自動(dòng)釋放,所以需要使用free、delete進(jìn)行釋放。

 另外在使用feee、delete后,最好是將指針的值設(shè)置為NULL, 因?yàn)閒ree、delete只是釋放了對(duì)象占用的內(nèi)存空間,而指針的值仍然是對(duì)象在被釋放前占用空間的首地址。

 這與Java是不同的,Java能夠自動(dòng)的進(jìn)行回收。對(duì)象設(shè)置為null即可。Java中的回收機(jī)制是:采用分代回收算法對(duì)于不可達(dá)的對(duì)象進(jìn)行回收。

 

  1. void fun(){ 
  2.     Menu* m1=new Menu();  // 顯式聲明對(duì)象 
  3.     Menu m2;              // 隱式聲明對(duì)象 
  4.     this->menulist->push_back(m1); 
  5.     this->menulist->push_back(&m2); 
  6.  
  7. void showList(){ 
  8.     list<Menu*>::iterator iter=this->menulist->begin(); 
  9.     while(iter!=this->menulist->end()){ 
  10.         Menu* menu=*iter;  
  11.         cout << m->toString() << endl; 
  12.         iter++; 
  13.     } 

這段代碼,在編譯時(shí),是沒(méi)有問(wèn)題的,也就是說(shuō)從寫(xiě)法來(lái)講,沒(méi)有錯(cuò)誤的。但是在執(zhí)行showList()時(shí)就會(huì)出現(xiàn)空指針異常。原因如下: 

在fun()中,創(chuàng)建的m1在heap中,不會(huì)自動(dòng)的釋放,創(chuàng)建的m2,在stack中,會(huì)自動(dòng)的釋放,當(dāng)fun執(zhí)行完畢時(shí)m2對(duì)象實(shí)際已經(jīng)不存在了。然后執(zhí)行showList()時(shí),變量到m2對(duì)象時(shí),肯定空的了,list中存儲(chǔ)的m2的指針,已經(jīng)成為野指針了。

3)namespace

命名空間,在大多數(shù)語(yǔ)言中都有的。他們的作用都是為了區(qū)分。

//定義命名空間

namespace ns{

    // your code

}

// 導(dǎo)入命名空間:

using namespace std;

// 使用命名空間:

std::xxxx

4)#define 、typedef

typeof 是為已有類(lèi)型取別名。在編譯階段有效,由于是在編譯階段,因此typedef有類(lèi)型檢查的功能。

#define是宏定義,發(fā)生在預(yù)處理階段,也就是編譯之前,它只進(jìn)行簡(jiǎn)單而機(jī)械的字符串替換,而不進(jìn)行任何檢查。#define不只是可以為類(lèi)型取別名,還可以定義常量、變量、編譯開(kāi)關(guān)等。

5)操作符重載

       學(xué)習(xí)C#時(shí),知道可以對(duì)已有操作符進(jìn)行重組,也就是賦予操作法新的功能。但是在C#中,我們很少這么做。Java中雖然沒(méi)有語(yǔ)言級(jí)別的支持,但是Java中字符串拼接使用的+,其實(shí)就可以看做是操作符的重載。

       在了解到C++中有操作符重載后,哦,原來(lái)這一點(diǎn),C#是借鑒C++的呀。另外C#中還保留了struct。說(shuō)到struct,再提一點(diǎn),struct完全可以理解為C語(yǔ)言中的類(lèi)。

   C++ 中則使用了大量的操作符重載。具體的怎么去定義操作符重載,用到的時(shí)候再說(shuō)吧。

一天半時(shí)間,了解的東西真的不多,都是最基本的。雖然我也知道C++中的字符串拼接沒(méi)有Java、JavaScript那么隨意那么任性。但是這些不屬于難點(diǎn),所以我認(rèn)為不需要再提了。

最后,開(kāi)一個(gè)玩笑,不懂JavaScript的Java程序員不是一個(gè)好的C++程序員。不懂Java的JavaScript程序員也不是一個(gè)好的C++程序員。

 
責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2019-04-28 09:56:15

程序員互聯(lián)網(wǎng)脫發(fā)

2019-11-07 15:30:00

EmacsIDE

2012-11-08 09:49:30

C++Java程序員

2021-05-06 08:58:13

光纜斷網(wǎng)互聯(lián)網(wǎng)

2010-01-28 17:10:33

C++

2015-02-10 10:21:22

程序員

2012-06-05 00:26:58

程序員

2015-12-24 18:00:45

資深程序員

2016-03-25 11:57:23

Java程序員C++

2021-02-26 10:41:59

C++程序員代碼

2011-04-11 17:41:35

C++程序員

2009-06-25 09:10:25

很牛的程序員

2023-07-17 10:28:00

C/C++編程接口

2010-01-12 10:40:22

C++程序員

2010-01-14 18:07:30

C++語(yǔ)言

2015-10-19 17:49:43

程序員泡沫工資

2019-02-14 10:04:34

程序員離職技術(shù)

2019-08-19 09:21:36

程序員Bug代碼

2015-03-12 14:29:13

程序員程序員學(xué)習(xí)之路程序員感想

2013-07-18 09:58:18

C++程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品视频在线播放 | 午夜影院在线观看 | 欧美电影免费观看 | 黄色一级毛片 | 69av在线视频 | 亚洲视频免费在线观看 | 欧美国产一区二区三区 | 久久精品国产免费 | 免费观看一区二区三区毛片 | 国产高清精品一区 | 欧美成人免费在线 | 日韩精品在线看 | 精品国产欧美一区二区三区成人 | 国产精品美女久久久久久免费 | 午夜ww | 中文字幕一区二区三区四区 | 在线观看国产视频 | 国产精品中文字幕一区二区三区 | h片在线观看网站 | 黄色在线免费看 | av色站 | 日韩欧美专区 | 蜜桃视频成人 | 久久不卡 | 在线播放国产一区二区三区 | 日韩欧美一区二区三区在线播放 | 国产一区高清 | 一级毛片免费完整视频 | 久久久久一区 | 国产精品久久久亚洲 | 青青草网站在线观看 | 91在线精品一区二区 | 久久久久久99 | 欧美一级精品片在线看 | 国产精品免费小视频 | 亚洲精品久久嫩草网站秘色 | 性一交一乱一伦视频免费观看 | 99re免费| 国产在视频一区二区三区吞精 | 91美女视频| 超碰精品在线 |