先来讲下c和c 中struct (结构体) 之间的区别:
在c中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面 例如:
struct base{ //public
char v1;
int v2;
double v3;
void show(); //error!
};
并且在c结构体中所有成员默认均是公有类型(public)也就是说在结构体外部可以直接通过结构体变量对成员进行访问,例如下面c代码:
struct base s1; //在c中定义结构体变量方式
s1.v1 = 'a';
s1.v2 = 10;
s1.v3 = 95.6;
在c结构体声明中不能使用c 访问修饰符,如:public、protected、private 而在c 中可以使用,例如下面c 代码:
struct baseplus{ //public
int v0;
private:
char v1;
protected:
float v2;
public:
double v3;
};
各修饰符之间有什么区别呢?看下面c 代码:
baseplus s1; //or struct baseplus s1
s1.v0 = 10; //正确
s1.v1 = 'a'; //错误
s1.v2 = 11.3; //错误
s1.v3 = 96.5; //正确
到这里大家可以看到在定义结构体变量的时候有所不同,在c中必须使用struct关键字加结构体类型名来定义变量,如:struct base s1; 而在c 中可以只使用结构体类型名来定义结构体变量,如:baseplus s1; 在c中不允许这么定义。
另外在上面代码中可以看到s1结构体中的成员v0是在所有访问修饰符之前定义的,在结构体外部可以直接访问,因为结构体在没有显式设置访问修饰符的时候都是publict公有类型,跟显式设置publict公有类型的double v3一样,可以在外部直接访问,而v1和v2均不能在结构体外部使用,因为一个是protected(保护修饰符)一个是private(私有修饰符)。
而且c的结构体不能继承(没有这一概念)而c 的结构体可以继承并且还可以定义成模版。例如c 中下面代码也是正确的:
struct base1{
int v1;
double v2;
};
struct base2 : public base1{ //base2公有继承结构体base1 那么base2里面将有v1和v2成员
char v3;
};
base2 s1;
s1.v1 = 10; //从base1继承来的v1
s1.v2 = 13.5; //从base1继承来的v2
s1.v3 = 'a';
template //结构体模版
struct base{
t arr[10];
int v1;
};
base s1; //实例化成char类型
strcpy(s1.arr,"keller");
s1.v1 = 10;
std::cout << s1.arr << "," << s1.v1 << std::endl; //输出:keller,10
在上面已经说了,c结构体中只能定义数据类型,不能定义函数。而c 结构体中不仅可以定义数据,还可以定义函数,因为c 结构体是对c结构体的扩充,使之能像c 类一样。例如在c 中下面结构体声明是可行的:
struct baseplus{
char v1;
private:
int v2;
public:
void show(){std::cout << "v1:" << v1 << ", v2:" << s2 << std::endl;}
};
这样就可以在结构体外部通过结构体变量调用该函数,然后该函数可以直接对结构体内的成员数据进行处理。
上面介绍了c和c 的struct之间的区别,既然c 结构体对c结构体进行了扩充并使其能像c 类一样,那么下面再来讲下c 结构体(struct) 和c 类(class) 之间的区别。
在c 中可以把struct当成是一个类类型,只是他与c 原始的类不同的是,struct默认访问权限是public(上面讲过)可以在外部直接访问,而class默认访问权限是private,外部无法直接访问。只能在通过public修饰符下的函数进行间接访问。这里说的直接访问指的是:可以通过结构体实例或类实例进行直接调用该成员的。例如下面代码:
class classbase1{ //default private
int v1;
};
struct structbase2{ //default public
int v1;
};
classbase1 cb1;
structbase2 sb1;
cb1.v1 = 10; //错误!不可访问
sb1.v1 = 10; //正确!可访问
从上面代码可以看出通过class定义的成员在不加public修饰符的情况下在外部是不允许访问的,这也实现了数据隐藏!而通过struct定义的成员在不加任何修饰符的情况下,在外部是可以直接访问的。这说明他们俩的默认访问权限不同!抛开这个区别,struct和class都是差不多的了。都可以定义在内部定义数据,定义函数,以及都允许继承和用作模版。
虽然struct和class很相像,但我在这里还是建议大家如果成员只是用作存放数据的话,还是使用struct,因为他是数据结构的实体,如果需要存放数据,并且需要定义一系列处理该数据的功能函数,还是建议使用class,毕竟这是类的实体。
好了,上面讲的如果有什么不正确的地方,还请大家指出来,共同进步,谢谢了~