C++类与对象基础:封装机制详解
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++面向对象编程的资料请关注本站其它相关文章!免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









