### 类成员的访问

类成员主要是指类中的数据成员和方法（方法也被称之为成员函数）。在定义类时，类成员是具有访问限制的，C++语言提供了 3 个访问限定符用于标识类成员的访问，分别为 public、protected 和 private。public 成员也被称为公有成员，public 成员可以在程序的任何地方进行访问。protected 成员被称为保护成员，该成员只能在该类和该类的派生类（子类）中访问，除此之外，程序的其他地方不能访问保护成员。private 成员也被称为私有成员，该成员只能在该类中访问，派生类以及程序的其他地方均不能访问私有成员。如果在定义类时，没有指定访问限定符，默认为 private。

例如，定义 CUser 类，将各个成员设置为不同的访问级别。其程序代码如下：

struct CUser //定义一个 CUser 类

{

private: //私有成员定义

char m_Username[128] ; //定义数据成员

char m_Password[128]; //定义数据成员

public: //共有成员定义

void SetUsername(const char *pUsername) //共有方法，设置用户名称

{

if (pUsername != NULL) //判断参数是否为空

{

strcpy(m_Username,pUsername);

}

}

char* GetUsername()const //共有方法，获取用户名称

{

return (char*)m_Username; //返回用户名

}

void SetPassword(const char *pPassword) //共有方法，设置密码

{

if (pPassword != NULL) //判断参数是否为空

{

strcpy(m_Password,pPassword);

}

}

char* GetPassword()const //共有方法，获取用户密码

{

return (char*)m_Password;

}

bool Login() //共有方法，验证用户密码

{

if (strcmp(m_Username,"MR")==0 && strcmp(m_Password,"KJ")==0)

{

printf("登录成功!\n");

return true;

}

else

{

printf("登录失败!\n");

return false;

}

}

};

上述代码中，需要注意的是 GetUsername 方法的定义，在方法的最后使用了 const 关键字。在定义类方法时，如果不需要在方法中修改类的数据成员，建议在方法声明的最后使用 const 关键字，表示用户不能在该方法中修改类的数据成员。例如，如果在 GetUsername 方法中试图修改 m_Password 成员或 m_Username 成员将是非法的。

char* GetPassword()const

{

strcpy(m_Password,"KJ"); //错误的代码，不能在 const 方法中修改数据成员

return (char*)m_Password;

}

如果类中包含有指针成员，在 const 方法中不可以重新为指针赋值，但是可以修改指针所指向地址中的数据。例如：

char* GetPassword()const //假设 m_pData 为类 CUser 中的一个字符指针成员

{

m_pData = (char*)m_Username; //错误的代码，不能够在 const 方法中修改成员数据

m_pData[0] = 'K'; //正确的代码，可以修改指针指向的数据

return (char*)m_Password;

}

在定义类之后，需要访问类的成员。通常（静态成员除外），类成员的访问是通过对象实现的。对象被称为类的实例化。当程序中定义一个类时，并没有为其分配存储空间，只有当定义类的对象时，才分配存储空间。对象的定义与普通变量的定义是相同的，如下的代码定义了一个 CUser 类的对象 user。

CUser user;

当定义了类的对象，就可以访问类的成员了。例如：

CUser user; //定义一个对象

user.SetUsername("MR"); //调用 CUser 类的 SetUsername 方法

user.SetPassword("KJ"); //调用 CUser 类的 SetPassword 方法

user.Login(); //调用 CUser 类的 Login 方法

类成员是具有访问权限的，如果类的外部访问私有或受保护的成员将出现访问错误。例如：

CUser user;

strcpy(user.m_Password,"KJ"); //错误的代码，不能访问 CUser 类的私有成员

上述代码试图访问 CUser 类的私有成员 m_Password，产生了编译错误。

在定义类对象时，也可以将类对象声明为一个指针。例如：

CUser *pUser; //声明一个 CUser 类对象指针

程序中可以使用 new 运算符来为指针分配内存。例如：

CUser *pUser = new CUser;

也可以写成如下的格式：

CUser *pUser = new CUser();

如果类对象被定义为指针，需要使用“->”运算符来访问类的成员，而不能使用“.”运算符来访问。例如：

CUser *pUser = new CUser(); //定义一个对象指针，并分配其内存

pUser->SetUsername("MR"); //使用->运算符访问类的 SetUsername 方法

pUser->SetPassword("KJ"); /使用->运算符访问类的 SetPassword 方法

pUser->Login(); /使用->运算符访问类的 Login 方法

delete pUser; //释放为指针分配的内存

如果将类对象定义为常量指针的话，则对象只允许调用 const 方法。例如：

const CUser * pUser = new CUser; //定义一个常量指针对象

pUser->SetPassword("KJ"); //错误的代码，不能够调用非 const 方法

pUser->GetPassword(); //真确的语句，可以调用 const 方法

delete (CUser *)pUser; //释放常量指针