初始化列表,变量存储区域和友元变量

前言

初始化列表是书写构造函数的一种方式,某些成员变量之只能通过初始化列表进行初始化。另外学习c++不可避免地需要知道什么样的变量存储在什么区域当中如栈,堆,静态区,常量区

初始化列表

书写格式

书写上,初始化列表,以冒号开始,以逗号分割的数据成员列表,每个成员变量后面个呢一个放在括号后面的初始值或表达式

如下图所示给出一个日期类的初始化列表

class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day;
};

初始化列表有什么作用

1.初始化列表可以代替大部分函数体内赋值

2.某些成员变量只能通过初始化列表初始化

引用成员变量,const成员变量,自定义类型变量(且该类没有构造函数时)只能在初始化列表中初始化

一些需要注意的点

1.每个成员变量在初始化列表只能出现一次,不能重复定义

2.成员声明的位置和初始化列表中变量的位置顺序相同,因为初始化列表是根据成员定义时的位置一一初始化的

class A
{
public:A(int a):_a1(a),_a2(_a1){}void Print(){cout<<_a1<<" "<<_a2<<endl;}
private:int _a2;int _a1;
}int main()
{A aa(1);aa.Print();
}

这个例子就能很好的体现上述问题,定义的顺序和初始化列表的顺序不同,所以a1在拷贝构造给a2时还没有初始化,所以打印出来的应该是1和随机值

3.初始化列表和函数体内赋值各有优略,比如函数体内赋值可以对malloc进行检查等等

4.当我们使用初始化列表初始化自定义成员时,如果自定义成员的构造函数没有缺省值,需要显式传参

静态成员

区块的分类

这里所说的分类都是虚拟内存,分为栈区,堆区,静态区(数据段),代码段(常量区)

静态成员变量

静态成员变量在类中声明时,需要在最开头加上static关键字,静态成员变量不能够在类内初始化,只能通过访问限定符在类外初始化

静态成员变量存放在静态区

class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}static int sign;
private:int _year;int _month;int _day;}; 
int Date::sign = 1;

静态成员变量依然收到private等关键字的限制,定义在public中可以用域限定符或者访问操作符访问

所有统一个类的对象共用一个静态成员变量

不能用初始化列表来初始化静态成员变量,定义只能在类外进行定义,使用域限定符

静态成员函数

静态成员函数和静态成员变量很像,所有同一个类的对象共用,受private关键字限制

静态成员函数没有this指针,意味着它不能够调用非静态成员变量

我们一般喜欢使用静态成员函数去调用静态成员变量,配套使用

友元

友元有许多种,但是归根结底友元的目的是让私有的成员也能让其他非成员的函数或者类访问

比如

#include <iostream>
using namespace std;
class Date{
public:Date(int year = 1900,int month = 1,int day = 1):_year(year),_month(month),_day(day){}friend ostream& operator<<(ostream& out,Date& d);static int sign;
private:int _year;int _month;int _day;}; 
int Date::sign = 1;
ostream& operator<<(ostream& out,Date& d)
{out<<d._year<<" "<<d._month<<" "<<d._day;return out;
}int main()
{Date d1(2025,8,5);cout<<d1<<endl;cout<<d1.sign;
}

这样一个流运算符的重载就只能写成友元函数,因为他一定有一个ostream对象占用一个参数,而我们又希望他能够输出结果,那就只能使用友元了。

书写的方法很简单,只需要在类内声明这个函数,并在最前方加上friend关键字即可

内部类天然是外部类的友元

类内可以定义内部类,内部类可以访问外部类的所有成员,但是外部类无法访问内部类的私有成员

注意:私有内部类受访问限定符的限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel插入复选框 亲测有效

特别说明 1.开始位置是0 2.\u0052是勾选对号 3.\u25A1是不勾选 4.\u0052长度是1 5.\u25A1长度是1 6.汉字长度是1 7.起止位置不能超过索引位置(比如整体长度是6,截止位置最大填写5) 示例代码 package com.zycfc.xz.Util.excel;import org.apache.poi.hssf.usermodel.HSSFRichT…

Mac上优雅简单地使用Git:从入门到高效工作流

Mac上优雅简单地使用Git&#xff1a;从入门到高效工作流 本文将带你解锁在Mac上优雅使用Git的技巧&#xff0c;结合命令行与图形工具&#xff0c;让版本控制变得轻松高效&#xff01; 一、为什么Mac是Git的最佳搭档&#xff1f; 天生支持Unix命令&#xff1a;Git基于Linux开发…

一文了解SOA的纹波

什么是光谱纹波我们在SOA/RSOA/SLD的ASE&#xff08;放大的自发辐射&#xff09;光谱测试中&#xff0c;经常会观察到光谱中有周期性的变化&#xff0c;通常我们称之为纹波。在实际应用中&#xff0c;我们大多不希望这些纹波的存在。添加图片注释&#xff0c;不超过 140 字&…

ossutil 使用方法

目录 ossutil 使用方法 1. &#x1f4e4; 上传文件/文件夹到 OSS 上传单个文件&#xff1a; 上传整个文件夹&#xff08;递归&#xff09;&#xff1a; 2. &#x1f4e5; 从 OSS 下载文件/文件夹 下载单个文件&#xff1a; 下载整个文件夹&#xff1a; ossutil 使用方法…

从“多、老、旧”到“4i焕新”:品牌官方商城(小程序/官网/APP···)的范式跃迁与增长再想象

