C++基础语法:封装、继承中的访问权限与友元

封装

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

  • 一个类可以有多个 public、protected 或 private 标记区域。
  • 每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。
  • 类中未指定成员的默认访问修饰符是 private,而结构体中默认为 public
class ClassName 
{
public:
   // 公有成员
   // 在类内、类外、派生类中都可被访问
 
protected:
   // 受保护成员:为了与派生类共享,但又不想公开
   // 在类内、派生类中可被访问,类外不允许
 
private: 
   // 私有成员,默认修饰
   // 只允许类内访问,以及友元访问
};

继承

面向对象程序设计中最重要的一个概念是继承,允许依据一个基类来定义一个派生类,以此实现重用代码功能并提高执行时间。继承表示了 is a 关系,如狗是哺乳动物,因此狗具有哺乳动物的共性。一个类也可以继承/派生自多个类。继承方式同样有 public、protected、private。

class A : 
	public Base
{
};

class A : 
	protected Base
{
};

class A : 
	private Base
{
};
class A: 
	public Base_1, protected  Base_2, private Base_3
{
};

一个派生类继承了所有的基类方法,但下列情况 除外

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数

访问权限

  • 所有成员在 类内 都可以被访问;
  • 派生类无法继承private成员(不可见),其他继承得到的成员在派生类的 内部 都可被访问,在派生类外部取决于继承方式和基类的成员属性
  • public 成员在类内、类外、派生类中都可被访问;
  • protected 成员是为了与派生类共享,但又不想公开。因此在类内、派生类中可被访问,类外不允许;
  • private 成员,是默认修饰,只允许类内访问,以及友元访问,在派生类中不可见(类内类外都不可访问)

友元

C++严格控制了类中成员的访问权限,在类外只允许访问public成员。但有些情况下,需要允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,例如被重载的输入或输出操作符,经常需要访问类的私有数据成员。这就需要为该类构造“友元”。

一个类在定义时,声明 某函数 / 某类 / 某成员函数 是其友元 friend,给予对方所有的访问权限,包括私有(private)成员和保护(protected)成员。因此其友元函数/友元类能访问该类的所有类型的成员。

class X	// 友元成员函数所属的类必须提前定义
{
public:
	X(char);
	~X();
	char* foo(int);
};

class Base
{
    int data; // 私有成员
    // 非成员函数的运算符 operator<< 将拥有对 Y 的私有成员的访问权
    friend std::ostream& operator<<(std::ostream& out, const Y& o);
    friend char* X::foo(int); // 其他类的成员亦可为友元
    friend X::X(char), X::~X(); // 其他类的构造函数与析构函数也可为友元
    friend class Y;		// 友元类声明
};

// 此 operator<< 仍需定义,作为非成员
std::ostream& operator<<(std::ostream& out, const Base& base)
{
    return out << base.data; // 可访问私有成员 Y::data
}
  • 友元声明,也是声明,可以替代预先的函数声明、类声明等,但声明友元成员函数时必须已经定义了其归属类。
  • 友元关系不能被继承;
  • 友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类 B 的友元,要看在类中是否有相应的声明;
  • 友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定是类 A 的友元,同样要看类中是否有相应的申明;
  • 友元函数并不是类的成员函数,因此在类外定义友元函数时不能加上 class::ClassName
全部评论

相关推荐

10-19 10:28
已编辑
成都理工大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务