天天看点

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修饰返回的引用,代表返回的引用不能被改变 (函数不能返回一个临时的变量作为引用,引用的本质是地址)