C++学习
作为一个面向对象的语言,C++当然有所有面向对象的语言都拥有的类。
因为C++是C语言的超集,所以C++的类既包含原来C语言的结构与联合,又包含了新的class类。
结构与联合
结构与联合是C语言中所包含的传统结构体。
struct是定义结构体的保留字
struct student{
char name[10];
int score;
}stu;
这里定义了一个简单的结构体,能够储存学生的姓名和分数两种数据,是可以公开访问的。
联合类似。
联合的特点是所有的数据共用一个内存地址。
union student{
int a;
char b;
char c;
};
这里的b和c就与a共享内存
class类
class 类型名{
public:
公有成员(包括函数以及数据);
protect:
受保护成员;
private:
私有成员;
};
class类里共有三种成员类型。
第一种:公有成员
包括函数成员和数据成员,文件中可以自由调用的数据与函数。
第二种:私有成员
这种成员性质很好的体现了C++语言的封装的性质,是class类区别于其他类的重要性质。是能够很好的阻止无意间的越权访问。
第三种:保护成员
在未学习继承与派生之前,可以看作与私有成员差不多。
PS:如果未注明,那么在class类中声明的成员视作私有成员。struct中声明的视作公有。这一特点能更好的兼容C语言的结构体。
类的函数
构造函数
构造函数,是类中一个必要的函数。可以不声明,那么类中将会自己默认定义该函数,且函数体为空,当然,我们也可以自己进行定义。在变量及函数生命周期开始时,构造函数会自己调用。值得注意的是,构造函数是一个与类同名的函数,并且构造函数是一个没有返回值的函数。
class stu{
stu (){
};
}
析构函数
析构函数,同样是类中一个必要函数,也可以不声明。类中将会自己默认定义该函数,且函数体为空,当然,我们也可以自己进行定义。在变量及函数生命周期结束时会自动调用。一般如果有指针成分,可以通过判断指针是否为空来确定是否析构。与构造函数类似,析构函数也没有返回值。但在类名前多了一个~符号。
class stu {
~stu (){
};
};
局部类
局部类是☞在函数体中或者类体中定义的类。
因为C++不支持函数嵌套定义,因此我们如果需要定义一个函数,可以在局部类中定义函数体,这样该函数会自动成为inline函数成员。
new与delete
相较于C语言利用malloc和free来管理堆空间内存,C++里更多的使用new和delete这两个保留字来管理堆空间内存。
new负责分配对象内存,分配内存后,调用构造函数构造对象;
delete负责释放内存,在释放内存之前,调用析构函数析构对象。
#include <malloc.h>
#include <process.h>
class ARRAY{
int *a;
int r,c;
public:
ARRAY(int x,int y); //构造及析构函数的访问权限为public
~ARRAY();
};
ARRAY::ARRAY(int x,int y)
{
a=new int[(r=x)*(c=y)]; //整形数组a不需构造,可以用malloc
}
ARRAY::~ARRAY()
{
if(a){delete a;a=0;} //整形数组a不需析构,可以用free
}
ARRAY x(3,5);
void main (void)
{
int error=0;
ARRAY y(3,5),*p;
p=new ARRAY(5,7);//对于P的new,分配内存空间,我们应当注意,这里有构造函数,不能使用malloc;
switch(error){
case 0: delete p;//对于p,ARRAY要调用析构函数,不能用free
return;
case 1: y.~ARRAY();//先析构,再退出
delete p;
exit(1);//先delete再exit;
case 2: x.~ARRAY();
y.~ARRAY();//先析构,再退出
delete p;
abort();
}
delete p;
}
程序可能吃编译器,代码有什么问题,可以帮我滴滴BUG。
下次再见!