从结构体到类
对面向对象编程(OOP)来说,一切都是对象,对象用类来描述。
class 类名
{
public:
成员一的数据类型 成员名一;
成员二的数据类型 成员名二;
成员三的数据类型 成员名三;
......
成员n的数据类型 成员名n;
};
基本概念
- 类的成员可以是变量,也可以是函数。
- 类的成员变量也叫属性。
- 类的成员函数也叫方法/行为,类的成员函数可以定义在类的外面。
- 用类定义一个类的变量叫创建(或实例化)一个对象。
- 对象的成员变量和成员函数的作用域和生命周期与对象的作用域和生命周期相同。
使用结构体如下:
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
struct st_girl // 超女基本信息结构体st_girl,存放了超女全部的数据项。
{
string name; // 姓名。
int age; // 年龄。
int height; // 身高(cm)。
double weight; // 体重(kg)。
char sex='X'; // 性别:X-女;Y-男。
int yz; // 颜值:1-漂亮;2-一般;3-歪瓜裂枣。
string special; // 特长。
string memo; // 备注。
};
void setvalue(st_girl& girl, string name, int age, int height, double weight,
char sex, int yz, string special, string memo)
{
girl.name = name;
girl.age = age;
girl.height = height;
girl.weight = weight;
girl.sex = sex;
girl.yz = yz;
girl.special = special;
girl.memo = memo;
}
void show(const st_girl& girl)
{
cout << "姓名:" << girl.name << ",年龄:" << girl.age << ",身高:" << girl.height
<< ",体重:" << girl.weight << ",性别:" << girl.sex << ",颜值:" << girl.yz
<< ",特长:" << girl.special << ",备注:" << girl.memo << endl;
}
int main()
{
st_girl girl;
setvalue(girl, "西施", 26, 170, 50.5, 'X', 1, "唱歌、跳舞、洗衣服。", "春秋第一美女,四大美女之一。");
show(girl);
}
将方法也定义到结构体中:
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
struct st_girl // 超女基本信息结构体st_girl,存放了超女全部的数据项。
{
string name; // 姓名。
int age; // 年龄。
void setvalue(string name1, int age1) // 设置成员变量的值。
{
name = name1; age = age1;
}
void show() // 显示超女的自我介绍。
{
cout << "姓名:" << name << ",年龄:" << age << endl;
}
};
int main()
{
st_girl girl; // 创建结构体变量。
girl.setvalue("西施", 26); // 设置成员变量的值。
girl.show(); // 显示超女的自我介绍。
}
使用类如下:
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class CGirl // 超女类CGirl。
{
public:
string name; // 姓名。
int age; // 年龄。
void setvalue(string name1, int age1); // 设置成员变量的值。
void show() // 显示超女的自我介绍。
{
cout << "姓名:" << name << ",年龄:" << age << endl;
}
};
void CGirl::setvalue(string name1, int age1) // 设置成员变量的值。
{
name = name1; age = age1;
}
int main()
{
CGirl girl; // 创建超女对象。
girl.setvalue("西施", 26); // 设置成员变量的值。
girl.show(); // 显示超女的自我介绍。
}
类的访问权限
类的成员有三种访问权限:public、private和protected,分别表示公有的、私有的和受保护的。
- 在类的内部(类的成员函数中),无论成员被声明为 public还是private,都可以访问。
- 在类的外部(定义类的代码之外),只能访问public成员,不能访问 private、protected成员。
- 在一个类体的定义中,private 和 public 可以出现多次。
- 结构体的成员缺省为public,类的成员缺省为private。
- private的意义在于隐藏类的数据和实现,把需要向外暴露的成员声明为public。
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class CGirl // 超女类CGirl。
{
public:
string name; // 姓名。
private:
int age; // 年龄。
public:
void setvalue(string name1, int age1); // 设置成员变量的值。
void show() // 显示超女的自我介绍。
{
cout << "姓名:" << name << ",年龄:" << age << endl;
}
};
void CGirl::setvalue(string name1, int age1) // 设置成员变量的值。
{
name = name1; age = age1;
}
int main()
{
CGirl girl; // 创建超女对象。
girl.setvalue("西施", 26); // 设置成员变量的值。
girl.show(); // 显示超女的自我介绍。
}
使用类
- 类的成员函数可以直接访问该类其它的成员函数(可以递归)。
- 类的成员函数可以重载,可以使用默认参数。
- 类指针的用法与结构体指针用法相同。
- 类的成员可以是任意数据类型(类中枚举)。
- 可以为类的成员指定缺省值(C++11标准)。
- 类可以创建对象数组,就像结构体数组一样。
- 对象可以作为实参传递给函数,一般传引用。
- 可以用new动态创建对象,用delete释放对象。
- 在类的外部,一般不直接访问(读和写)对象的成员,而是用成员函数。数据隐藏是面向对象编程的思想之一。
- 对象一般不用memset()清空成员变量,可以写一个专用于清空成员变量的成员函数。
- 对类和对象用sizeof运算意义不大,一般不用。
- 用结构体描述纯粹的数据,用类描述对象。
- 在类的声明中定义的函数都将自动成为内联函数;在类的声明之外定义的函数如果使用了inline限定符,也是内联函数。
- 为了区分类的成员变量和成员函数的形参,把成员变量名加m_前缀或_后缀,如m_name或name_。
- 类的分文件编写。
专用于清空成员变量的成员函数如下: