C++ 类的私有成员

C++ 类的私有成员

1. 类的私有成员

有了为类对象的数据成员赋值的构造函数,但仍然允许程序的任何部分搞混实质上属于对象的成员,这大概有点儿矛盾。就好像安排了水平高超的外科医生在我们体内动刀之后,又让当地的水电工或泥瓦匠去,这很难说是合适的。我们需要对类的数据成员采取保护措施。

在定义类成员时使用关键字 private,可以得到所需的安全性。通常情况下,私有类成员只能被类的成员函数访问。当然有一种情况例外,但我们稍后再考虑它。普通的函数没有访问私有类成员的直接途径。

在这里插入图片描述

指定私有类成员能够将类的接口与类的内部实现分开。类的接口由 public 成员和 public 函数成员组成,在必要时,public 函数成员可以提供对包括 private 成员在内的所有类成员的间接访问。例如,将类的内部成员指定为 private,就可以修改它们以改善性能,但不必修改通过公有接口使用这个类的代码。为了保证类的数据成员和函数成员的安全,使之免遭不必要的干预,将那些不需要暴露的成员声明为 private 是一种好习惯。仅将那些为了使用类而必需的成员声明为 public

//============================================================================
// Name        : std::class
// Author      : Yongqiang Cheng
// Version     : Version 1.0.0
// Copyright   : Copyright (c) 2019 Yongqiang Cheng
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>

using std::cout;
using std::endl;

class CBox                             // Class definition at global scope
{
public:
	// Constructor definition using an initialization list
	explicit CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0) : m_Length { lv }, m_Width	{ wv }, m_Height { hv }
	{
		cout << "Constructor called." << endl;
	}

	// Function to calculate the volume of a box
	double volume()
	{
		return m_Length * m_Width * m_Height;
	}

private:
	double m_Length;                   // Length of a box in inches
	double m_Width;                    // Width of a box in inches
	double m_Height;                   // Height of a box in inches
};

int main()
{
	CBox match { 2.2, 1.1, 0.5 };        // Declare match box
	CBox box2;                           // Declare box2 - no initial values

	cout << "Volume of match = " << match.volume() << endl;

	// Uncomment the following line to get an error
	// box2.m_Length = 4.0;

	cout << "Volume of box2 = " << box2.volume() << endl;

	return 0;
}

Constructor called.
Constructor called.
Volume of match = 1.21
Volume of box2 = 1

2. 示例说明

现在 CBox 构造函数声明为 explicit,从而可以避免我们不期望的隐式转换。CBox 类的定义现在包含两部分。前面是包含构造函数和成员函数 volume()public 部分,后面是包含数据成员的 private 部分。现在,3 个数据成员只能被本类的成员函数访问。不必修改任何成员函数,无论如何它们都可以访问本类的所有数据成员。然而,如果使 main() 函数中给对象 boxm_Length 成员赋值的语句不再是注释形式,那么将从编译器得到一条错误消息,说明该数据成员是不可访问的。如果还没有这样做,那么可以在 Class View 选项卡中看一下 CBox 类的成员。每个成员旁边的图标指出了该成员的可访问性。如果某成员是私有成员,则图标中将显示一个小挂锁。

要记住的一点是,现在使用构造函数或成员函数是给对象的私有数据成员赋值的唯一方法。必须确保所有用于设定或修改类的私有数据成员的方法都是通过成员函数提供的。

还可以将函数放入类的 private 部分。这种情况下,它们只能被同类的其他函数成员调用。如果将函数 volume() 放入 private 部分,则编译器将给出一条错误消息,因为 main() 函数中的语句试图使用这个函数。如果将构造函数放入 private 部分,那么将不能声明该类的任何对象。

在数据成员定义成拥有 private 访问特性之后,CBox 类仍然可以正常工作。主要区别是这些成员现在被完全保护起来,不会遭受未经授权的访问和修改。

如果没有另外指定,则类成员的默认访问特性都是 private。因此,我们可以将所有私有成员放在类定义的开始部分,并通过省略关键字 private,使它们拥有默认的private 访问特性。但任何情况下都显式指定访问特性则更好,这样对于我们的意图就不存在任何疑问了。

当然,不必使所有数据成员都成为 private。根据类的用途,可以将某些数据成员定义为 private,而将另外一些定义成 public,这完全取决于我们的目的。如果没有将类成员指定为 public 的理由,则最好将它们指定为 private,这样可以使类更加安全。普通函数不能访问类的任何 private 成员。

Standard Template Library,STL:标准模板库

References

Ivor Horton’s Beginning Visual C++ 2013
http://www.wrox.com/WileyCDA/WroxTitle/productCd-1118845714.html

发布了468 篇原创文章 · 获赞 1751 · 访问量 104万+

猜你喜欢

转载自blog.csdn.net/chengyq116/article/details/104478716