在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++新手容易犯的十個編程錯誤

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 2024-11-15 12:42 ? 次閱讀

簡單的總結一下C++ 新手容易犯的一些編程錯誤,給新人們提供一個參考。

1 有些關鍵字在 cpp 文件中多寫了

對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等關鍵字,如果在 cpp 中多寫,編譯器會報錯。 比如如下的虛接口與靜態成員變量的定義,只要在頭文件中聲明就可以了。


class shape
{
    virtual Draw();
    //...
    static int nLevel;
}

2 函數參數的默認值寫到函數實現中了

帶有參數默認值的函數,默認值是加在函數聲明處的,函數實現處的參數是不需要帶上的。 為了方便查看代碼,在函數實現處的參數中,將默認值注釋起來。正確的做法是,頭文件中有默認值:


BOOL CreateConf( const CString& strConfName, const BOOL bAudio = FALSE );
在函數實現處的參數中不用添加默認值:
BOOL CreateConf( const CString& strConfName, const BOOL bAudio/* = FALSE*/ );
{
    // ......
}

3 在編寫類的時候,在類的結尾處忘記添加 ";" 分號了

在類的結尾處忘記添加分號,編譯會報錯,新人們有可能找了半天也沒找出引起編譯錯誤的原因。 其實很簡單,在類的結尾處忘記添加分號了。


class Shape
{
    // ...
};

4 只添加了函數聲明,沒有函數實現

在添加類的函數時,只在類的頭文件中添加了函數聲明,但在 cpp 中卻沒有添加函數的實現。 如果其他地方調用到該函數,在編譯鏈接的時候會報unresolved external symbol錯誤。因為沒有實現,所有沒有供鏈接使用的 obj 文件。

5 cpp 文件忘記添加到工程中,導致沒有生成供鏈接使用的 obj 文件

在添加 C++ 類時,我們一般會添加 .h 頭文件和一個 .cpp 源文件。結果忘記把 .cpp 文件添加到工程中了,即沒有參與編譯,沒有生成供鏈接使用的 obj 文件。 如果有代碼調用到該 C++ 類的接口,則在編譯鏈接的時候會報unresolved external symbol錯誤,即鏈接不到該 C++ 類對應的接口。

6 函數中返回了一個局部變量的地址或者引用

在函數中返回了一個局部變量的地址或者引用,而這個局部變量在函數結束時其生命周期就結束了,內存就被釋放了。 當外部訪問到該變量的內存,會觸發內存訪問違例的異常,因為該變量的內存已經釋放了。比如如下的錯誤代碼:


char* GetResult()
{
    char chResult[100] = { 0 };


    // ......


    return chResult;
}

7 忘記將父類中的接口聲明 virtual 函數,導致多態沒有生效

代碼中本來要借助于 C++ 多態的虛函數調用,調用子類實現的接口,結果忘記在父類中將對應的接口聲明為 virtual,導致沒有調用到子類實現的函數。 一定要記住,要實現多態下的函數調用,父類的相關接口必須聲明為 virtual。


class Shape()
{
    // ...


    virtual void Draw();


    // ...
}

8 該使用雙指針的地方,卻使用了單指針

有時我們需要調用一個接口去獲取某些數據,接口中將數據拷貝到傳入的參數對應的內存中,此時設計參數時會傳入指針或引用。 我們在調用GetData 之前定義了結構體指針p,并 new 出了對應的結構體對象內存,應該在定義 GetData 接口時應該使用雙指針(指針的指針)的,結果錯寫成了單指針。 有問題的代碼如下:


struct CodecInfo     // 編碼信息
{
    int nFrameRate;


    // ...
}


CodecInfo* pInfo = new CodecInfo;


GetAudioCodecPtr()->GetCodecInfo(pInfo);   // 調用AudioCodec::GetCodecInfo獲取編碼信息


AudioCodec::GetCodecInfo( CodecInfo* pInfo)  // 此處的參數不應該使用單指針
{
    memcpy(pInfo, m_codecInfo, sizeof(CodecInfo));
}
上面中的AudioCodec::GetCodecInfo接口的參數不應該為單指針,應該用雙指針,修改后的代碼應該如下:

AudioCodec::GetCodecInfo( CodecInfo** pInfo)  // 此處的參數類型使用雙指針
{
    memcpy(*pInfo, m_codecInfo, sizeof(CodecInfo));
}

9 發布 exe 程序時,忘記將 exe 依賴的 C 運行時庫和 MFC 庫帶上

比如新人用 VS-MFC 庫編寫一個測試用的工具軟件,結果在發布 release 版本程序時,沒有將程序依賴的 C 運行時庫帶上,導致該工具軟件在某些電腦中啟動報錯,提示找不到 C 運行時庫: 因為程序中依賴了動態版本的運行時庫和 MFC 庫,在發布程序時要將這些庫帶上。有些系統中沒有這些庫,程序啟動時就會報找不到庫,就會啟動失敗。

10 應該使用深拷貝,卻使用了淺拷貝

本來應該要進行深拷貝的,卻使用了淺拷貝(直接賦值),導致另個不同生命周期的 C++ 對象指向了同一塊內存,一個對象將內存釋放后,另一個對象再用到這塊內存,就造成了內存訪問違例,產生異常。 有個經典的 C++ 筆試題,讓我們實現 String 類的相關函數,其主要目的就是用來考察對深拷貝與淺拷貝的理解的。題目中給出 String類的聲明:


