详解C++之类和对象(1):从结构体到类的演变
C++作为兼具面向过程和面向对象特性的语言,其核心在于"类"的概念。本文将从C语言的结构体出发,对比其在C++中的演变,详细解析struct与class在访问权限上的区别,并介绍成员变量的封装方法。
C语言结构与C++结构体的差异
C语言是一种典型的面向过程编程语言,而在C++中,这种思维方式被保留并增强。两者最直观的区别体现在对数据结构的支持上。
在C语言中,struct(结构体)仅能包含数据变量,无法直接定义函数。如果需要操作结构体数据,必须额外编写独立的函数,并将结构体指针作为参数传入。
// C语言风格实现
struct Student
{
char _name[20];
int _age;
char _sex[10];
};
void SetStudentInfo(struct Student* s, const char* name, const char* sex, int age)
{
strcpy(s->_name, name);
strcpy(s->_sex, sex);
s->_age = age;
}
void printStudentInfo(const struct Student* s)
{
printf("%s:%d:%s", s->_name, s->_age, s->_sex);
}如上所示,数据的存储逻辑与处理逻辑是分离的。为了在C++中实现更紧密的数据封装,我们引入了内联函数的概念:
// C++ 风格实现
struct Student
{
// 直接在结构体内定义函数
void SetStudentInfo(const char* name, const char* sex, int age)
{
strcpy(_name, name);
strcpy(_sex, sex);
_age = age;
}
void print()
{
printf("%s:%d:%s", _name, _age, _sex);
}
char _name[20];
int _age;
char _sex[10];
};可以看出,C++允许在struct内部同时定义成员变量和成员函数,使得数据结构与其操作逻辑紧密结合。
Struct与Class的关键区别
虽然C++保留了struct关键字用于定义包含函数的类型,但为了满足面向对象编程的需求,又引入了class关键字。它们之间的核心区别在于默认的访问控制权限。
第1步:了解访问权限修饰符
在类的定义中,为了保障数据安全,引入三种关键修饰符:
public:公有成员,可在类内外自由访问。private:私有成员,仅在类内部访问,外部不可见。protected:保护成员,主要用于继承场景(此处暂不展开)。
第2步:对比默认行为
当我们使用 struct 定义类型时,所有的成员(包括变量和函数)默认都是 public 的。这意味着任何地方都能随意修改其内部数据,这在复杂系统中容易引发安全隐患。
// struct 默认全是 public
struct StudentData
{
char _name[20];
int _age;
};
// 外部可以直接 StudentData.age = 10; 访问,缺乏保护相比之下,class 的所有成员默认是 private 的。这种设计强制开发者通过公共接口(Public Interface)来访问内部状态,符合面向对象的数据封装原则。
// class 默认全是 private
class StudentInfo
{
// 这里的函数默认是 private
void SetInfo(...);
// 这里的变量默认也是 private
char _name[20];
int _age;
};
// 若要外部调用,必须显式添加 public: 标签
public:
void PrintInfo();总结
C++通过引入类和对象,解决了C语言中数据与操作分离的问题。struct更像是一个无访问控制的聚合体,而class则提供了基于默认私有的封装机制。在实际开发中,通常使用 class 配合 private 变量和 public 接口来实现安全的面向对象设计。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









