哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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


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

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

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


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

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

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


class Shape
{
    // ...
};

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

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

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

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

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

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


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


    // ......


    return chResult;
}

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

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


class Shape()
{
    // ...


    virtual void Draw();


    // ...
}

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

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


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


    // ...
}


CodecInfo* pInfo = new CodecInfo;


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


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

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

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

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

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

本來應該要進行深拷貝的,卻使用了淺拷貝(直接賦值),導致另個不同生命周期的 C++ 對象指向了同一塊內存,一個對象將內存釋放后,另一個對象再用到這塊內存,就造成了內存訪問違例,產生異常。 有個經典的 C++ 筆試題,讓我們實現(xiàn) String 類的相關函數(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ù)的內部實現(xiàn)。這些函數(shù)的實現(xiàn)代碼如下:

//普通構造函數(shù)  
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的析構函數(shù)  
String::~String(void)
{
  delete[] m_data; // 或delete m_data;  
}
 
 
//拷貝構造函數(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;//得分點:釋放原有的內存資源  
  int length = strlen(other.m_data);
  m_data = new char[length + 1];//加分點:對m_data加NULL判斷  
  strcpy(m_data, other.m_data);
  return *this;//得分點:返回本對象的引用    
}

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

    關注

    90

    文章

    3722

    瀏覽量

    97407
  • C++
    C++
    +關注

    關注

    22

    文章

    2124

    瀏覽量

    77333

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux新手最常踩的10命令坑介紹

    從事運維工作余年,帶過不少新人,發(fā)現(xiàn)有些命令錯誤幾乎是每個Linux使用者都曾經遇到過的。這些錯誤輕則導致操作失敗、浪費時間,重則引發(fā)數(shù)據(jù)丟失、服務中斷、生產事故。本篇文章結合2026年
    的頭像 發(fā)表于 04-09 10:11 ?150次閱讀

    keil實現(xiàn)cc++混合編程

    起因項目中使用到一開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項目中,主要有以下三步操作: 在工程選項中 C/C++中去掉勾選
    發(fā)表于 01-26 08:58

    汽車網(wǎng)絡安全開發(fā)語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    汽車網(wǎng)絡安全如何選編程語言?C、C++、Rust、Java……誰更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語言的優(yōu)劣與適用場景,以及Perforce QAC/Klocwork對MISRA、CERT等規(guī)范的
    的頭像 發(fā)表于 12-26 11:13 ?594次閱讀
    汽車網(wǎng)絡安全開發(fā)語言選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    大常見的芯片燒錄錯誤,第5幾乎人人都遇到過

    本文聚焦芯片燒錄環(huán)節(jié),盤點了大常見且易被忽視的錯誤,包括輕視編程器選擇、盲目使用新算法、忽視電源接地質量、芯片接觸不良、跳過空白檢查與校驗、忽略環(huán)境溫度影響等。強調可靠燒錄并非孤立動作,而是涵蓋物料、設備、流程、環(huán)境的質量控制
    的頭像 發(fā)表于 12-25 14:49 ?587次閱讀
    <b class='flag-5'>十</b>大常見的芯片燒錄<b class='flag-5'>錯誤</b>,第5<b class='flag-5'>個</b>幾乎人人都遇到過

    C語言與C++的區(qū)別及聯(lián)系

    C語言和C++到底是什么關系? 首先C++C語言本來就是兩種不同的編程語言,但C++確實是對
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    控制能力,這一點與C語言相似,使得它們在系統(tǒng)編程、嵌入式系統(tǒng)等領域都得到廣泛應用。 3、發(fā)展歷程: C++正是在C語言的基礎上逐步發(fā)展起來的,C
    發(fā)表于 12-11 06:51

    C語言和C++之間的區(qū)別是什么

    ,尤其是在涉及到類型轉換時,會盡量防止隱式的、可能導致問題的類型轉換。 相比之下,C語言允許更多的靈活性,但也更容易產生類型相關的運行時錯誤,因為其類型檢查不如C++嚴格。 3、函數(shù)
    發(fā)表于 12-11 06:23

    C++程序異常的處理機制

    1、什么是異常處理? 有經驗的朋友應該知道,在正常的CC++編程過程中難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數(shù)組越界,內存分配失效、打開相應文件失敗等等。 一
    發(fā)表于 12-02 07:12

    rtsmart開啟C++特性支持后,工具鏈編譯內核不通過怎么解決?

    各位大佬好,本人在rtsmart項目中需要使用C++11特性,在menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi編譯器編譯內核時出現(xiàn) 錯誤
    發(fā)表于 09-29 07:49

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發(fā)現(xiàn)Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助Wir
    的頭像 發(fā)表于 08-06 15:33 ?4442次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?1071次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹莓派上哪種語言更優(yōu)?

    避雷!樹莓派初學者常犯的5錯誤

    如果你剛剛入手樹莓派,你就會知道它潛力無窮,幾乎能實現(xiàn)你想到的任何功能。然而,這種自由也讓你可能在不知不覺中做出對系統(tǒng)有害的操作。在本文中,我將介紹要避免哪些錯誤。初學者最常犯的錯誤包括:損壞SD
    的頭像 發(fā)表于 07-22 17:16 ?1513次閱讀
    避雷!樹莓派初學者常犯的5<b class='flag-5'>個</b><b class='flag-5'>錯誤</b>!

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

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

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉。先說內存這道坎兒。您當stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?1170次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

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

    固態(tài)繼電器(SSR)已成為工業(yè)自動化的無名英雄。它們安靜、可靠、速度快——這是繼電器應具備的所有特點。但就像高科技駕駛艙中的新手飛行員一樣,即使是經驗豐富的工程師在使用SSR時也會常見錯誤。本文讓我們來看看應如何避免在工業(yè)自動
    的頭像 發(fā)表于 04-20 11:42 ?884次閱讀
    塔城市| 新巴尔虎左旗| 兴和县| 娱乐| 鹤峰县| 永和县| 乐山市| 定襄县| 渝北区| 英超| 禹州市| 连南| 会昌县| 哈密市| 乾安县| 济源市| 石屏县| 杭锦后旗| 沅江市| 花莲市| 通化市| 祁东县| 宁陕县| 隆尧县| 通榆县| 安徽省| 桓台县| 南丹县| 榆中县| 博乐市| 罗城| 吕梁市| 太谷县| 江源县| 法库县| 饶河县| 调兵山市| 莒南县| 南漳县| 汉川市| 莲花县|