news 2026/4/18 8:38:14

初始化列表友元嵌套

作者头像

张小明

前端开发工程师

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/4/18 4:30:29

Miniconda-Python3.9镜像在GPU算力平台上的应用优势分析

Miniconda-Python3.9镜像在GPU算力平台上的应用优势分析 在如今深度学习项目动辄需要数天训练、依赖库版本错综复杂的背景下&#xff0c;一个稳定、轻量且可复现的Python环境&#xff0c;早已不再是“锦上添花”&#xff0c;而是决定实验成败的关键基础设施。特别是在GPU云算力…

作者头像 李华
网站建设 2026/4/18 4:30:04

Inter的电脑使用GPU加速训练

换新电脑就是不一样&#xff0c;但是突然发现是inter的显卡&#xff0c;下面说一下如何使用inter的显卡加速训练。先大致步骤说一下&#xff1a;将ultralytics软件包中的torch_utils.py中的select_device函数修改一下&#xff0c;然后使用训练代码进行进行训练就可以了。一、环…

作者头像 李华
网站建设 2026/4/18 0:37:27

运维系列数据库系列【仅供参考】:达梦数据库安装

达梦数据库安装达梦数据库安装摘要windows下的安装与卸载检查系统信息&#xff1a;安装DM卸载DM达梦数据库安装 摘要 本文详细介绍了如何在Windows操作系统中安装和卸载DM数据库管理系统。首先&#xff0c;通过svsteminfo命令检查系统信息然后规划存储空间。接着&#xff0c;…

作者头像 李华
网站建设 2026/4/18 4:31:34

SSH连接拒绝Connection refused?Miniconda-Python3.9镜像sshd服务检查

SSH连接拒绝&#xff1f;Miniconda-Python3.9镜像中sshd服务缺失的深度解析与实战修复 在现代AI开发和数据科学实践中&#xff0c;我们越来越依赖轻量、可复现的容器化环境。一个典型的场景是&#xff1a;你刚刚启动了一个基于 miniconda3-python3.9 的Docker容器&#xff0c;准…

作者头像 李华
网站建设 2026/4/18 4:32:08

智能装备工厂10个研发人员用SolidWorks如何共享一台服务器算力和资源

在现代智能制造领域&#xff0c;研发团队的高效协作离不开对计算资源的优化分配。对于使用SolidWorks进行产品设计的智能装备工厂研发人员而言&#xff0c;如何通过服务器共享算力和资源成为提升工作效率的关键环节。一、硬件配置CPU&#xff1a;选择多核高主频处理器&#xff…

作者头像 李华
网站建设 2026/4/18 4:28:21

彻底搞懂大语言模型(LLM)与Transformer架构的原理与应用!

简介 本文系统介绍了AI大模型家族的核心知识&#xff0c;包括AIGC的两种类型和三个发展阶段&#xff0c;详细解释了机器学习、深度学习和生成式AI的关系&#xff0c;重点阐述了大语言模型(LLM)的定义、特点和技术基础。文章深入剖析了Transformer架构的革命性意义&#xff0c;…

作者头像 李华