静态特征 | 动态特征(行为或者功能) |
---|---|
所属系和专业、学生人数、所在的教师 | 学习、开会、体育比赛 |
若要控制班级中的学生的活动,可从外部对班级发送信息(比如听到广播声就去上早操等),称为消息(message)。
C++对于C的改进最重要的就是增加了**类**这样一个类型。
基于过程的结构化程序设计 | 基于对象和面向对象的程序设计 |
---|---|
程序 = 算法 + 数据结构 | 对象 = (对象 + 对象 + 对象 +…) + 消息 |
消息的作用就是对对象的控制。
主要包括:分析、设计、编程、测试、维护,这5个部分。
C++中对象的类型称为类(class),类代表了某一批对象的共性和特征。
类是对象的抽象,而对象是类的具体实例(instance)。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。
结构体声明:
struct Student
{
//定义数据成员
int num;
char name[20];
char sex;
};
Student stud1,stud2;
类声明:
class Student
{
//定义三行数据成员
int num;
char name[20];
char sex;
//定义成员函数
void display()
{
cout<<"num:"<<num<<num<<ensl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
};
Student stud1,stud2;
注意:如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。比如以上的那个class就是。
对类的声明一般形式:
class 类名
{
private:
私有的数据和成员函数;
public:
公用的数据和成员函数;
}
private
和public
称为成员访问限定符。被声明为**私有的(private)成员,只能被本类中的成员函数调用,类外不能调用。被声明为公有的(public)**成员,既可以被本类中的成员函数所引用,也可以被类的作用域外的其他函数引用。class Student
{
private:
int num;
char name[20];
char sex;
public:
void display()
{
cout<<"num:"<<num<<num<<ensl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
};
Student stud1,stud2;
//第一种:class 类名 对象名;
class Student stud1,stud2;
//第二种:类名 对象名;
Student stud1,stud2;
class Student
{
private:
int num;
char name[20];
char sex;
public:
void display()
{
cout<<"num:"<<num<<num<<ensl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
}stud1,stud2;
class
{
private:
...
public:
...
}stud1,stud2;
除了在类体中可以定义成员函数也可以在类的外面进行函数定义。
"::"是作用域限定符(field qualifier)或称为作用域运算符,用它声明函数是属于哪个类的。
在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好对的习惯。
class Student
{
private:
int num;
char name[20];
char sex;
public:
void display();
}
void Student::display() // Student::是为了限定外面这个display()函数是属于Student类中的display()函数。
{
cout<<"num:"<<num<<num<<ensl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
Student stud1,stud2;
C++要求对一般的内置函数要用关键字inline
声明,但对于类内定义的成员函数,可以省略inline,因为这些成员函数已经被隐含的指定为内置函数。
如果成员函数不在类内定义,而在类外定义,系统并不把它默认为是内置函数,调用这些函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline
作显式声明。
如:
class Student
{
private:
int num;
char name[20];
char sex;
public:
inlie void display();
}
inline void Student::display() // Student::是为了限定外面这个display()函数是属于Student类中的display()函数。
{
cout<<"num:"<<num<<num<<ensl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
C++编译器中每个对象的存储空间只是该对象的数据成员所占用的存储空间,而不包括函数代码所占用的存储空间。
比如声明类:
class Time
{
public:
int hour;
int minute;
int sec;
void set():
cin>>a>>b>>c;
};
获取该class占用的字节数:
cout<<sizeof(Time)<<endl;//输出值为12,证明了以上观点。
如果定义了10个对象,这些对象的成员函数对应的应是同一个函数代码段,而不是10个不同的函数代码段。
因此:
三种
对象名.成员名
stud1.num=10000;//调用数据成员
stud1.display();//调用成员函数
display();//当做调用普通函数处理
class Time
{
public://公用数据成员
int hour;
int minute;
int sec;
};
Time t,*p;//定义对象t和指针变量p
p=&t;//使得p指向对象t
cout<<p->hour;//输出p指向的对象中的成员hour
Time t1;
Time &t2=t1;//定义Time类引用t2,并使之初始化为t1【由于t2指向的t1的存储单元,因此t2就是t1】
cout<<t2.hour;
.h
;类实现文件.cpp
;类的使用文件.cpp
,即主文件。stud
是对象;display()
是方法;stud.display();
是一个发送给对象的消息。#include
using namespace std;
class Time
{
private:
int hour;
int minute;
int second;
public:
void InputTime();
void OutputTime();
};
void Time::InputTime()
{
cin>>hour>>minute>>second;
}
void Time::OutputTime()
{
cout<<hour<<':'<<minute<<':'<<second<<endl;
}
int main()
{
Time t1;
t1.InputTime();
t1.OutputTime();
return 0;
}
2. 对1的例子定义多个 类对象,并分别输入和输出个对象中的时间
注意:C中要求所有的声明必须都集中写在本模块的开头。但C++中声明可出现在程序的任何行!!
#include
using namespace std;
class Time
{
public:
void InputTime();
void OutputTime();
private:
int hour,minute,second;
};
int main()
{
Time t1,t2;
t1.InputTime();
t1.OutputTime();
t2.InputTime();
t2.OutputTime();
return 0;
}
void Time::InputTime()
{
cin>>hour>>minute>>second;
}
void Time::OutputTime()
{
cout<<hour<<':'<<minute<<':'<<second<<endl;
}
//找出输入整数数据的最大值
#include
using namespace std;
#define len 5
class FindMaxValue
{
public:
void InputData();
void FindMax();
void OutputData();
private:
int data[len];
int max;
};
void FindMaxValue::InputData()
{
cout<<"请输入一组整数:"<<endl;
for(int i=0;i<len;i++)
cin>>data[i];
}
void FindMaxValue::FindMax()
{
max=data[0];
for(int i=0;i<len;i++)
{
if (data[i]>max)
max=data[i];
}
}
void FindMaxValue::OutputData()
{
cout<<"这组整数中最大值为:"<<max<<endl;
}
int main()
{
FindMaxValue m;
m.InputData();
m.FindMax();
m.OutputData();
return 0;
}
arraymax.h
中;成员函数定义放在arraymax.cpp
中;主函数放在ClassPractice.cpp
中。注意1: 在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):
#ifndef CIRCLE_H
#define CIRCLE_H
//你的代码写在这里
#endif
这样做是为了防止重复编译,不这样做就有可能出错。至于CIRCLE_H
这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。建议类的头文件和类的具体实现命名相同。
注意2: 类的具体实现以及主函数里需要引用这个.h文件,引用方法是#include "名字.h"
,要注意这个是双引号引用自定义的.h文件,而不是单尖括号。
具体实现步骤:
文件结构:
arraymax.h
类头文件:
#ifndef ARRAYMAX_H //预编译文件
#define ARRAYMAX_H
#define len 5
//你的代码写在这里
class FindMaxValue
{
public:
void InputData();
void FindMax();
void OutputData();
private:
int data[len];
int max;
};
#endif
arraymax.cpp
类成员定义文件
#include "iostream"
#include "arraymax.h"
using namespace std;
void FindMaxValue::InputData()
{
cout<<"请输入一组整数:"<<endl;
for(int i=0;i<len;i++)
cin>>data[i];
}
void FindMaxValue::FindMax()
{
max=data[0];
for(int i=0;i<len;i++)
{
if (data[i]>max)
max=data[i];
}
}
void FindMaxValue::OutputData()
{
cout<<"这组整数中最大值为:"<<max<<endl;
}
主函数放ClassPractice.cpp
文件内容:
#include
#include "arraymax.h"
using namespace std;
//#define len 5
int main()
{
FindMaxValue m;
m.InputData();
m.FindMax();
m.OutputData();
return 0;
}