类
一.基本概念
- 在c语言中,结构体就是将相同或不同属性的类型数据放在一起,而里面并不能定义函数,但是在c++当中,结构体里面不仅可以定义不同类型的数据,还可以定义用来操作这些数据的方法(函数),在c++当中更喜欢用class来代替struct定义结构体。
**注:**class定义的结构体,成员默认是private;struct定义的结构体,成员默认是public
struct student
{
char name[20];
char gender[3];
int age;
};
class student2
{
char name[20];
char gender[3];
int age;
int add(int left, int right)
{
return left + right;
}
};
int main()
{
student s1;//这里再定义结构体变量时不像c语言那样还要加struct
s1.age = 10;
student2 s2;
s2.age = 20;//这里编译器会报错
}
- 在c++中结构体更喜欢叫类,class位定义类的关键字,类中的数据称为类的属性或者类的成员变量;类中的函数称为类的方法或者类的成员函数。
二.了解封装的思想
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。
注:函数就是封装的一种形式,函数中的语句被封装在函数本身这个更大的实体当中,被封装的实体隐藏了他们的实现细节,可以调用该函数但是不能够访问函数中的语句。访问限定符:public(公有)成员可以在类外直接访问,protected(保护)和private(私有)成员在类外不能访问。
注:- 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
- 成员变量在类中具有全局作用域,因为编译器在编译类时,不是从前到后编译,而是先编译成员变量,所以说,成员变量在类中具有全局作用域。
三:类的对象模型
- 用类类型创建对象的过程,称为类的实例化
- 类的对象模型:类中各成员在内存中的布局形式
因为类中不仅有成员变量,还有成员函数,那么一个类的对象到底包含了什么?
- 存储方式一
缺陷:每个成员变量是不同的,但是函数都是相同的,如果一个类创建多个对象,每个对象都要保存一份函数代码,这样太浪费空间了。 存储方式二
只将代码保存一份,创建对象时多给一个指针,存放函数表的首地址
方式二明显比方式一节省了很多空间,但是对象中还是多了一个指针。存储方式三
但是如果按照方式三来存储,对象怎么找到成员函数呢?
- 总结:测试环境:vs2013
class student
{
public:
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
private:
char _name[20];
char _gender[3];
int _age;
};
int main()
{
student s1, s2, s3;
s1.SetStudentInfo("王二狗", "女", 12);
s2.SetStudentInfo("哈哈", "男", 8);
s3.SetStudentInfo("呵呵", "男", 9);
cout << sizeof(s1) << endl;
}
上面的代码打印出的结果位28,可以得出,计算机确实是按照方式三来存储的,至于怎么找到成员函数,下回分解^_^!