在C++编程语言中,struct
和class
是两个定义数据类型的关键字。尽管它们看起来相似,但它们之间有一些关键的异同。
基本定义
struct
struct
是从C语言继承而来的,它用于定义一个结构体(structure),结构体是由多个数据成员组成的一种用户自定义数据类型。在C++中,struct
不仅仅用于定义数据成员,还可以包含成员函数。
struct MyStruct {
int data1;
float data2;
void display() {
std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
}
};
class
class
是C++中的一个核心概念,用于定义一个类。类是面向对象编程的基本构建块,除了可以包含数据成员,还可以包含成员函数、访问控制修饰符、构造函数、析构函数、以及其他特性。
class MyClass {
int data1;
float data2;
public:
MyClass(int d1, float d2) : data1(d1), data2(d2) {}
void display() {
std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
}
};
访问控制
struct的访问控制
在struct
中,默认的访问控制级别是public
。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是公开的,可以被外部代码访问。
struct MyStruct {
int data1; // 默认是public
float data2;
void display() { // 默认是public
std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
}
};
class的访问控制
在class
中,默认的访问控制级别是private
。这意味着,如果没有显式地声明成员的访问控制级别,这些成员是私有的,只能被类的成员函数访问。
class MyClass {
int data1; // 默认是private
float data2;
public:
MyClass(int d1, float d2) : data1(d1), data2(d2) {}
void display() {
std::cout << "data1: " << data1 << ", data2: " << data2 << std::endl;
}
};
继承
在继承关系中,struct
和class
的行为也有所不同。具体来说,在继承时,基类成员的默认访问控制级别不同:
struct的继承
在struct
中,继承默认是public
的。这意味着基类的public
和protected
成员在派生类中保持其访问控制级别。
struct BaseStruct {
int baseData;
};
struct DerivedStruct : BaseStruct {
void show() {
std::cout << "baseData: " << baseData << std::endl; // 继承默认是public
}
};
class的继承
在class
中,继承默认是private
的。这意味着基类的public
和protected
成员在派生类中默认变为private
。
class BaseClass {
int baseData;
public:
BaseClass(int d) : baseData(d) {}
int getBaseData() { return baseData; }
};
class DerivedClass : BaseClass {
public:
DerivedClass(int d) : BaseClass(d) {}
void show() {
std::cout << "baseData: " << getBaseData() << std::endl; // 继承默认是private,需要通过public方法访问
}
};
构造函数和析构函数
struct
和class
在定义构造函数和析构函数时没有本质区别。它们都可以包含默认构造函数、参数化构造函数、复制构造函数、移动构造函数、析构函数等。
struct中的构造函数和析构函数
struct MyStruct {
int data1;
float data2;
MyStruct(int d1, float d2) : data1(d1), data2(d2) {}
~MyStruct() { std::cout << "MyStruct destroyed" << std::endl; }
};
class中的构造函数和析构函数
class MyClass {
int data1;
float data2;
public:
MyClass(int d1, float d2) : data1(d1), data2(d2) {}
~MyClass() { std::cout << "MyClass destroyed" << std::endl; }
};
小结
尽管struct
和class
在C++中有许多相似之处,它们之间的主要区别在于默认的访问控制级别和继承行为。总结如下:
-
默认访问控制级别:
struct
的默认访问控制级别是public
。class
的默认访问控制级别是private
。
-
继承默认访问控制级别:
struct
的继承默认是public
。class
的继承默认是private
。
-
其他方面:
struct
和class
都可以包含数据成员和成员函数,都支持构造函数、析构函数、继承、多态等特性。
根据具体的需求和代码风格,我们可以选择使用struct
或class
来定义数据类型。在简单的数据结构或需要所有成员默认公开的情况下,可以选择使用struct
;在面向对象编程、需要更严格的访问控制时,更常使用class
。