第二章: 类和对象;
有关概念:
1. 对象object:
两个要素:
1. 属性(数据):对象的静态特性:班级人数,专业,所在教室
2. 行为(函数):对象的动态特性:学习,开会等;
2. 类class:
对象所抽象出来的数据类型称为 class;
3. 继承:马 白马 雄性白马;
4. 多态:几个相似的对象(继承而产生的不同的类)在接受到同样的消息之后,反应各不相同;
一、类和对象的定义:
类class 是抽象的不占用内存; 对象是具体的,需要占用内存;
二、类类型的声明:
class 类名
{
private:
私有变量和成员函数;
public:
公有变量和函数;
};
例:
class Student
{
private:
int num;
string name;
char sex;
public:
void display();
};
void Student :: display()
{
cout << "Your name is :" << name << endl;
cout << "Your number is :" << num << endl;
cout << "Your Sex is :" << sex << endl;
}
Student stu1,stu2;
int main()
{
return 0;
}
注: 如果在
类的定义之中不声明private 或者 public 则默认为私有类型;( 与结构体不同 );
结构体在不声明时,默认为public类型;
除此之外,还有一种 protected数据类型, 不能够被类外的函数调用,但是可以被派生类的函数调用(private都不可以);
三、 声明对象的方法:
1. 先声明类类型,再定义对象:
Student stu1;
2. 在声明类型的同时定义对象:
class Student
{
...
}stu1,stu2;
3. 不出现类名,直接定义对象;
成员函数:
一、成员函数的定义:
1. 在类内定义:
class Student
{
private:
string name;
int num;
char sex;
public:
void display()
{
cout << "Your name is :" << name << endl;
cout << "Your num is :" << num << endl;
cout << "Your sex is :" << sex << endl;
}
void InputData()
{
cout << "Please Input the name,num & sex:" << endl;
cin >> name >> num >> sex;
}
}stu[40];
int main()
{
int n;
while(1)
{
cout << "Please Input the number of the data:" << endl;
cin >> n ;
for(int i = 0; i < n; i++)
{
stu[i].InputData();
}
for(int i = 0; i < n; i++)
{
stu[i].display();
}
}
return 0;
}
2. 在类内定义函数:
class Student
{
private:
string name;
int num;
char sex;
public:
void InputData();
void Display();
}stu[40];
void Student :: InputData()
{
cout << "Please Input the name,num & sex:" << endl;
cin >> name >> num >> sex;
}
void Student :: Display()
{
cout << "Your name is :" << name << endl;
cout << "Your num is :" << num << endl;
cout << "Your sex is :" << sex << endl;
}
int main()
{
Student stu1;
stu1.InputData();
stu1.Display();
return 0;
}
inline 函数:注:
为了 减少函数的调用时间,在类体中的的 函数如果不包括循环等结构,一般在情况下都默认为inline类型;
而在 类外定义的函数,一般情况下不是inline类型;
在类体外定义inline 函数的时候应当注意,必须将类定义和inline函数定义放在同一个cpp文件中,
否则无法通过编译;
四、成员函数的存储方法:
系统会 为每一个成员变量分配空间;但是 不会为函数分配空间( 在外部分配 );
并且 使用同一个this 指针来进行确定是对哪个对象成员进行函数操作;
类声明和成员函数的分离:
如果一个类被多个程序都使用,每一个程序都需要重新定义这个类,工作量太大了;
所以一般的做法就是将类的声明(和仅仅成员函数的声明)放在指定的头文件中!
此时用户如果想要使用这个类,只需要把有关的头文件包括进来就行了,而不必重新声明;
而且成员函数的定义一般不放在头文件之中,而是被另外放在一个头文件中;
例:
可以分别写两个文件:
// volume.h
#include<iostream>
using namespace std;
class Volume
{
private:
int length;
int width;
int height;
public:
void set();
void calcu();
int vol;
void display();
void showvolume();
};
// volume.cpp
#include"volume.h"
void Volume :: set()
{
cout << "Please Input L,W,H:" << endl;
cin >> length >> width >> height;
cout << "Data are set!" << endl;
}
void Volume :: calcu()
{
Volume :: vol = length*width*height;
}
void Volume :: display()
{
cout << "The length is :" << length << endl;
cout << "The width is :" << width << endl;
cout << "The height is :" << height << endl;
}
void Volume :: showvolume()
{
cout << "The volume is :" << length*width*height << endl;
}
为了组成完整的源程序,还应当包括主函数的源文件:
// main.cpp
#include"volume.h"
int main()
{
Volume test;
test.set();
test.display();
test.calcu();
test.showvolume();
return 0;
}
注:
由于将 头文件volume.h放在用户当前目录中,此时头文件应当被双引号“”括起来!!
之后 把多个文件加入到同一个工程之中:
在 编译时,两个cpp文件分别先编译为,两个.obj文件,然后系统再将他们连接起来,生成exe;