类的定义
类的定义由关键字class指定,类中可以由变量和方法。使用private,public,protect来修饰这些变量和方法。对于私有变量和方法,类不会将其暴露但是,也就是说在外部不能直接访问到类内的私有成员。但是可以通过共有成员来访问私有成员和方法。
#include<stdio.h>
#include<iostream>
class Rect
{
//私有成员变量
private:
int pos_x;
int pos_y;
int width;
int height;
//共有成员
public:
void set_para(int _w, int _h)
{
//设置参数
width = _w;
height = _h;
}
void show_info()
{
//打印信息
printf("width = %d; height = %d; length = %d\n", width, height, 2 * (width + height));
}
};
int main()
{
//通过类创建一个对象
Rect R1;
//设置对象参数
R1.set_para(2, 3);
//显示对象信息
R1.show_info();
getchar();
return 0;
}
可以看到在main函数中通过公有方法访问到了对象的私有成员,在上面的简单代码中,还存在问题就是在通过带哦用共有方法来创建对象时,还有两个参数没有指定。本来按道理来说,这样创建对象时不完整了,但是由于类有构造函数和析构函数,因此可以生成一个对象,且生成的对象的成员变量有初始值。
构造函数
构造函数是由类在创建对象时自动调用的,构造函数的调用,于前面介绍的缺省有相似的含义。构造函数会默认调用。
类中的构造函数于类名相同并且可以重载。
#include<stdio.h>
#include<iostream>
class Rect
{
private:
int pos_x;
int pos_y;
int width;
int height;
public:
Rect(int _w, int _h)
{
width = _w;
height = _h;
pos_x = 0;
pos_y = 0;
}
Rect()
{
width = 5;
height = 5;
pos_x = 0;
pos_y = 0;
}
void set_para(int _w, int _h)
{
width = _w;
height = _h;
}
void show_info()
{
printf("width = %d; height = %d; length = %d\n", width, height, 2 * (width + height));
}
};
int main()
{
Rect R1;
Rect R2(2, 3);
R1.show_info();
printf("---------------------------\n");
R1.set_para(2, 3);
R1.show_info();
printf("---------------------------\n");
R2.show_info();
printf("---------------------------\n");
R2.set_para(10, 10);
R2.show_info();
getchar();
return 0;
}
从上面可以看出,使用构造函数,可以在创建对象时对对象进行初始化,在之后依然可以使用公有方法来改变对象的成员。并且在创建R1,R2时,调用的构造函数不相同。
析构函数
析构函数时当类所创建的对象的声明周期结束时会自动调用的方法。其方法名也与类名相似,在其方法名前有个~
。析构函数一般自动调用即可。
#include<stdio.h>
#include<iostream>
class Rect
{
private:
int pos_x;
int pos_y;
int width;
int height;
public:
Rect(int _w, int _h)
{
width = _w;
height = _h;
pos_x = 0;
pos_y = 0;
}
Rect()
{
width = 5;
height = 5;
pos_x = 0;
pos_y = 0;
}
~Rect()
{
printf("析构函数被调用\n");
}
void set_para(int _w, int _h)
{
width = _w;
height = _h;
}
void show_info()
{
printf("width = %d; height = %d; length = %d\n", width, height, 2 * (width + height));
}
};
int main()
{
{
Rect R1;
R1.show_info();
printf("---------------------------\n");
R1.set_para(2, 3);
R1.show_info();
printf("---------------------------\n");
}
Rect R2(2, 3);
R2.show_info();
printf("---------------------------\n");
R2.set_para(10, 10);
R2.show_info();
getchar();
return 0;
}
可以看到在R1生存周期结束时,自动调用了析构函数。