类声明格式
class className
{
private:
data member declaration
public:
member function prototypes
};
类定义简单例子
class Person {
private:
string name;
string sex;
int age;
double salary;
double annual_salary;
void total_salary() { annual_salary = 12 * salary; }
public:
void initial(const string & na, string s, int a, double sa);
void show();
};
类设计尽可能将公有接口和实现细节分开,两个关键字private和public描述了对类成员的访问控制。private成员只能通过公有成员函数(或友元函数)来访问,防止程序直接访问数据被称为数据隐藏。数据隐藏(将数据放在类中的私有部分中)是一种封装。
#include
#include
using namespace std;
class Person {
private:
string name;
string sex;
int age;
double salary;
double annual_salary;
void total_salary() { annual_salary = 12 * salary; }
public:
void initial(const string & na, string s, int a, double sa);
void setname(string na);
void setsex(string s);
void setage(int a);
void setsalary(double sa);
void show();
};
void Person::setname(string na)
{
name = na;
}
void Person::setsex(string s)
{
sex = s;
}
void Person::setage(int a)
{
age = a;
}
void Person::setsalary(double sa)
{
salary = sa;
total_salary();
}
void Person::show()
{
cout << "name: " << name << " sex: " << sex << " age: " << age
<< " salary: " << salary << " annual_salary: " << annual_salary << endl;
}
void Person::initial(const string & na, string s, int a, double sa)
{
name = na;
sex = s;
age = a;
salary = sa;
total_salary();
}
int main()
{
Person x_ming;
x_ming.initial("x_ming", "man", 20, 90.670);
x_ming.show();
Person z_sang;
z_sang.setname("z_sang");
z_sang.setsex("man");
z_sang.setage(23);
z_sang.setsalary(80.03);
z_sang.show();
Person *pl_si = new Person;
pl_si->setname("l_si");
pl_si->setsex("man");
pl_si->setage(26);
pl_si->setsalary(112.23);
pl_si->show();
system("pause");
return 0;
}
name: x_ming sex: man age: 20 salary: 90.67 annual_salary: 1088.04
name: z_sang sex: man age: 23 salary: 80.03 annual_salary: 960.36
name: l_si sex: man age: 26 salary: 112.23 annual_salary: 1346.76
请按任意键继续. . .
tip:name,sex,age,salary都是私有变量,不能直接访问,通过公有成员函数访问。若是这样:error!!!!
Person Mrerror;
Mrerror.name = "Mrerror";
Mrerror.sex = "man";
Mrerror.age = 1024;
Mrerror.salary = 0.00;
简单的谈一下封装吧,private关键字为了更好的隐藏类的内部实现。不希望外部知道的、或者只在类内部使用的、或对外部没有影响的成员,都建议声明为private。
好的,声明为private之后怎么访问呢,上面的代码已经很清楚了。添加public 属性的成员函数,一个用来设置成员变量的值,一个用来修改成员变量的值。上面的代码中,setname()、setage()、setsex() 函数就用来设置成员变量的值;如果希望获取成员变量的值,可以再添加三个函数 getname()、getage()、getsex()。
给成员变量赋值的函数通常称为 set 函数,它的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它的名字通常以get开头,后跟成员变量的名字。
当然还可以使用构造函数啦
代码请见1.1中标紫色部分。刚接触类,在coding中可能会犯这样的迷糊,就是我这么写
void Person::initial(const string & name, string sex, int age, double salary)
或者接下来会有的构造函数比如
Person::Person(const string & name, string sex, int age, double salary)
也就是将成员变量名称用作参数名了,这是不对的!!!
构造函数(成员函数)的参数不是类成员,而是赋给类成员的值。因此,参数名不能和类成员相同,否则,代码会变成这样
name = name;
sex = sex;
age = age;
salary = salary;
可怕,为了避免这样的情况,有两种方法。
a.在成员变量加前缀m_,这样
class Person {
private:
string m_name;
string m_sex;
int m_age;
double m_salary;
double m_annual_salary;
}
b.在成员变量使用后缀_,这样
class Person {
private:
string name_;
string sex_;
int age_;
double salary_;
double annual_salary_;
}
pl_si->setname("l_si");
pl_si->setsex("man");
pl_si->setage(26);
pl_si->setsalary(112.23);
pl_si->show();
位于类声明中的函数都将自动成为内联函数,因此,Person::total_salary()是一个内联函数。也可以在类声明之外定义成员函数,并让他成为内联函数。只需在类实现部分中定义函数时使用inline限定符就ok。这样
class Person {
private:
...
void total_salary();
public:
...
}
inline void Person::total_salary()
{
total_salary = 12 * salary;
}
附:关键字class和class的区别
使用class和struct都可以创建类。如果使用class,类成员在默认状态下是私有的,而struct,类成员在默认状态下是公有的。
class C {
int x;
public:
void setx(int x);
};
等价于
struct C {
void setx(int x);
private:
int x;
};