、封装(Encapsulation)
C语言实现
C语言通过结构体和访问控制函数实现封装,通常将结构体定义放在.c文件中隐藏实现细节,头文件只声明结构体指针和操作函数。
头文件(encapsulation.h):
代码语言:c
AI代码解释
#ifndef ENCAPSULATION_H
#define ENCAPSULATION_H
// 前向声明,隐藏结构体细节
typedef struct Person Person;
// 构造函数
Person* Person_create(const char* name, int age);
// 析构函数
void Person_destroy(Person* person);
// 访问器函数
const char* Person_getName(Person* person);
int Person_getAge(Person* person);
// 修改器函数
void Person_setAge(Person* person, int age);
// 成员函数
void Person_greet(Person* person);
#endif // ENCAPSULATION_H
实现文件(encapsulation.c):
代码语言:c
AI代码解释
#include "encapsulation.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 结构体定义在.c文件中,外部无法直接访问成员
struct Person {
char name[50];
int age;
};
Person* Person_create(const char* name, int age) {
Person* person = (Person*)malloc(sizeof(Person));
if (person) {
strncpy(person->name, name, sizeof(person->name) - 1);
person->name[sizeof(person->name) - 1] = '\0';
person->age = age;
}
return person;
}
void Person_destroy(Person* person) {
free(person);
}
const char* Person_getName(Person* person) {
return person ? person->name : NULL;
}
int Person_getAge(Person* person) {
return person ? person->age : -1;
}
void Person_setAge(Person* person, int age) {
if (person) {
person->age = age;
}
}
void Person_greet(Person* person) {
if (person) {
printf("Hello, I'm %s, %d years old.\n", person->name, person->age);
}
}
C++实现
C++通过class关键字和访问修饰符(public/private/protected)直接支持封装。
代码语言:cpp
AI代码解释
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数
Person(const std::string& name, int age) : name(name), age(age) {}
// 析构函数
~Person() {}
// 访问器
std::string getName() const { return name; }
int getAge() const { return age; }
// 修改器
void setAge(int age) { this->age = age; }
// 成员函数
void greet() const {
std::cout << "Hello, I'm " << name << ", " << age << " years old." << std::endl;
}
};
原理对比
- 封装机制:两者都通过隐藏数据成员(C语言通过不透明指针,C++通过private访问控制)和提供公共接口实现封装。
- 实现差异:C语言需要手动管理内存(malloc/free),而C++有构造/析构函数自动管理;C++的访问控制更严格,编译期检查访问权限。