全新升级版本「佛罗伦萨小镇奥莱GO」商城正式上线&#xff01;会员福利加码 2025年&#xff0c;品牌官方商城应该如何定义&#xff1f;—— 还是一套“电商货架”&#xff1f; 在商派看来&#xff0c;现如今“品牌官方商城”则需要重新定义&#xff0c;结合不同品牌企业的业务…

WIN QT libsndfile库编译及使用

一、概述 libsndfile库是一个用 C 语言编写的开源库&#xff0c;用于读取和写入多种音频文件格式。 环境&#xff1a;QT5.9.9、cmakegui3.23.0、QT的编译器是minWG32 二、安装 1、下载libsndfile源码&#xff0c;连接&#xff1a;https://github.com/libsndfile/libsndfile…

Supergateway教程

Supergateway 是一款专为 MCP&#xff08;Model Context Protocol&#xff09;服务器设计的远程调试与集成工具&#xff0c;通过 SSE&#xff08;Server-Sent Events&#xff09;或 WebSocket&#xff08;WS&#xff09;协议实现基于 stdio 的服务器与客户端的高效通信。 Super…

203.移除链表元素 707.设计链表 206.反转链表

203.移除链表元素 Python链表节点定义&#xff1a; class ListNode:def __init__(self, val, nextNone):self.val valself.next next 性能分析 链表的特性和数组的特性进行一个对比&#xff0c;如图所示&#xff1a; 203. 移除链表元素 这道题就是给大家一个链表&#x…

人工智能之数学基础:利用全概率公式如何将复杂事件转为简单事件

本文重点 全概率公式是概率论中的核心工具,用于计算复杂事件的概率。其核心思想是将复杂事件分解为若干互斥且穷尽的简单事件,通过计算各简单事件的概率及其条件概率,最终求得目标事件的概率。 全概率公式 全概率公式就是将复杂事件简单化,定义如下: 如果随机事件A1,…

飞算JavaAI深度解析:从入门到对比

目录 一、飞算JavaAI是什么 二、如何注册和开始使用 三、使用体验&#xff1a;它能带来什么 四、与其他大模型的对比分析 五、总结与展望 随着人工智能技术的飞速发展&#xff0c;大模型在软件开发领域的应用越来越广泛。其中&#xff0c;代码生成工具作为提升开发效率的利…

Flutter各大主流状态管理框架技术选型分析及具体使用步骤

技术选型决策树 #mermaid-svg-m5gUL7Cpx4rYV2BQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-icon{fill:#552222;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-text{fill:#552222;stroke:#552…

Redis类型之String

1.Redis中的string注意本文以及之后讲的redis的类型但是指的value的类型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二进制数据的方式存储的&#xff0c;不会做任何的编码转换&#xff0c;这里相对于mysql就比较好&#xff08;个人感觉&#xff0…

[激光原理与应用-156]:光学器件 - 激光器为什么会出现多余的能量,哪些地方会出现多余能量?

在激光器运行过程中&#xff0c;多余能量的出现是不可避免的物理现象&#xff0c;其根源在于能量转换与传输过程中的非理想特性。以下从能量来源、产生位置及具体机制三方面进行详细说明&#xff1a;一、多余能量的主要来源泵浦源效率限制泵浦源&#xff08;如激光二极管、闪光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模态多任务预训练以改善点云理解 预…

如何对云环境或者超融合系统进行性能测试?

最近几个月&#xff0c;公司开启了新的产品计划&#xff0c;准备来做一个国产超融合一体机&#xff08;其实个人觉得现在入行已经晚了太多了&#xff0c;市场基本没有多少了&#xff09; POC功能测试过完&#xff0c;但是感觉不到什么优势&#xff0c;由于芯片架构采用的是arm架…

【web自动化测试】实战

web自动化测试就是对界面的测试1、编写测试用例2、参考测试用例&#xff0c;创建自动化测试项目&#xff0c;编写自动化测试脚本论坛登录页&#xff1a;ForumLoginTest.py论坛首页&#xff1a;ForumListTest.py论坛详情页&#xff1a;ForumDetailTest.py论坛编辑页&#xff1a;…

在Maxscript中随机化对象变换、颜色和材质

只需几行Maxscript,即可为3ds Max场景带来更多活力和变化! 在本文中,您将学习如何快速随机化选定对象的位置、旋转、线颜色和材质。 非常适合在ArchViz、动态图形和产品可视化项目中创建更自然、更少机械的布局。 为什么要使用随机化脚本? 1.快速为场景添加自然随机性 2.…

分类数据集 - 交通事故场景分类数据集下载

数据集介绍&#xff1a;交通事故场景分类数据集&#xff0c;真实交通场景高质量图片数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下是否发生交通事故检测项目&#xff0c;以及作为监控场景通用交通检测数据集场景数据的补充&#xff1b;数据集类别&#xff1…

内网公网详解,及无公网IP内网穿透给外网直接远程连接访问的具体实现方法步骤

一、什么是内网、外网1、内网IP&#xff08;局域网IP&#xff09;是指在私有网络或局域网内部使用的IP地址&#xff0c;无法直接从互联网访问&#xff0c;需通过NAT&#xff08;网络地址转换&#xff09;技术实现对外通信。内网IP&#xff08;Intranet IP&#xff09;是专为局域…

Redis协议数据迁移方式

主从复制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目标实例挂为从节点&#xff0c;通过复制协议全量增量同步后切换为主。模拟从节点工具&#xff1a;模拟复制协议同步数据&#xff0c;常见两种实现&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …