C++类的基本语法详解:从struct到封装与存储原理
C++面向对象的基石是“类”(Class)。本文从C语言结构体过渡到C++类的定义方式,涵盖对象实例化、访问权限控制(封装)、作用域解析以及类在内存中的存储结构,通过代码演示帮助开发者快速掌握C++类的基本语法规则。
1、从C结构体到C++类的演进
在C语言中,若需定义包含多个变量的数据集合,通常使用结构体(struct)。例如定义一个学生变量,包含姓名、年龄和性别:
struct Student{
char name[12];
int age;
char sex[4];
};
C++兼容C语言语法,并对struct关键字进行了扩展。在C++中,struct不仅可以定义数据变量,还可以定义成员函数,从而具备类的特性:
struct Student{
char name[12];
int age;
char sex[4];
void show()
{
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"性别:"<<sex<<endl;
}
};
在C++环境下,上述代码定义的Student既可作为结构体使用,也可作为类使用。以下两种创建对象的方式均合法:
- 按结构体形式:
struct Student strs; - 按类形式:
Student clas;
尽管语法相通,但在实际开发中,建议根据需求选择明确的数据容器(struct)或面向对象模型(class)。
2、如何定义C++类
C++定义类的标准语法格式如下:
class className
{
// 类体:由成员函数和成员变量组成
}; // 注意类定义结束后的分号
其中:
- class为定义类的关键字;
- ClassName为用户自定义的类名;
- {}内为类体,包含数据成员和方法;
- 定义结束时必须加分号。
类中的元素统称为类的成员,分为属性(成员变量)和方法(成员函数)。
3、C++对象实例化
类可以理解为模具,而对象是根据模具制造出的实体产品。利用上述学生类实例化对象的方法如下:
Student s1;
Student s2;
Student s3;
s1、s2、s3均为Student类的实例化对象。一个类可以实例化无限个对象,且这些对象在内存中独立存在,互不干扰。
4、访问限定符与封装
封装的核心在于将数据和操作方法结合,隐藏内部实现细节,仅对外提供接口。C++主要通过访问限定符来实现这一目标:
- public(公有):修饰的成员在类外可直接被访问。
- private(私有):修饰的成员在类外不能被直接访问,仅限类内部使用。
- protected(保护):修饰的成员在类外不能被直接访问(类似private,但涉及继承时有特殊含义)。
重要规则:
1. 访问权限的作用域从该限定符出现的位置开始,直到下一个访问限定符出现前为止。
2. class的默认访问权限为private;struct的默认访问权限为public(出于对C语言的兼容性)。
对前面的学生类进行封装改造,将数据设为私有,函数设为公有:
class Student{
private:
char name[12];
int age;
char sex[4];
public:
void show()
{
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"性别:"<<sex<<endl;
}
};
5、类的作用域与 :: 操作符
类定义了新的作用域,其成员都在该作用域内。若在类体外定义成员函数,必须使用作用域解析符 :: 指明该成员属于哪个类。
代码示例:
class Student{
private:
char name[12];
int age;
char sex[4];
public:
void show();
};
// 类外定义成员函数
void Student:: show()
{
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"性别:"<<sex<<endl;
}
上述代码中,Student::明确指出show函数属于Student类。
6、类的内存存储原理
类的大小等于其所有非静态成员变量之和(需考虑内存对齐),成员函数并不占用类对象的空间。来看一段测试代码:
class Student {
private:
char name[12];
int age;
char sex[4];
public:
void show();
};
int main()
{
Student s1;
cout<<sizeof(s1)<<endl;
return 0;
}
运行结果输出为 20。这是因为char name[12]占12字节,int age占4字节,char sex[4]占4字节,合计20字节(假设未发生额外填充)。
为什么是20而不是更多?因为show函数并未存储在类对象中。类的所有成员函数都被放在类外的同一块代码空间,以避免实例化多个对象时重复开辟不必要的内存。特别地,空类的大小通常为1字节,这是编译器为了唯一标识该类所分配的特殊空间。
以上就是C++类基本语法与内存结构的详细内容,更多关于C++面向对象特性的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









