本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。
文章目录
一、属性和行为作为整体
封装是面向对象编程中的一种特性,它将数据和操作数据的方法组合在一起,形成一个类。封装的目的是将数据和方法进行包装,使其成为一个独立的实体,外部只能通过类提供的接口来访问和操作数据,而不需要了解内部的实现细节。
示例:
cpp
class Circle {
private:
double radius;
public:
void setRadius(double r) {
radius = r;
}
double getRadius() {
return radius;
}
double getArea() {
return 3.14 * radius * radius;
}
};
在上面的示例中,我们定义了一个名为Circle
的类,它具有一个私有的属性radius
和三个公有的方法setRadius
、getRadius
和getArea
。
- 属性:属性是类中的变量,用于存储对象的状态。在示例中,
radius
是Circle
类的私有属性,只能通过类的方法来进行访问和修改。 - 行为:行为是类中的方法,用于操作对象的状态。在示例中,
setRadius
方法用于设置radius
的值,getRadius
方法用于获取radius
的值,getArea
方法用于计算圆的面积。
通过封装,我们将属性和行为组合在一起,形成了一个完整的圆对象。外部代码只能通过类的公有方法来访问和操作圆的属性,而不需要知道属性的具体实现细节。这样可以提高代码的可维护性和安全性,同时也方便了代码的重用。
二、访问权限
同样以上面为示例
在示例中,属性radius
被声明为私有(private
)。私有属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这是通过使用访问修饰符(private
, public
, protected
)来实现的。
私有属性和方法只能在类的内部使用,对外部是不可见的。这种封装的好处是可以隐藏类的内部实现细节,提高代码的安全性和可维护性。
示例解释:
在示例中,radius
属性被声明为私有,这意味着外部代码无法直接访问radius
属性。为了访问和修改radius
的值,我们提供了公有的setRadius
和getRadius
方法。通过setRadius
方法,外部代码可以传递一个新的半径值来修改radius
的值;通过getRadius
方法,外部代码可以获取radius
的当前值。
cpp
Circle circle;
circle.setRadius(5.0); // 通过公有方法setRadius设置radius的值为5.0
double radius = circle.getRadius(); // 通过公有方法getRadius获取radius的值
在上面的示例中,外部代码无法直接访问circle
对象的radius属性,而是通过公有方法setRadius
和getRadius
来间接访问和修改radius
的值。这样可以确保radius
属性的访问和修改是受控的,同时隐藏了radius
属性的具体实现细节。
三种访问权限修饰符
在C++中,有三种访问权限修饰符:private
、protected
和public
。这些修饰符用于控制类的成员(属性和方法)对外部的可见性和可访问性。
private
(私有) :私有成员只能在类的内部访问,外部代码无法直接访问或修改私有成员的值。私有成员的目的是隐藏类的内部实现细节,提高代码的安全性和封装性。protected
(保护) :保护成员在类的内部和派生类中可访问,但对外部是不可见的。保护成员的目的是在继承关系中提供一定的访问权限,使派生类能够继承和访问基类的成员。public
(公有) :公有成员可以在类的内部和外部访问。公有成员没有访问限制,可以被任何代码访问和修改。
这些访问权限修饰符可以应用于类的成员(属性和方法)的声明。默认情况下,类的成员是私有的。
三、class与struct的区别
在C++中,class
和struct
是用于定义自定义数据类型的关键字。它们之间的主要区别在于默认的成员访问权限和默认的继承权限。
- 成员访问权限:
class
:默认的成员访问权限是私有(private) 。struct
:默认的成员访问权限是公有(public) 。
这意味着在class
中声明的成员(属性和方法)默认是私有的,只能在类的内部访问。而在struct中声明的成员默认是公有的,可以在类的内部和外部访问。
示例:
cpp
class MyClass {
int x; // 默认为私有(private)
void foo(); // 默认为私有(private)
};
struct MyStruct {
int x; // 默认为公有(public)
void foo(); // 默认为公有(public)
};
- 继承权限:
class
:默认的继承权限是私有继承(private inheritance) 。struct
:默认的继承权限是公有继承(public inheritance) 。
这意味着在class
中继承的成员默认是私有继承的,派生类只能访问基类的公有和保护成员。而在struct
中继承的成员默认是公有继承的,派生类可以访问基类的公有、保护和私有成员。
继承部分会在下一篇文章详细的说明,可以前往我主页订阅专栏,每天一个C++知识点
示例:
cpp
class BaseClass {
// ...
};
class DerivedClass : BaseClass {
// 默认为私有继承(private inheritance)
};
struct BaseStruct {
// ...
};
struct DerivedStruct : BaseStruct {
// 默认为公有继承(public inheritance)
};
除了上述区别之外,class
和struct
在语法上没有其他差异,它们可以具有相同的成员、方法和功能。选择使用class
还是struct
取决于个人偏好和代码的语义。一般来说,如果定义的是一个拥有私有成员和实现细节的复杂数据类型,通常会使用class
;如果定义的是一个简单的数据容器或数据结构,通常会使用struct
。
四、成员属性私有化
将类的成员属性私有化是一种常见的编程实践,它可以提供更好的封装性和数据安全性。私有成员属性只能在类的内部访问,外部代码无法直接访问或修改私有属性的值。这样可以隐藏类的内部实现细节,防止外部代码对属性的误操作或非法访问。
在C++中,可以使用访问权限修饰符来设置成员属性的访问权限。通过将属性声明为私有(private) ,可以将其限制为只能在类的内部访问。私有属性通常通过公有的成员函数(例如getters
和setters
)来间接访问和修改。
示例代码:
cpp
class MyClass {
private:
int privateAttribute; // 私有属性
public:
// 公有成员函数用于访问和修改私有属性
int getPrivateAttribute() {
return privateAttribute;
}
void setPrivateAttribute(int value) {
privateAttribute = value;
}
};
在上述示例中,privateAttribute
被声明为私有属性,外部代码无法直接访问。通过公有的getPrivateAttribute()
和setPrivateAttribute()
函数,可以间接地访问和修改私有属性的值。
私有化成员属性的好处包括:
- 隐藏类的内部实现细节,提高代码的封装性和安全性。
- 通过公有的成员函数来控制对私有属性的访问和修改,可以进行数据验证和处理。
- 允许在不改变类的接口的情况下,修改属性的实现细节。