当前位置: 首页 > news >正文

初始化列表友元嵌套

在类中我们存在构造函数

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类的内存大小

http://www.rkmt.cn/news/181385.html

相关文章:

  • 2025沙发垫沙发巾厂家电话推荐:优质之选任你挑 - 栗子测评
  • 无需Anaconda臃肿包!轻量级Miniconda-Python3.9玩转PyTorch
  • 读书笔记2
  • 2025年SSD厂家推荐榜:龙芯ssd/加固存储服务器ssd/工控机ssd/工业嵌入式主板ssd/加固平板电脑ssd/加固笔记本电脑ssd源头厂家精选 - 品牌推荐官
  • 2025年靠谱瓦楞包装纸箱加工厂排名:售后好、技术强的值得选生产厂推荐 - myqiye
  • 接口自动化测试之pytest 运行方式及前置后置封装
  • 2025年佛山座椅电梯专业供应商排行榜,新测评精选座椅电梯服务厂商推荐 - mypinpai
  • 如何利用尺寸管理实现从被动救火到主动预防的质量转型?
  • 2025年ICP办理机构权威推荐榜:ICP许可证/备案/经营许可证/证书代办/网络经营许可证,合规咨询与一站式服务厂家精选 - 品牌推荐官
  • 2025液压管件批发零售,优质快速交货液压接头厂家盘点 - 栗子测评
  • 2025同步带厂家哪家好?深耕行业的优质厂商大盘点 - 栗子测评
  • 永磁同步电机Matlab/Simulink仿真模型探索
  • 2026年AI人才“定价权”争夺战:掌握大模型核心算法,你就是在定义市场薪资上限!
  • RADI-5.15-5.25-SMT-2WR-20WPK-R25,20 W的微波隔离器, 现货库存
  • 2025年技术领域大火!大模型应用开发工程师成为最火岗位,平均月薪高达30K+。2026年,抓住机遇入局,成为下一个技术界明星!
  • 计算机毕业设计springboot对于股票实时信息系统 基于SpringBoot的证券行情实时监测与交易辅助平台 融合SpringBoot框架的股市动态信息实时推送系统
  • SSH连接拒绝Connection refused?Miniconda-Python3.9镜像sshd服务检查
  • 2025保丽鑫手机保护膜凭啥出圈,手机保护膜源头工厂全解析 - 栗子测评
  • 计算机毕业设计springboot少儿体能训练在线课程预约管理系统 基于SpringBoot的青少年体质提升在线课程预约平台 SpringBoot驱动的儿童运动训练课程智能预约系统
  • GitHub热门项目推荐:基于Miniconda-Python3.9的AI实验复现仓库
  • 2025led食人鱼灯珠哪家好?专业视角深度评测与推荐 - 栗子测评
  • 运维系列数据库系列【仅供参考】:达梦数据库安装
  • 自由编辑+AI 赋能:ChatPPT与Nano Banana Pro的创作革命
  • 2025水喷射真空机组厂家实力榜:技术与口碑兼具的选择 - 栗子测评
  • 004 - AcidBytes2
  • 2025水喷射真空机组哪家好?水喷射真空机组推荐及优势盘点 - 栗子测评
  • 2025钨酸钠生产厂家TOP5权威推荐:出货快、服务好的靠谱服务商深度测评 - 工业品网
  • 2025年服务不错的儿童视唱练耳机构推荐,儿童视唱练耳品牌老师解析 - mypinpai
  • 2025最新淀粉衍生物三剑客推荐 TOP5:预糊化淀粉/黄糊精/白糊精合规厂家清单 - 深度智识库
  • 突发|Meta 官宣引入 Manus:创始人出任副总裁,核心团队整体并入