国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

學用C++的體會

2019-11-17 05:47:41
字體:
來源:轉載
供稿:網友
       
      我在大學的時候,花了一個月時間學了C語言,后來,基本上做什么,都不用翻書了
后來看C++,覺得挺簡單,學了一周,想不就是在C語言的基礎上,加了一個class嗎,工作了一年看的書多了,用的多了,才真正發現自己是井底之蛙。以前,看了所有的VC的書,其實,現在發現VC!=C++,vc只是一個編程環境啊。C++是一門語言。C++的精髓之區在面向對象的思想,為什么可以定義一個類,如何繼續一個。說到底是面向對象分析,面向對象設計,也就是OOA/OOD,C++的復雜在于它的范圍很廣,因為,我們工作往往只能用到它的一部分啊。比如我們很少用模板,很少用那些高級的應用,其實,說到底,是我們的水平不夠,大家看看loki庫也許就知道,template有多大的威力。我個人認為,template,跟虛函數一樣,屬于多態的,不過,虛函數是通過指針,實現,在運行時候,進行解析,而template是編譯期解析,我想它的實現跟宏定義差不多,但是,更加高級。

      還有一個問題,C++的編譯器其實為我們的代碼做了很多的事情。假如,我們不知道的話,那么,就會經常出現錯誤,我們應該始終記住這么一句話:"通用的往往是不好的,不適合工程的"。比如說:
函數為什么能夠重載?

      其實 ,C++,是這樣實現函數的名稱對應的

比如:
class  A
{
   show(int a,int b);
   show(float a); 

};

      其實,它在內部是這樣對應的:偽代碼:

 show_INT_INT(int a,int b, void *this);
 show_FLOAT(float a,void *this);

      大家想想為什么會有一個this指針

      這樣,自然,show()重載多少個都沒有問題,從這也可以看出,內部實現,只是把函數的參數類型編進了函數名來實現重載,而沒有把返回值編入,因此,函數名一樣,參數個數一樣,類型對應一樣的,返回值不同的兩個函數不能構成重載,會出現編譯錯誤。(我們可以想想為什么不把返回值編入函數名里,假如,只有兩個函數返回值不同,比如如下:

class B
{
  public:
   int  PRint(int a);
   void print(int a);
}

      假如,把返回值也編入函數名的話,那么它們應該可以構成重載。當你這樣如下調用時候,

 B a;
 a.print(20);

      編譯器怎么知道它是調用那個函數。

2,函數參數傳入傳出的規則

      在函數調用的時候,有三種情況,第一種參數為數值,第二種為傳指針,第三種傳引用,此外,還有,為const,和non-const的區別。什么情況下該傳數值,什么情況下不該傳呢,我覺得假如參數是基本類型的話,沒有關系,假如參數是對象的話,就不能傳數值,因為,它會調用對應的構造函數。(知道為什么嗎)

      解釋:函數參數的傳入,在函數的內部會產生幾個臨時變量,來拷貝函數的參數數值。比如:
  
fun(X a)
{
}

      那么,在函數對應的堆上,會為a變量開辟空間(m_a),并調用X類的拷貝構造函數來初始化化m_a,如下:X,m_a(a);類似這樣。有時候,一個類包含很多變量,構造函數比較復雜,那么,這樣的調用fun()會浪費很多系統時間。因此,極力反對用傳值調用對象參數的函數。還有一個,大家經常碰到的問題,就似const 修飾參數與沒有const的區別。有了const的修飾,在函數內部就不會為參數產生臨時變量了,這樣,自然,不會調用什么參數類的構造函數了,也不會為參數分配空間了。同時,這樣的參數也不能在函數中改變它的數值。


3,拷貝構造函數
      我們往往忘了寫這樣一個函數,也許不需要。其實,我們沒有寫的時候,不過,編譯器自動為我們生成一個。

比如:
class A{
    private: 
           int x;
          char *str_name;
  public :
        A(int x,char *str);     
};

      在這里,我們沒有定義一個拷貝構造函數,假如出現這樣的例子
fun(A x)
{
}

      從上邊的例子,我們知道,調用fun()函數的時候,會要調用A類的拷貝構造函數的 這樣,假如,沒有定義的話,那么,系統產生一個拷貝構造函數(按照位拷貝變量的值),這樣,我們知道,str_name只是一個指針,當臨時變量的str_name成員也指向參數的str_name的位置時候,這樣,我們就踏上了,一個地雷陣了。為什么,我們想啊,當執行完,fun()函數的時候,臨時變量,在某個不確定的時刻就要free()掉,這樣,臨時變量str_name也會delete,而我們知道,這個str_name跟參數的str_name指向的同一個內存塊,那么,當free一次后,那么它的內容就沒有了這樣,破壞了參數數據內容。


Kusk (2003-8-14 22:46:40)  讀完此文,覺得有商榷之處: 

----------------------------------------------------- 我覺得假如參數是基本類型的話,沒有關系,假如參數是對象的話,就不能傳數值,因為,它會調用對應的構造函數。 

----------------------------------------------------- 對象也可以傳值的,為什么調用構造函數就不能傳值呢?只不過有時從效率的角度以及對某些不便復制的對象我們更傾向于使用引用罷了。 

----------------------------------------------------- 有了const的修飾,在函數內部就不會為參數產生臨時變量了,這樣,自然,不會調用什么參數類的構造函數了,也不會為參數分配空間了。 

----------------------------------------------------- 不知道仁兄從哪里得出的這個結論,假如這樣的話我們似乎沒有必要寫fun(const yourClass& a)這樣的以引用為參數函數聲明,只須要寫fun(const yourClass a)行了,但兩者的確是有區別的,后者同樣會調用拷貝構造函數產生臨時變量! 

----------------------------------------------------- 拷貝構造函數我們往往忘了寫這樣一個函數,也許不需要。其實,我們沒有寫的時候,不過,編譯器自動為我們生成一個。 

----------------------------------------------------- 我引用一下Lippman的《Inside the C++ Object Model 中文版》: “假如一個class未定義出copy constrUCtor,編譯器就自動為它產生出一個”這句話不對,而是應該像ARM所說: Default constructors和copy constructors在必要的時候才由編譯器產生出來。這個句子中的“必要”意指當class不展現bitwise copy semantics時,C++ Standard仍然保留了ARM的意義…… 按貼主的意思,可能他把“位拷貝(bitwise copy semantics)”也當成構造函數的職責了,事實上并非如此:位拷貝恰恰是沒有定義構造函數(包括人為顯式定義以及“必要時”系統的隱式定義)時才發生的。位拷貝的過程是編譯器的動作,不屬于構造函數調用。 
 


C++基礎知識
以下來自www.csdn.net  作者taozhangzhi9

      C++的知識很多,有四庫全書《C++ 程序設計》,《C Primer》,這本文章只想談談我個人所看到的用到的知識。加上自己的理解。很多東西可能沒有系統化,而且,知識也是想到那寫到那。

首先談談 類的對象的大小,

 class  A
{
};

main()

      A  a;
      cout< }

