news 2026/3/29 4:28:02

初始化列表友元嵌套

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初始化列表友元嵌套

在类中我们存在构造函数

e.g

class Stack

{

Stack(int capacity = 4)

{

.......

}

private:

int * arr;

int _capacity;

int _num;

};

在学习之前我们要明白为{}中时进行赋值操作,而非真正意义上的初始化,因此对于一些必须要初始化的类型就会出现问题,比如const & 没有默认构造函数的自定义类型

所以我们cpp中专门进行处理 初始化列表 专门用来进行初始化

我在学的时候,就有一个问题,既然这样为什么在一开始设计的时候不直接把初始化列表集成到{}中?

但说白了,首先说结论,逻辑会出现问题.

1.

{} 是一个语法块,他的执行完全是按照代码顺序,而在内存中声明顺序决定的这些成员在内存的先后顺序.

2.

{} 中会出现重复的问题,初始化只能进行一次,语法块中能进行多次赋值操作,会混淆

因此我们要接受初始化列表,他其实是很有作用的

结构:(每两个之间用逗号 ',',最后不用加 ;)

class Stack

{

Stack(int capacity = 4)

:_capacity(capacity) ---初始化列表就是一个专门用来初始化的地方

,i(1)

{

.......

}

private:

int * arr;

int _capacity;

const int i;

int _num;

};

友元

1.友元函数-->解决了外部访问类中private/protected 成员

class Stack

{

friend void Get_capacity(const Stack& st);

Stack(int capacity = 4)

:_capacity(capacity) ---初始化列表就是一个专门用来初始化的地方

,i(1)

{

.......

}

private:

int * arr;

int _capacity;

const int i;

int _num;

};

void Get_capacity(const Stack & st);

这样声明就代表着这个函数是这个类的友元的函数(想象成朋友),可以访问 非public成员.

2.友元类

class Stack1 class Stack2

{{

friend class Stack2;

Stack1(int capacity = 4)Stack2(int capacity = 5)

:_capacity(capacity):_capacity(capacity)

,i(1),i(1)

{{

.............

}}

private:privat:

int * arr;int* arr;

int _capacity;int _capacity;

const int i;const int i;

int _num;int _num;

};};

表示stack 2 中能够调用stack1中的非公开成员,但不是stack1能调用stack2中的非公开成员

嵌套:

class Stack

{

Stack(int capacity = 4)

:_capacity(capacity)

,i(1)

{

.......

}

class S

{

S(int capacity = 4)

:_capacity(capacity)

,i(1)

{

.......

}

private:

int * arr;

int _capacity;

const int i;

int _num;

};

private:

int * arr;

int _capacity;

const int i;

int _num;

};

这里需要特别注意,可以进行类比,你在全局中定义了class stack 就相当于在class stack中定义了class S,所以这两个类完全是独立的类!!!

1.在没有外部类实例的情况下,你无法调用非静态的成员,可以想象成还没有定义,因此在要是想调用外部类的成员时,要创建一个实例,通过这个实例来实现对外部类成员的调用,在调用的功能上时和友元类相同的

#include<iostream>

using namespace std;

class A

{

private:

static int _k;

int _h = 1;

public:

class B // B默认就是A的友元

{

public:

void foo(const A& a)

{

cout << _k << endl; //OK

cout << a._h << endl; //OK

}

int _b1;

};

};

int A::_k = 1;

int main()

{

A::B b;

A aa;

b.foo(aa);

return 0; }

因为这两个可以是作为独立的类,因此A类的大小是 4 ,静态变量,函数都不算作A类的内存大小

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 16:20:41

无需Anaconda臃肿包!轻量级Miniconda-Python3.9玩转PyTorch

轻量级Miniconda-Python3.9玩转PyTorch&#xff1a;告别臃肿&#xff0c;拥抱高效 在AI项目开发中&#xff0c;你是否曾遇到这样的场景&#xff1f;刚配好的环境&#xff0c;跑一个新模型却提示torch not found&#xff1b;团队成员复现论文实验时&#xff0c;因为CUDA版本不匹…

作者头像 李华
网站建设 2026/3/27 21:28:20

网站内容自纠自查网络安全隐患和防范措施

开展网站内容自纠自查&#xff0c;旨在排查网络安全隐患&#xff0c;构建牢固的内容防线。这项工作不仅要关注技术层面的防攻击&#xff0c;更要聚焦信息层面的防泄露、防差错、防篡改。以下是自查中应重点关注的隐患范围、相应的防范措施&#xff0c;以及如何利用智能化工具提…

作者头像 李华
网站建设 2026/3/27 11:31:32

Miniconda-Python3.9镜像安装PyTorch GPU版完整教程(2024最新)

Miniconda-Python3.9镜像安装PyTorch GPU版完整教程&#xff08;2024最新&#xff09; 在深度学习项目开发中&#xff0c;环境配置往往是第一步&#xff0c;也可能是最令人头疼的一步。你是否曾遇到过这样的场景&#xff1a;好不容易跑通别人的代码&#xff0c;却因为本地 Pyt…

作者头像 李华
网站建设 2026/3/27 8:20:09

GitHub热门项目推荐:基于Miniconda-Python3.9的AI实验复现仓库

GitHub热门项目推荐&#xff1a;基于Miniconda-Python3.9的AI实验复现仓库 在人工智能研究日益深入的今天&#xff0c;一个让人哭笑不得的现象却屡见不鲜&#xff1a;论文中描述的SOTA模型&#xff0c;在复现时却频频“翻车”。不是缺少某个依赖库&#xff0c;就是版本冲突导致…

作者头像 李华
网站建设 2026/3/27 9:23:09

计算机毕业设计springboot对于股票实时信息系统 基于SpringBoot的证券行情实时监测与交易辅助平台 融合SpringBoot框架的股市动态信息实时推送系统

计算机毕业设计springboot对于股票实时信息系统uaqegip4 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在A股与全球资本市场联动日益紧密、个人投资者占比持续走高的当下&#…

作者头像 李华
网站建设 2026/3/27 17:48:24

RADI-5.15-5.25-SMT-2WR-20WPK-R25,20 W的微波隔离器, 现货库存

型号介绍今天我要向大家介绍的是 RADITEK 的一款微波隔离器——RADI-5.15-5.25-SMT-2WR-20WPK-R25。 它允许信号单向传输&#xff0c;有效减少反射和干扰&#xff0c;从而提升系统稳定性与信号质量&#xff0c;并常用于保护敏感设备&#xff08;如放大器&#xff09;免受功率回…

作者头像 李华