一、类
将具有相同结构、操作,并遵守相同约束规则的对象聚合成一组,这组对象集合就称为类。它是把许多对象进行抽象。
1、类定义
1.1、类定义的形式
1.11、C++中说明类的一般形式为:
class 类名 {
private: (可缺省)
私有数据成员和函数成员
protected:
保护段
public:
公有数据成员和函数成员
};
1.12、 最低限度应包括如下内容:
- 类名;
- 内部表示,即类里面有哪些数据;(数据成员)
- 对外接口,对于操纵类实例——对象的外部可施加的操作;(成员函数)
- 内部实现,接口数据在内部的动作;(成员函数)
例一:
class Student{//学生类
private:
int age;//数据成员
int ID;//数据成员
char name[20];//数据成员
protected:
void id(){//成员函数 (内部动作)
ID+=1;
}
public:
Student(int a,int I,char *n){//成员函数 (对外接口)
age=a;
ID=I;
strcpy(name,n);
}
void Setage(int a){//成员函数 (对外接口)
age=a;
}
void display(){//成员函数 (对外接口)
id();
cout<<name<<" "<<age<<" "<<ID<<endl;
}
};
1.2、访问属性
1.21、public
属性为public的成员,不仅该可以在该成员所属类的内部进行访问,而且可以在类外通过类的对象来访问。
1.22、private
属性为private的成员,只能在该成员所属类的内部进行访问,而不能在类外通过类的对象来访问。换句话说,对外不可见。在类中可缺省。
1.23、protected
属性为protected的成员,只能在该类所属的类的内部和其类的派生类中进行访问。
1.3、数据成员
1.31、定义:数据成员是一个类的核心内容、设计类的主要内容是设计数据成员。同类的对象之所以互不相同。是由于他们有不同的属性值。
1.32、数据成员的定义格式:
数据成员类型 数据成员名;
例二:
int sum;
char name[20];
float num;
A a;//类A
//或一些自定义的类型
1.33、数据成员的修饰符
如 const 、static、final 等;
1.4、成员函数
1.41、定义:函数的原型要写在类体中的函数。
1.42、成员函数的分类及定义形式:
- 构造函数
默认构造函数 类名 ( ){ }
含参构造函数 类名 (参数表){ }
拷贝构造函数 类名 (类名 & 参数名){ }
例三、 - 析构函数
~类名( ){ } - 一般函数
返回值类型 函数名 (参数表){ }
例三:
class A{ private: int x; int y; public:
A(){
x=0;
y=0;
}
A(int X,int Y){
x=X;
y=Y;
}
A(A &a ){
x=a.x;
y=a.y;
}
void display(){
cout<<x<<" "<<y;
}
~A();
};
1.43 成员函数的定义位置
-
类内:直接写函数体。
-
类外: 其他不变,在函数名前加 “类名::”
返回值类型 类名::函数名 (参数表){ }
或者使用内联函数 inline;
2、类的声明
2.1、类的声明形式
class 类名;
2.2、前向声明
我们可以仅仅声明类而暂时不定义它,这种声明被称为前向声明。在它声明之后定义之前该类是个不完全类型。
不完全类型只能在非常有限的情况下使用:可以定义指向这种类型的指针或引用,也可以作为一个已经声明(但没有定义)的函数的参数或返回类型。
二、对象
1、对象的创建
1.1、在声明类的同时,直接定义对象
class point{
private:
int x, y;
public:
void setpoint(int, int);
int getx();
int gety();
} op1, op2;
1.2、声明类之后,在使用时定义对象
class point{
private:
int x, y;
public:
void setpoint(int, int);
int getx();
int gety();
} ;
int main(void){
point op1,op2;
}
1.3、声明类之后,在使用new定义对象
class point{
private:
int x, y;
public:
void setpoint(int, int);
int getx();
int gety();
} ;
int main(void){
point *op;
op=new point();
}
2、对象的存储
问题:
- 用类去定义对象时,系统会为每一个对象分配存储空间。
- 如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。
- 按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元 。
- 能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。
- 显然,这样做会大大节约存储空。C++编译系统正是这样做的。
得出结论:
每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。