class String{
public:
    String();
    String(const String & str);
    String(const char* str);
    String& operator=(String str);
    char* c_str() const;
    ~String();
    int size() const;
private:
    char* data;
};
讓寫出上述幾個函數的內部實現。這些函數的實現代碼如下:

//普通構造函數  
String::String(const char *str)
{
  if (str == NULL)
  {
    m_data = new char[1];// 得分點:對空字符串自動申請存放結束標志'?'的,加分點:對m_data加NULL判斷  
    *m_data = '?';
  }
  else
  {
    int length = strlen(str);
    m_data = new char[length + 1];// 若能加 NULL 判斷則更好
    strcpy(m_data, str);
  }
}
 
 
// String的析構函數  
String::~String(void)
{
  delete[] m_data; // 或delete m_data;  
}
 
 
//拷貝構造函數  
String::String(const String &other)// 得分點:輸入參數為const型  
{     
  int length = strlen(other.m_data);
  m_data = new char[length + 1];// 若能加 NULL 判斷則更好  
  strcpy(m_data, other.m_data);
}
 
 
//賦值函數  
String & String::operator = (const String &other) // 得分點:輸入參數為const型  
{
  if (this == &other)//得分點:檢查自賦值  
    return *this; 
  if (m_data)
      delete[] m_data;//得分點:釋放原有的內存資源  
  int length = strlen(other.m_data);
  m_data = new char[length + 1];//加分點:對m_data加NULL判斷  
  strcpy(m_data, other.m_data);
  return *this;//得分點:返回本對象的引用    
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3615

    瀏覽量

    93731
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73646

原文標題:C++:10種新手易犯錯誤

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    EEPROM編程常見錯誤及解決方案

    EEPROM(電可擦可編程只讀存儲器)在編程過程中可能會遇到多種錯誤。以下是一些常見的EEPROM編程錯誤及其解決方案: 常見
    的頭像 發表于 12-16 17:08 ?593次閱讀

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?306次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++中實現類似instanceof的方法

    C++有多態與繼承,但是很多人開始學習C++,有時候會面臨一常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有insta
    的頭像 發表于 07-18 10:16 ?585次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的方法

    具有十個解碼輸出的進位計數器/除法器數據表

    電子發燒友網站提供《具有十個解碼輸出的進位計數器/除法器數據表.pdf》資料免費下載
    發表于 05-17 10:47 ?0次下載
    具有<b class='flag-5'>十個</b>解碼輸出的<b class='flag-5'>十</b>進位計數器/除法器數據表

    keil用c++編譯含有rtos模塊時的錯誤問題怎么解決?

    近期看到一哥們用c++寫嵌入式,感覺蠻有趣,如果當初我的程序要是能用類就輕松多了,所以也想嘗試一下。雖然不會c++但是還是多少會用簡單的class,這個c#上用了不少。我的工程包括u
    發表于 05-09 08:29

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C
    的頭像 發表于 04-14 11:43 ?2629次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?794次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的<b class='flag-5'>錯誤</b>

    為什么很少用C++開發單片機

    C語言是面向過程的語言,C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,生成代碼量(bin文件)更小,運行效率更高。
    發表于 03-25 14:26 ?971次閱讀
    為什么很少用<b class='flag-5'>C++</b>開發單片機

    AURIX? TC399任務 c/c++調試失敗的原因?

    我正在嘗試使用AURIX? TC399XP KIT_A2G_TC387_MOTORCTR進行調試,winIDEA 調試成功。 但是,當我嘗試使用 Tasking c/c++ 調試器時,卻出現了以下
    發表于 03-04 08:08

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的
    的頭像 發表于 02-05 14:11 ?2388次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB語言和C++語言的區別。 設計目標: VB語言(Visual Bas
    的頭像 發表于 02-01 10:20 ?2312次閱讀

    基于QT5+OpenCV+OpenVINO C++的應用打包過程

    我用QT C++寫了一YOLOv5模型推理演示應用。
    的頭像 發表于 01-26 10:17 ?1265次閱讀
    基于QT5+OpenCV+OpenVINO <b class='flag-5'>C++</b>的應用打包過程

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?595次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 分分操免费视频在线观看| 亚洲一区二区三区免费在线观看| 老色皮| 成人a在线| 国产一级簧片| 真实偷清晰对白在线视频| 欧美一区二区三区在线观看| 亚洲午夜小视频| 人人艹在线视频| 青青草99热久久| 欧美亚洲天堂| 日日草天天干| 国产精品久久久久久久成人午夜| 性xxxxbbbb在线| 国产欧美综合在线| 147西西人体大胆免费网| 五月婷婷七月丁香| 77788色淫免费网站视频| 黄篇网站在线观看| 日韩美aaa特级毛片| 五月天婷婷在线观看| 天堂8在线天堂资源在线| 你懂的视频在线看| 美女操网站| 亚洲线精品一区二区三区| 国产性较精品视频免费| 综合五月激情| 日韩在线视频一区| 手机看片福利| 亚洲人成电影院在线观看| аbt天堂资源在线官网| 好大好紧好爽好湿润视频| 日本免费xxxx色视频| 深夜视频在线观看免费| 淫欲高三| 一级片免费观看视频| 久久久久激情免费观看| 国产视频三区| 亚洲一区二区三区四| 狠狠躁夜夜躁人人爽天天天天 | 国产综合精品久久久久成人影|