亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 2024-11-15 12:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1 有些關(guān)鍵字在 cpp 文件中多寫了

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


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

2 函數(shù)參數(shù)的默認(rèn)值寫到函數(shù)實現(xiàn)中了

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


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

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

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


class Shape
{
    // ...
};

4 只添加了函數(shù)聲明,沒有函數(shù)實現(xiàn)

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

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

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

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

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


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


    // ......


    return chResult;
}

7 忘記將父類中的接口聲明 virtual 函數(shù),導(dǎo)致多態(tài)沒有生效

代碼中本來要借助于 C++ 多態(tài)的虛函數(shù)調(diào)用,調(diào)用子類實現(xiàn)的接口,結(jié)果忘記在父類中將對應(yīng)的接口聲明為 virtual,導(dǎo)致沒有調(diào)用到子類實現(xiàn)的函數(shù)。 一定要記住,要實現(xiàn)多態(tài)下的函數(shù)調(diào)用,父類的相關(guān)接口必須聲明為 virtual。


class Shape()
{
    // ...


    virtual void Draw();


    // ...
}

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

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


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


    // ...
}


CodecInfo* pInfo = new CodecInfo;


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


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

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

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

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

10 應(yīng)該使用深拷貝,卻使用了淺拷貝

本來應(yīng)該要進行深拷貝的,卻使用了淺拷貝(直接賦值),導(dǎo)致另個不同生命周期的 C++ 對象指向了同一塊內(nèi)存,一個對象將內(nèi)存釋放后,另一個對象再用到這塊內(nèi)存,就造成了內(nèi)存訪問違例,產(chǎn)生異常。 有個經(jīng)典的 C++ 筆試題,讓我們實現(xiàn) String 類的相關(guān)函數(shù),其主要目的就是用來考察對深拷貝與淺拷貝的理解的。題目中給出 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;
};
讓寫出上述幾個函數(shù)的內(nèi)部實現(xiàn)。這些函數(shù)的實現(xiàn)代碼如下:

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95238
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75281

原文標(biāo)題:C++:10種新手易犯錯誤

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    使用英特爾? NPU 插件C++運行應(yīng)用程序時出現(xiàn)錯誤:“std::Runtime_error at memory location”怎么解決?

    使用OpenVINO?工具套件版本 2024.4.0 構(gòu)建C++應(yīng)用程序 使用英特爾? NPU 插件運行了 C++ 應(yīng)用程序 遇到的錯誤: Microsoft C++ excep
    發(fā)表于 06-25 08:01

    在工業(yè)自動化中使用固態(tài)繼電器時應(yīng)避免的5錯誤

    固態(tài)繼電器(SSR)已成為工業(yè)自動化的無名英雄。它們安靜、可靠、速度快——這是繼電器應(yīng)具備的所有特點。但就像高科技駕駛艙中的新手飛行員一樣,即使是經(jīng)驗豐富的工程師在使用SSR時也會常見錯誤。本文讓我們來看看應(yīng)如何避免在工業(yè)自動
    的頭像 發(fā)表于 04-20 11:42 ?254次閱讀

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:ThreadPoll

    1、程序簡介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫的線程池處理:ThreadPoll。本案例完成如下工作:創(chuàng)建1線程池,設(shè)置該線程池內(nèi)部有1024線程空間。啟動5
    的頭像 發(fā)表于 02-10 18:09 ?362次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:ThreadPoll

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一
    的頭像 發(fā)表于 01-14 09:40 ?618次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

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

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

    新手怎么學(xué)嵌入式?

    的運行機制。例如,了解數(shù)據(jù)結(jié)構(gòu)中的鏈表、棧和隊列,對于在嵌入式編程中管理數(shù)據(jù)非常有幫助。 2. 選擇合適的編程語言 嵌入式開發(fā)中常用的編程語言有 C
    發(fā)表于 12-12 10:51

    同樣是函數(shù),在CC++中有什么區(qū)別

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

    socket編程中的錯誤處理技巧

    Socket編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間通過TCP/IP協(xié)議進行通信。然而,網(wǎng)絡(luò)通信是不穩(wěn)定的,可能會遇到各種問題,如網(wǎng)絡(luò)延遲、連接中斷、數(shù)據(jù)丟失等。 錯誤處理的重要性 提高程序的健壯性
    的頭像 發(fā)表于 11-01 17:47 ?1537次閱讀

    C語言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?767次閱讀

    C7000優(yōu)化C/C++編譯器

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

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1564次閱讀

    c++編譯后鏈接失敗的原因?如何解決?

    /c++項目,將剛才新建的項目轉(zhuǎn)換為c++項目。 完成后點擊編譯,此時也是正常的。 新建一cpp文件,將原項目的main.c中內(nèi)容全部拷貝到新建的cpp文件中保存,然后刪除原main
    發(fā)表于 07-25 08:13

    ModusToolbox 3.2在c代碼中包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一用純 C 語言編寫的 XMC4700 項目。 我正在嘗試添加一些 C++ 函數(shù),并將其合并到我的原始代碼中。 我可以構(gòu)建獨立的 .cpp/.hpp
    發(fā)表于 07-23 08:21

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費下載
    發(fā)表于 07-19 10:58 ?10次下載

    C++中實現(xiàn)類似instanceof的方法

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