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修飾傳回的引用,代表傳回的引用不能被改變 (函數不能傳回一個臨時的變量作為引用,引用的本質是位址)