news 2026/2/7 21:41:05

初始化列表友元嵌套

作者头像

张小明

前端开发工程师

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/2/4 19:24:23

一个普通程序员做开源软件,光靠GitHub打赏年入70万

我一个普通程序员&#xff0c;光靠GitHub打赏就年入70万&#xff0c; 一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏&#xff08;GitHub Sponsors&#xff09;赚到了 10 万美元。 GitHub …

作者头像 李华
网站建设 2026/2/6 1:40:52

工业互联网平台在汽车制造业能耗异常诊断中的应用

在当前全球工业4.0转型浪潮下&#xff0c;能源管理逐渐从传统的“事后修正”模式向“预防性智能诊断”演进。对于汽车制造业而言&#xff0c;生产流程复杂且能源消耗密集&#xff0c;如何通过技术手段实现能耗的精细化监控与优化&#xff0c;成为企业绿色转型的关键课题。近年来…

作者头像 李华
网站建设 2026/2/6 6:43:24

网关路由设计与性能优化

文章目录&#x1f3af; 1. 动态路由&#xff1a;告别重启&#xff0c;实现秒级生效✅ 动态路由的价值&#x1f527; 实现方式&#xff08;以 Spring Cloud Gateway 为例&#xff09;&#x1f525; 2. 路由表膨胀问题&#xff1a;当路由从百条到万条&#x1f4c9; 膨胀带来的三大…

作者头像 李华
网站建设 2026/2/4 5:40:39

Flux 2:并不惊艳,但可能是开源图像模型的重要转折点

大概在一个月前&#xff0c;Black Forest Labs 发布了他们最新的图像模型 Flux 2。 和之前的 Flux 1、Flux Context 相比&#xff0c;这一次的发布在互联网上的声量并不算高。 原因其实也不复杂——在 Flux 2 发布之前&#xff0c;Nano Banana 2 已经抢走了几乎所有注意力。作…

作者头像 李华
网站建设 2026/2/8 1:29:34

EPLAN 2.7P8 全能库:自动化工程师的宝藏秘籍

eplan2.7p8全能库&#xff0c;部件库/宏/部件库模板/图表图框/符号库&#xff0c;每个库都有详细使用视频&#xff0c;本人自动化工程师日常积累使用&#xff0c;另送dxf 2d源档1比1&#xff0c;cad工具箱&#xff0c;选型计算对照表&#xff0c;电路原理图PLC电路仿真工具。各…

作者头像 李华
网站建设 2026/2/7 16:49:38

永磁同步电机Matlab/Simulink仿真模型探索

永磁同步电机Matlab/Simulink仿真模型 矢量控制直接转矩控制滑膜无感高频注入扩展卡尔曼模型参考自适应开环控制VFIF弱磁mpta模糊控制在电机控制领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;凭借其高效、高功率密度等优点&#xff0c;广泛应用于工业、交通等众多…

作者头像 李华