C++中的class和struct定义方式非常相似,都可以包含成员变量和成员函数,甚至可以互相继承。但实际上,class和struct还是存在一些差别的。下面从以下三个方面对它们进行详细的比较:
定义语法
在定义上,class和struct的语法非常相似,但是有一个小差别:
// 定义class
class MyClass {
public:
int a;
void func();
};
// 定义struct
struct MyStruct {
public:
int a;
void func();
};
可以看到,它们的定义上没有本质上的区别,仅仅是关键字不同而已。
但是,由于历史原因,C++中结构体的默认访问控制是public,而class的默认访问控制是private。因此,我们通常将struct用于只包含数据的简单结构体、class用于更为复杂的对象。
继承方式
在继承上,class默认继承方式为private,而struct默认继承方式为public。具体的说明可以看下面的示例:
class BaseClass {
public:
int pub_a;
protected:
int pro_a;
private:
int pri_a;
};
class DerivedClass : private BaseClass {
// 在此处的继承方式为private
public:
int pub_b;
};
struct BaseStruct {
public:
int pub_a;
protected:
int pro_a;
private:
int pri_a;
};
struct DerivedStruct : BaseStruct {
// 在此处的继承方式为public
public:
int pub_b;
};
在示例中,BaseClass和BaseStruct都包含三个访问控制符,分别为public、protected、private。其中,DerivedClass和DerivedStruct都继承自BaseClass和BaseStruct,但不同的是,在DerivedClass中,继承方式为private;而在DerivedStruct中,继承方式为public。
内存对齐
在内存对齐上,由于历史原因,C++中的struct有一个默认的内存对齐方式,而class没有。
具体来说,struct默认情况下以最长的成员变量的大小为对齐单位,而class默认情况下以最严格的对齐方式为对齐单位。这也是为什么struct的大小一般会比class大一些的原因。
下面看一个示例来具体说明:
struct MyStruct {
char c1;
int i;
char c2;
double d;
};
class MyClass {
char c1;
int i;
char c2;
double d;
};
int main() {
cout << "sizeof(MyStruct) = " << sizeof(MyStruct) << endl;
cout << "sizeof(MyClass) = " << sizeof(MyClass) << endl;
return 0;
}
在上面的代码中,我们分别定义了一个struct和class,它们包含了四个成员变量:一个字符、一个整数、一个字符、一个双精度浮点数。可以看到,输出结果的大小是不同的,前者是16,后者是24。
综上所述,C++中的class和struct在语法上并没有太大的区别,主要是在默认的访问控制、继承方式和内存对齐上有一些小差别。我们一般将struct用于简单的数据结构,而将class用于复杂的对象定义,以便于对它们进行更严格的访问控制和封装。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ class和struct到底有什么区别详解 - Python技术站