它的結果會是多少呢?

答案為1。

為什么?它沒有定義任何變量,按道理,應該為0的啊。這是為了保證每一個對象的內存地址都是唯一的。比如:

      A  a,b;

假如,長度為0,那么,a,b的內存地址,就可能是一個,這樣,會產生一些不必要的麻煩。

那么
class A
{
      char m;
};

main()
{
      A  a;
      cout< }

會打印結果為多少啊。答案為4

      這個問題叫Alignment,有一次,我就碰到這樣郁悶的問題,我們的工程中代碼都是用數組傳送數據,比如坐標 x,y,那么就這樣賦值

*(int *)&w[0]=x; 

*(int *)&w[4]=y;

      (或許大家很少用),這樣的代碼有一個缺點,送數據,取數據十分不方便,而且,由于有下標,因此,代碼不好利用循環結構(還有不是四位的數據) 。只能一位一位的賦值,還有一個問題,就是,當工程一個約定變了的時候,所有的代碼都要改動。不好reuse。

      因此,我希望借助結構strcut,或者class來改造程序代碼,但是就碰到數據對齊問題。

      比如,我定義一個結構
struct A
{
      char type;
      int y;
};

      然后,這樣使用。

char  buf[MAX]; 
A a;
memcpy(buf,&a,sizeof(a));

      但是,卻發現buf[]的內容有三個不是我需要的內容。其實,內容圖示如下:

 
      我看了一些資料,說這是為了字節對齊,CPU存取數據是按照四位存取,這樣,就不會取四位數據,一位是char type,三位是y的數據。作為編程者對這個有可能就不熟悉。還有類似的問題,以后,再敘。

類的數據的訪問權限

      數據有三種權限:public,private,protected。C++是面向對象的語言,因此,它的許多概念來源于現實生活。比如這個權限問題就可以這么解釋。基本類相當于父親,子類相當于孩子,還有一個友元類,相當于朋友。

      比如,對于父親有的東西(成員變量)是對任何人都共享的,大家都可以知道的,不是什么秘密。那么,用public來描述這樣的東西。

      假如,有的東西,是只有不是外人不能知道的,也就是,兒子,好朋友都可以分享的秘密的話,那么,這樣的東西用protected描述。

      同樣,還有的東西,大人不想讓小孩知道,但是,卻對好朋友不保留,這樣的事情,在現實生活中也是有的,那么,這樣的用private描述。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 迭部县| 天峻县| 夹江县| 永泰县| 滨海县| 江城| 塘沽区| 禄丰县| 古田县| 西盟| 福州市| 咸宁市| 丹凤县| 穆棱市| 九龙坡区| 鄂伦春自治旗| 文水县| 武平县| 永定县| 包头市| 朝阳县| 香港| 泗阳县| 怀来县| 翁源县| 九台市| 鄂托克旗| 陆良县| 额敏县| 辽宁省| 高密市| 晴隆县| 平罗县| 陇川县| 易门县| 德钦县| 多伦县| 加查县| 温宿县| 馆陶县| 长顺县|