天天看點

C++知識點:const的作用

    C++有操作記憶體的能力,但是這也增加了出錯的幾率。在增加程式的高效和程式設計的靈活性的同時,我們也要特别的關注程式的健康和穩定。

    有些知識點,但在程式設計過程中容易被忽略,這種忽略一般是因為壞的程式設計習慣,并不嚴謹的程式設計模式,對于知識點的一知半解。要形成好的程式設計習慣,寫出高品質的代碼就必須對一些知識點有清楚的認識。

    下面是我在項目中總結的一些知識點。

(一)const的作用

    首先,const修飾的變量代表這個變量配置設定好記憶體後就應該立刻初始化,初始化以後這個變量的值就不能改變了。這個我們拿const修飾的的常變量和宏相比。

     1.前者是變量會做格式的檢查,宏不會做格式檢查,是以前者相對安全,減少出錯的可能。

      2.程式時出錯時調試的時候,宏通常隻會顯示具體的值而不會顯示宏的名稱,這樣就增加了定位問題的難度。但是const修飾的常變量則和其他的變量一樣會顯示出錯的變量名,定位問題相對的容易。

   其次,我們用一個短小的程式說明const在函數中的作用。

#include 
   
    
using std::string;

class CPerson
{
public:
	enum Sexual{ man, woman,other};

	CPerson(Sexual sex);
	~CPerson(){};
	void setName(const string& name);//1.const代表的是不會改變函數調用的參數(引用)的值
	void printData() const;         //2.const代表的是此函數不會改變任何一個成員變量的值
	const string& getName();        //3.const代表傳回的引用不能被改變 ,但是并不能傳回一個臨時的變量  

private:
	string         m_strName;
	const Sexual   m_enSex;

public:// 将變量聲明為public并不合适
    int             m_iAge;
    float           m_iWeight;
    float           m_iHight;
};

#include "A0624.h"
#include 
    
     

CPerson::CPerson(Sexual sex):m_enSex(sex){}

// CPerson::CPerson(Sexual sex){ m_enSex = sex; }  //ERROR “CPerson::m_enSex” const修飾的成員變量: 必須在構造函數基/成員初始值設定項清單中初始化

void CPerson::setName(const string& name)
{
	m_strName = name;
}

const string& CPerson::getName()
{
	return m_strName;
}

void CPerson::printData() const   //不僅聲明中要帶const,在定義的時候也要帶const
{
	std::cout<<"the name is " <
     
      << std::endl;
	std::cout<<"the age is "  <
      
       << std::endl;
	std::cout<<"the hight is " <
       
        << std::endl; std::cout<<"the weight is " <
        
         << std::endl; std::cout<<"the person is " << (( m_enSex == Sexual::man)? "man":"woman") << std::endl; } int main(void) { CPerson person(CPerson::Sexual::man); std::string name("BinJey"); person.setName(name); // name的值不會被改變 person.m_iAge = 20; person.m_iHight = (float)1.89; person.m_iWeight = 178; const std::string & sName = person.getName(); // sName = "change"; // ERRO C2678: 二進制“=”: 沒有找到接受“const std::string”類型的左操作數的運算符(或沒有可接受的轉換) person.printData(); return 0; } 
        
       
      
     
    
   
           

    1.const修飾參數引用,代表的是不會改變函數調用的參數(引用)的值   2.const放在聲明和定義的後面,代表的是此函數不會改變任何一個成員變量的值   3.const修飾傳回的引用,代表傳回的引用不能被改變 (函數不能傳回一個臨時的變量作為引用,引用的本質是位址)