91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

C++新手容易犯的十個(gè)編程錯(cuò)誤

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

掃碼添加小助手

加入工程師交流群

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

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

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


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

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

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


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

3 在編寫(xiě)類(lèi)的時(shí)候,在類(lèi)的結(jié)尾處忘記添加 ";" 分號(hào)了

在類(lèi)的結(jié)尾處忘記添加分號(hào),編譯會(huì)報(bào)錯(cuò),新人們有可能找了半天也沒(méi)找出引起編譯錯(cuò)誤的原因。 其實(shí)很簡(jiǎn)單,在類(lèi)的結(jié)尾處忘記添加分號(hào)了。


class Shape
{
    // ...
};

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

在添加類(lèi)的函數(shù)時(shí),只在類(lèi)的頭文件中添加了函數(shù)聲明,但在 cpp 中卻沒(méi)有添加函數(shù)的實(shí)現(xiàn)。 如果其他地方調(diào)用到該函數(shù),在編譯鏈接的時(shí)候會(huì)報(bào)unresolved external symbol錯(cuò)誤。因?yàn)闆](méi)有實(shí)現(xiàn),所有沒(méi)有供鏈接使用的 obj 文件。

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

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

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

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


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


    // ......


    return chResult;
}

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

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


class Shape()
{
    // ...


    virtual void Draw();


    // ...
}

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

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


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ù)類(lèi)型使用雙指針
{
    memcpy(*pInfo, m_codecInfo, sizeof(CodecInfo));
}

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

比如新人用 VS-MFC 庫(kù)編寫(xiě)一個(gè)測(cè)試用的工具軟件,結(jié)果在發(fā)布 release 版本程序時(shí),沒(méi)有將程序依賴的 C 運(yùn)行時(shí)庫(kù)帶上,導(dǎo)致該工具軟件在某些電腦中啟動(dòng)報(bào)錯(cuò),提示找不到 C 運(yùn)行時(shí)庫(kù): 因?yàn)槌绦蛑幸蕾嚵藙?dòng)態(tài)版本的運(yùn)行時(shí)庫(kù)和 MFC 庫(kù),在發(fā)布程序時(shí)要將這些庫(kù)帶上。有些系統(tǒng)中沒(méi)有這些庫(kù),程序啟動(dòng)時(shí)就會(huì)報(bào)找不到庫(kù),就會(huì)啟動(dòng)失敗。

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

本來(lái)應(yīng)該要進(jìn)行深拷貝的,卻使用了淺拷貝(直接賦值),導(dǎo)致另個(gè)不同生命周期的 C++ 對(duì)象指向了同一塊內(nèi)存,一個(gè)對(duì)象將內(nèi)存釋放后,另一個(gè)對(duì)象再用到這塊內(nèi)存,就造成了內(nèi)存訪問(wèn)違例,產(chǎn)生異常。 有個(gè)經(jīng)典的 C++ 筆試題,讓我們實(shí)現(xiàn) String 類(lèi)的相關(guān)函數(shù),其主要目的就是用來(lái)考察對(duì)深拷貝與淺拷貝的理解的。題目中給出 String類(lèi)的聲明:


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;
};
讓寫(xiě)出上述幾個(gè)函數(shù)的內(nèi)部實(shí)現(xiàn)。這些函數(shù)的實(shí)現(xiàn)代碼如下:

//普通構(gòu)造函數(shù)  
String::String(const char *str)
{
  if (str == NULL)
  {
    m_data = new char[1];// 得分點(diǎn):對(duì)空字符串自動(dòng)申請(qǐng)存放結(jié)束標(biāo)志'?'的,加分點(diǎn):對(duì)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)// 得分點(diǎn):輸入?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) // 得分點(diǎn):輸入?yún)?shù)為const型  
{
  if (this == &other)//得分點(diǎn):檢查自賦值  
    return *this; 
  if (m_data)
      delete[] m_data;//得分點(diǎn):釋放原有的內(nèi)存資源  
  int length = strlen(other.m_data);
  m_data = new char[length + 1];//加分點(diǎn):對(duì)m_data加NULL判斷  
  strcpy(m_data, other.m_data);
  return *this;//得分點(diǎn):返回本對(duì)象的引用    
}

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

    關(guān)注

    90

    文章

    3716

    瀏覽量

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

    關(guān)注

    22

    文章

    2123

    瀏覽量

    77106

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    汽車(chē)網(wǎng)絡(luò)安全開(kāi)發(fā)語(yǔ)言選型指南:C/C++/Rust/Java等主流語(yǔ)言對(duì)比+Perforce QAC/Klocwork工具支持

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

    大常見(jiàn)的芯片燒錄錯(cuò)誤,第5個(gè)幾乎人人都遇到過(guò)

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

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

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)
    發(fā)表于 12-24 07:23

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

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

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

    ,尤其是在涉及到類(lèi)型轉(zhuǎn)換時(shí),會(huì)盡量防止隱式的、可能導(dǎo)致問(wèn)題的類(lèi)型轉(zhuǎn)換。 相比之下,C語(yǔ)言允許更多的靈活性,但也更容易產(chǎn)生類(lèi)型相關(guān)的運(yùn)行時(shí)錯(cuò)誤,因?yàn)槠漕?lèi)型檢查不如C++嚴(yán)格。 3、函數(shù)
    發(fā)表于 12-11 06:23

    C++程序異常的處理機(jī)制

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

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

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

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

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

    避雷!樹(shù)莓派初學(xué)者常犯的5個(gè)錯(cuò)誤!

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

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

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

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

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

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

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

    成功設(shè)計(jì)符合EMC/EMI設(shè)計(jì)要求的十個(gè)技巧

    成功設(shè)計(jì)符合EMC/EMI測(cè)試要求的十個(gè)技巧1.保持小的環(huán)路當(dāng)存在一個(gè)磁場(chǎng)時(shí),一個(gè)由導(dǎo)電材料形成的環(huán)路充當(dāng)了天線,并且把磁場(chǎng)轉(zhuǎn)換為圍繞環(huán)路流動(dòng)的電流。電流的強(qiáng)度與閉合環(huán)路的面積成正比。因此,應(yīng)盡
    發(fā)表于 04-15 13:46

    C++學(xué)到什么程度可以找工作?

    C++開(kāi)發(fā)的工作不僅需要深厚的編程功底,還要具備解決實(shí)際問(wèn)題的能力,以及良好的溝通能力和團(tuán)隊(duì)協(xié)作精神。此外,持續(xù)學(xué)習(xí)和更新自己的知識(shí)體系也是保持競(jìng)爭(zhēng)力的關(guān)鍵。
    發(fā)表于 03-13 10:19