C++类与对象基础:封装机制详解

桃夭
桃夭
发布时间:2026-10-16 | 9人浏览过
原创

C++类与对象的封装机制通过将属性与行为整合并设置访问权限,实现数据的安全性与完整性。本文将讲解权限控制、类型区别及实际应用示例。

封装的意义与权限控制

C++面向对象的三大特性为封装、继承、多态。封装的核心意义在于:

  • 将属性和行为作为一个整体来表现事物;
  • 对属性和行为加以严格的权限控制,防止外部随意访问。

第1步:理解类的基本结构与成员命名

在C++中,类的基本语法结构如下:

class 类名 { 访问权限:属性 / 行为 };

为了规范开发,类中的成员通常有统一的命名习惯:

  • 成员属性/成员变量:如 m_name,建议以 m_ 开头,代表 Member。
  • 成员函数/成员方法:直接使用动词+名词形式,如 setName()。

以下代码展示了如何定义一个简单的学生类,并通过公共接口设置和显示信息:

#include <iostream>
#include <string>
using namespace std;

class Student {
public:
	string m_name;
	int m_num;
	void showStudent() {
		cout << " 姓名:" << m_name << " 学号:" << m_num << endl;
	}
	void setname(string name) {
		m_name = name;
	}
	void setnum(int num) {
		m_num = num;
	}
};

int main() {
	Student s1;
	s1.setname("zhangsan");
	s1.setnum(2001);
	s1.showStudent();
	return 0;
}

第2步:设置访问权限进行数据保护

封装的关键在于利用三种访问权限来控制成员的可见性:

  • public(公共权限):类内可以访问,类外也可以访问。
  • protected(保护权限):类内可以访问,类外不可访问(但在继承关系中,子类可以访问父类的保护内容)。
  • private(私有权限):类内可以访问,类外绝对不可访问。

在实际开发中,通常将敏感数据设置为 private,并提供公共的访问接口(Getter/Setter):

#include <iostream>
using namespace std;

class Student {
public:
	string m_name;
	int getNum() { return m_num; }
	void setAge(int age) {
		if (age > 0 && age < 150) { // 简单的有效性校验
			m_age = age;
		}
	}
private:
	int m_num;
	int m_age;
};

int main() {
	Student s1;
	s1.m_name = "lili";
	// s1.m_num = 1; // 编译错误:私有成员不可直接访问
	s1.setAge(30); // 通过公共接口安全修改
	return 0;
}

Struct 与 Class 的区别

很多初学者容易混淆 C++ 中的 struct 和 class,两者的核心区别仅在于默认的访问权限:

  • struct 的默认权限是 public。
  • class 的默认权限是 private。
#include <iostream>
#include <string>
using namespace std;

class C1 {
	string m_a; // 默认为 private
};

struct C2 {
	string m_b; // 默认为 public
};

int main() {
	// C1 c1;
	// c1.m_a = "lili"; // 报错:无法访问私有成员
	
	C2 c2;
	c2.m_b = "lili"; // 合法:默认公共权限
	return 0;
}

成员属性设为私有的实战优势

将所有成员属性设为私有,可以通过提供公共接口来:
1. 严格控制数据的读写权限;
2. 在进行写操作时检测数据的有效性(如年龄不能为负数)。这提高了程序的安全性和健壮性。

应用场景:几何对象运算

下面以一个立方体计算为例,演示如何通过封装来计算面积和体积,并判断两个立方体是否相同:

#include <iostream>
#include <string>
using namespace std;

class Cube {
public:
	void setchang(int chang) { m_c = chang; }
	void setkuan(int kuan) { m_k = kuan; }
	void setgao(int gao) { m_g = gao; }
	int getchang() { return m_c; }
	int setkuan() { return m_k; }
	int getgao() { return m_g; }
	
	// 计算表面积
	int S() {
		return 2 * (m_c*m_g + m_c*m_k + m_g*m_k);
	}
	
	// 计算体积
	int V() {
		return m_c*m_g*m_k;
	}
	
	// 成员函数比较大小
	bool isSamebyclass(Cube& c) {
		if (m_c == c.getchang() && m_g == c.getgao() && m_k == c.getkuan())
			return true;
		return false;
	}
private:
	int m_c;
	int m_k;
	int m_g;
};

// 全局函数比较大小
bool isSame1(Cube& c1, Cube& c2) {
	if (c1.getchang() == c2.getchang() && c1.getgao() == c2.getgao() && c1.getkuan() == c2.getkuan())
		return true;
	return false;
}

int main() {
	Cube c1;
	c1.setchang(10); c1.setkuan(10); c1.setgao(10);
	
	Cube c2;
	c2.setchang(11); c2.setkuan(11); c2.setgao(11);
	
	cout << "c1 面积:" << c1.S() << " 体积:" << c1.V() << endl;
	
	// 使用不同方式判断
	bool ret = isSame1(c1, c2);
	if(ret) cout << "全局函数判断相等" << endl;
	else cout << "全局函数判断不等" << endl;
	
	ret = c1.isSamebyclass(c2);
	if(ret) cout << "成员函数判断相等" << endl;
	else cout << "成员函数判断不等" << endl;
	
	return 0;
}

进阶应用:判断点与圆的位置关系

结合空间直角坐标系,利用类和对象的组合,我们可以轻松解决几何判断问题。此例中定义了 Point(点)和 Circle(圆)两个类:

#include <iostream>
using namespace std;

class Point {
public:
	void setX(int x) { m_x = x; }
	int getX() { return m_x; }
	void setY(int y) { m_y = y; }
	int getY() { return m_y; }
private:
	int m_x;
	int m_y;
};

class Circle {
public:
	void setR(int r) { m_r = r; }
	int getR() { return m_r; }
	void setcenter(Point center) { m_center = center; }
	Point getcenter() { return m_center; }
private:
	int m_r;
	Point m_center;
};

void checkPosition(Circle& c, Point& p) {
	// 计算点到圆心的距离平方
	int distance = (c.getcenter().getX() - p.getX())*(c.getcenter().getX() - p.getX()) 
	             + (c.getcenter().getY() - p.getY()) * (c.getcenter().getY() - p.getY());
	// 计算半径平方
	int doubleR = c.getR()*c.getR();
	
	if (distance == doubleR)
		cout << "点在圆上" << endl;
	else if (distance < doubleR)
		cout << "点在圆内" << endl;
	else
		cout << "点在圆外" << endl;
}

int main() {
	Point p;
	p.setX(10); p.setY(30);
	
	Circle c;
	c.setR(10);
	Point center;
	center.setX(26); center.setY(43);
	c.setcenter(center);
	
	checkPosition(c, p);
	return 0;
}
以上就是C++封装机制的详细解析,更多关于C++面向对象编程的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表