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