C++类的基本语法详解:从struct到封装与存储原理

慢慢来
慢慢来
发布时间:2026-10-16| 6人浏览过
原创

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++面向对象特性的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。