//test const 使用细则
class Game
{
public:
int a;
};
void function(const Game& obj)
{
//obj.a = 1; //×,内容不可变
}
void function(const string& s)
{
string tmp = "test";
//s = tmp; //×,内容不可变
}
int _tmain(int argc, _TCHAR* argv[])
{
//1. 定义常量(两种本质相同,都是定义常量)
const int a = 100;
int const b = 100;
//a = 1; //错误
//b = 1; //错误
//2. 指针(*在const左侧则则表示指针不可变, 右侧表示内容不可改)
char cDataA[100];
char cDataB[100];
char cDataC[100];
char cDataD[100];
char* const pDataA = cDataA; //定义指针常量
//pDataA = cDataB; //×,指针为常量不可以变
pDataA[0] = 'A'; //√,内容可变
const char* pDataB = cDataA; //指针指向内容不可以改变
pDataB = cDataB; //√,指针可变
//pDataB[0] = 'B'; //×,内容不可变
char const *pDataC = cDataC;
pDataC = cDataB; //√,指针可变
//pDataC[0] = 'A'; //×,内容不可变
const char* const pDataD = cDataD;
//pDataD = cDataB; //×,指针为常量不可以变
//pDataD[0] = 'A'; //×,内容不可变
//3. 函数中使用常量
//void function(const int a); //a为形参,调用时会自动拷贝,无意义(注意:仅限于基本类型[int,bool,float])
//void function(const char* p); //p所指内容不可改变,这个经常要用到
//void function(char* const p); //p为形参,调用时会自动拷贝,无意义
//void function(const Class& a); //此做法是为了提高效率,实际a为地址,不对原对象进行拷贝传递,a中内容不可变
//void function(const Type& a); //此做法是为了提高效率,实际a为地址,不对原对象进行拷贝传递,a中内容不可变
//4. 类中使用常量
class ClassA
{
public:
const int a;
char* const p;
int b;
public:
ClassA(int x, char* ptr):
a(x),p(ptr) //√,初始化序列中可以更改常量值
{
//a = x; //×,a的初始化只能在初始化序列中
}
int GetAValue() const //函数后边加const表示此函数不改变类成员变量
{
if(a>0)
return a; //√,返回成员变量是允许的
return b; //√,返回常量也是可以的
}
void SetAValue(int v) const
{
//a = v; //×,不能改变常量参数
//b = v; //×,函数声明为const不能改变类中成员变量的值
}
void SetBValue(int v)
{
b = v;
}
};
const ClassA CA(10,NULL);
CA.GetAValue(); //√,常量对象可以调用常量对象方法
//CA.SetBValue(1); //×,常量对象不能调用非常量(const)函数
const ClassA* pCA = new ClassA(10, NULL);
pCA->GetAValue(); //√,常量对象可以调用常量对象方法
//pCA->SetBValue(1); //×,常量对象不能调用非常量(const)函数
ClassA NA(10, NULL);
NA.GetAValue(); //√,非常量对象可以调用常量对象方法
NA.SetBValue(1); //√,非常量对象可以调用普通对象方法
getchar();
return 0;
}