C++ 中的类(Class)和结构体(Struct)是两种用户定义的数据类型,它们可以包含数据和函数来表示现实世界中的对象和行为。这两种类型的主要区别在于它们的成员访问权限以及继承时的默认访问权限。
在最基本的形式下,类和结构体的定义如下:
C++ 结构体:
struct MyStruct {
// 成员默认为公有(public)
int data;
void func() {
// Do something
}
};
- 结构体的成员默认访问权限是公有(
public
)。也就是说,除非明确地指定,否则结构体内的成员都是公有的,它们可以在程序中的任何位置被访问。
C++ 类:
class MyClass {
// 成员默认为私有(private)
int data; // 私有成员
public:
void func() {
// Do something
}
};
- 类的成员默认访问权限是私有的(
private
)。也就是说,除非你明确地将成员标记为公有(public
)或保护(protected
),否则它们无法被类的外部代码直接访问。
除了默认的访问权限不同,结构体和类在C++中几乎是可以互换的。两者都可以用来实现封装(encapsulation)、继承(inheritance)和多态(polymorphism)等面向对象编程(OOP)概念。
继承:
当使用结构体或类继承另一个结构体或类时,它们的默认访问权限也不同:
- 继承自类的新类(class)默认是私有继承(
private
)。 - 继承自结构体的新结构体(struct)或类(class)默认是公有继承(
public
)。
例子:
// 基类
class BaseClass {
//... 基类成员
};
// 派生类,默认私有继承BaseClass
class DerivedClass : BaseClass {
// ... 派生类成员
};
在这种情况下,如果不指定继承类型(比如 public
),DerivedClass
默认以私有方式继承 BaseClass
。
// 基结构体
struct BaseStruct {
// ... 基结构体成员
};
// 派生结构体,默认公有继承BaseStruct
struct DerivedStruct : BaseStruct {
// ... 派生结构体成员
};
在这种情况下,DerivedStruct
默认以公有方式继承 BaseStruct
。
#include <iostream>
#include <string>
// 定义一个结构体Person
struct Person {
std::string name;
int age;
// 结构体构造函数
Person(std::string name, int age) : name(name), age(age) {}
// 结构体可以包含函数
void introduce() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
// 定义一个类Employee,它公有继承Person
class Employee : public Person {
std::string position; // 默认是私有成员
public:
// Employee的构造函数
Employee(std::string name, int age, std::string position)
: Person(name, age), position(position) {}
// 公有成员函数
void work() {
std::cout << name << " is working as a " << position << std::endl;
}
// 演示访问控制
void showPosition() {
std::cout << "Position: " << position << std::endl;
}
};
int main() {
// 创建Person实例
Person person("A", 30);
person.introduce(); // 可以访问,因为introduce()是公有的
// 创建Employee实例
Employee employee("B", 25, "Developer");
employee.introduce(); // 可以访问,继承自Person
employee.work(); // 可以访问
employee.showPosition(); // 可以访问
return 0;
}
Name: A, Age: 30
Name: B, Age: 25
B is working as a Developer
Position: Developer