前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 类访问修饰符

C++ 类访问修饰符

作者头像
嵌入式视觉
发布2022-09-05 13:36:35
4810
发布2022-09-05 13:36:35
举报
文章被收录于专栏:嵌入式视觉

Contents

数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。

一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。

代码语言:javascript
复制
class Base
{
	public:
	// 公有成员
	protected:
	// 受保护成员
	private:
	// 私有成员
};

公有成员(public)

公有成员在程序中类的外部是可访问的,可以不使用任何成员函数来设置和获取公有变量的值,实例代码如下所示:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class Line
{
	public:
		double length;
		void setlength(double len);
		double getlength(void);
	// 公有成员
	protected:
	// 受保护成员
	private:
	// 私有成员
};
// class Box
// {
//    double width;
//    public:
//       double length;
//       void setWidth( double wid );
//       double getWidth( void );
// };

// 成员函数定义
void Line::setlength(double len)
{
	length = len;
}
double Line::getlength(void)
{
	return length;
}

// 程序的主函数
int main(int argc, char const *argv[])
{
	Line line;

	// 设置长度
	line.setlength(6.9);
	cout << "Length of line: " << line.getlength() << endl;

	// 不适用成员函数设置长度
	line.length = 10.0; // length是公有成员变量
	cout << "Length of ling: " <<line.length << endl;
	return 0;
}

编译运行以上实例代码,输出结果如下图所示:

私有成员(private)

私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。默认情况下,类的所有成员都是私有的。

下面的实例中,width是一个私有成员变量,代码如下:

代码语言:javascript
复制
class Box
{
   double width;
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

在实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数,实例的完整代码如下所示:

代码语言:javascript
复制
// 私有成员知识学习程序实例
#include "iostream"

using namespace std;

class Box
{
	public:
		double length;
		void setWidth(double wid);
		double getWidth(void);
	private:
		double width;
};
// 成员函数定义
double Box::getWidth(void)
{
	return width;
}
void Box::setWidth(double wid)
{
	width = wid;
}

int main()
{
	Box box;
	// 不使用成员函数设置长度
	box.length = 10.0; // length是公有成员变量
	cout << "Length of box: " << box.length << endl;
	// 不适用成员函数设置宽度
	// box.width = 23.9;
	box.setWidth(23.9); // 使用类成员函数设置宽度
	cout << "Width of box: " << box.getWidth() << endl;
	return 0;
}

编译运行以上实例代码,输出结果如下图所示:

保护成员(protected)

保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。下面的实例是演示私有成员变量width可被派生类smallBox的成员函数访问。代码如下:

代码语言:javascript
复制
#include "iostream"
using namespace std;
 
class Box
{
   protected:
      double width;
};
 
class SmallBox:Box // SmallBox 是派生类
{
   public:
      void setSmallWidth( double wid );
      double getSmallWidth( void );
};
 
// 子类的成员函数
double SmallBox::getSmallWidth(void)
{
    return width ;
}
 
void SmallBox::setSmallWidth( double wid )
{
    width = wid;
}
 
// 程序的主函数
int main( )
{
   SmallBox box;
 
   // 使用派生类成员函数设置保护成员变量宽度
   box.setSmallWidth(7.8);
   cout << "Width of box : "<< box.getSmallWidth() << endl;
 
   return 0;
}

以上实例代码被编译执行后,输出结果如下图所示:

继承中的特点

有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

  1. public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
  2. protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
  3. private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

  1. private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
  2. protected 成员可以被派生类访问。

三种继承方式总结如下:

继承方式

基类的public成员

基类的protected成员

基类的private成员

继承引起的访问控制关系变化概括

public继承

仍为public成员

仍为protected成员

不可见

基类的非私有长远在子类的访问属性不变

protected继承

变为protected成员

变为protected成员

不可见

基类的非私有成员都为子类的保护成员

private继承

变为private成员

变为private成员

不可见

基类中的非私有成员都称为子类的私有成员

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 公有成员(public)
  • 私有成员(private)
  • 保护成员(protected)
  • 继承中的特点
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档