初识C++(3)

目录

一、初始化列表:

1、概念:

2、特性:

二、static成员:

1、概念:

2、特性:

三、友元

1、概念:

友元函数:

友元类:

四、内部类:

1、概念:

2、特性:


一、初始化列表:

1、概念:

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。初始化只能初始化一次,而构造函数体内可以多次赋值。

初始化列表:

        以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。

class Date
{
public:// 初始化列表Date(int mon, int day):_mon(mon), _day(day){}private:int _mon;int _day;
};

2、特性:

1、每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。

2、类中包含以下成员,必须放在初始化列表位置进行初始化:

{1、引用成员变量    2、const成员变量    3、自定义类型成员(且该类没有默认构造函数时)}

3、尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化。

4、成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

二、static成员:

1、概念:

        声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数静态成员变量一定要在类外进行初始化

class Test
{
private:// n不是属于某一个对象,属于所有对象,属于整个类static int n; // 类中声明,类外定义public:// 如果想在类外访问n: 1、突破类域,该为共有 2、该为成员函数访问static int GetN() //静态成员函数没有this指针{return n;}
};// 定义:
int Test::n = 1;

2、特性:

1、静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。

2、静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明

3、类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。

4、静态成员函数没有隐藏的this指针,不能访问任何非静态成员。

5、静态成员也是类的成员,受public、protected、private 访问限定符的限制

三、友元

1、概念:

友元分为:友元函数和友元类 

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。

友元函数:

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字

如下:重载运算符<< 并让类按指定格式输出

class Date
{
public:Date(int mon = 0, int day = 0): _mon(mon), _day(day){}// 友元声明,让其能访问类中的私有成员friend ostream& operator<<(ostream& cout, const Date& d);private:int _mon;int _day;
};ostream& operator<<(ostream& cout, const Date& d)
{// 因为进行了友元声明,所以可以直接访问Date类的私有成员cout << d._mon << "月" << d._day << "日" << endl;return cout;
}int main()
{Date d1(2, 7);// 让cout能直接输出d1并生成指定格式cout << d1;
}

特性:

1、友元函数可访问类的私有和保护成员,但不是类的成员函数

2、友元函数不能用const修饰

3、友元函数可以在类定义的任何地方声明,不受类访问限定符限制

4、一个函数可以是多个类的友元函数

5、友元函数的调用与普通函数的调用原理相同 

友元类:

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

class Test1
{
public:// 声明Test2为Test1的友元类,则在Test2中就能直接访问Test1的成员friend class Test2;Test1(int a = 0, int b = 0): _a(a), _b(b){}
private:int _a;int _b;
};class Test2
{
public:Test2(int x = 0, int y = 0): _x(x), _y(y){}//  可以直接访问Test1私有的成员变量void Test1make(int a = 1, int b = 1){t1._a = a;t1._b = b;}
private:int _x;int _y;Test1 t1;
};

特性:

1、友元关系是单向的,不具有交换性

(如上Test2为Test1的友元,Test2能访问Test1的私有成员,但Test1无法访问Test2的私有成员)

2、友元关系不能传递

如果C是B的友元, B是A的友元,则不能说明C是A的友元。

3、友元关系不能继承

四、内部类:

1、概念:

        如果一个类定义在另一个类的内部,这个类就叫做内部类。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

注意内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元

class A
{
public:class B // b天生就是a的友元{public:void Print(const A& a){cout << x << endl;cout << a.y << endl;}};
private:static int x;int y;
};int A::x = 1;int main()
{A::B b;b.Print(A());return 0;
}

2、特性:

1、内部类可以定义在外部类的public、protected、private

2、注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名

3、sizeof(外部类)=外部类,和内部类没有任何关系

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

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

相关文章

【51单片机】实现一个动静态数码管显示项目(超全详解&代码&图示)(5)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

贪心算法之田忌赛马,多种语言实现

目录 题目描述: 输入: 样例输入: 样例输出: c代码实现: c++代码实现: python代码实现: Java代码实现: 题目描述: 这是中国历史上一个著名的故事。 “那是大约2300年前的事了。田骥将军是齐国的高级官员。他喜欢和国王和其他人一起赛马。 “田和王都有三匹不同等级…

Redis篇之集群

一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离。主节点用来写的操作&#xff0c;从节点用来读操作&#xff0c;并且主节点发生写操作后&#xff0c;会把数据同…

vue3——登录校验

页面 首先需要在表单配置model、ref、rules&#xff0c;el-form-item中放prop <el-form :model"form" label-width"0" ref"formRef" :rules"rules"><el-form-item label"" prop"username"><el-in…

HTML元素的操作

获取HTML的值 获取文本内容 1.先获取元素的内容 2.使用innerText方法 let btn document.getElementById("btn");//获取文本内容console.log(btn.innerText);设置文本内容 btn.innerText "测试数据"; let box document.getElementById("box"…

Web后端开发:登录认证案例

登录功能 需求分析 在登录界面中&#xff0c;输入用户的用户名以及密码&#xff0c;然后点击 “登录” &#xff0c;服务端判断用户输入的用户名和密码是否都正确。如果正确&#xff0c;则返回成功结果&#xff0c;前端跳转至系统首页面&#xff1b;否则报错&#xff0c;停留在…

从零开始手写mmo游戏从框架到爆炸(十)— 集成springboot-jpa与用户表

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 集成springboot-jpa&#xff0c;不用mybatis框架一个是方便对接不同的数据源。第二个目前规划的游戏内容可能对数据库的依赖不是很大&#xff0c;jpa应该肯定能满足要求了…

c++学习:iostream输入输出+错误流+标准日志流

C 中的输入和输出&#xff08;I/O&#xff09;主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库&#xff0c;它 提供了用于输入和输出的基本流类&#xff0c;包括 cin 、 cout 、 cerr 和 clog 头文件 #include <iostream> 标准输出流 ( cout ) cout…

Unity类银河恶魔城学习记录4-1,4-2 Attack Logic,Collider‘s collision excepetion源代码 P54 p55

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; u…

深入探索 Express.js 的高级特性

引言 Express.js 是一个基于 Node.js 平台的 Web 开发框架&#xff0c;旨在提供一种简单、易于使用的方式来创建 Web 应用程序。由于其灵活性和可扩展性&#xff0c;它已经成为了 Node.js 社区最受欢迎的框架之一。在本文中&#xff0c;我们将重点介绍 Express.js 的高级特性&…

Flink从入门到实践(一):Flink入门、Flink部署

文章目录 系列文章索引一、快速上手1、导包2、求词频demo&#xff08;1&#xff09;要读取的数据&#xff08;2&#xff09;demo1&#xff1a;批处理&#xff08;离线处理&#xff09;&#xff08;3&#xff09;demo2 - lambda优化&#xff1a;批处理&#xff08;离线处理&…

容器基础知识:容器和虚拟化的区别

虚拟化与容器化对比 容器化和虚拟化都是用于优化资源利用率并实现高效应用程序部署的技术。然而&#xff0c;它们在方法和关键特征上存在差异&#xff1a; 虚拟化: 可以理解为创建虚拟机 (VM)。虚拟机模拟一台拥有自己硬件&#xff08;CPU、内存、存储&#xff09;和操作系统…

【Python基础】案例分析:电影分析

电影分析 项目背景&#xff1a; 数据集介绍&#xff1a;movie_lens数据集是一个电影信息&#xff0c;电影评分的数据集&#xff0c;可以用来做推荐系统的数据集需求&#xff1a;对电影发展&#xff0c;类型&#xff0c;评分等做统计分析。目标&#xff1a;巩固pandas相关知识…

nohup基本使用

在Linux终端命令中经常要使用到在关闭终端界面的情况下需要后台挂起执行的进程&#xff0c;也就是关闭终端后台任务的进程还是会常驻&#xff0c;下面就简单介绍下 nohup 命令 1. nohup nohup 英文全称 no hang up&#xff08;不挂起&#xff09;&#xff0c;默认情况下&#x…

Layui 表格组件 头部工具栏 筛选列 加入全选和全不选的功能

Layui 表格组件 头部工具栏 筛选列 加入全选和全不选的功能 问题 前端使用Layui表格组件展示后台数据&#xff0c;因数据中涉及字段较多&#xff0c;因此加入了组件中固有的控制表格列隐藏显示的功能。奈何客户希望再此基础上&#xff0c;加入“全选”和“全不选”的功能&…

【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LCP 57. 打地鼠 勇者面前有一个大小为3*3 的打地鼠游戏机&#xff0c;地鼠将随机出现在各个位置&#xff0c;moles[i] [t,x,y] 表…

Adb offline疑难杂症解决方案大全记录

无线/有线Adb offline依次尝试下面步骤&#xff1a; adb kill-server && adb start-server adb reconnect offline 多次 adb tcpip 5555 后重试 检查有线端口5037、无线5555占用&#xff0c;排除改名的adb或其他应用占用 换USB线和USB口拔插、确保同一WiFi下&#xff0…

Stable Diffusion 模型下载:Samaritan 3d Cartoon SDXL(撒玛利亚人 3d 卡通 SDXL)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 由“PromptSharingSamaritan”创作的撒玛利亚人 3d 卡通类型的大模型&#xff0c;该模型的基础模型为 SDXL 1.0。 条目内容类型大模型基础模型SDXL 1.0来源CIVITA…

2024.2.7

#include<stdio.h> #include<string.h> #include<stdlib.h> typedef char datatype;typedef struct node {//数据域datatype data;//指针域&#xff1a;左struct node *lchild;//指针域&#xff1a;右struct node *rchild; }*btree;//创建节点 btree creat_n…

嵌入式中轻松识别STM32单片机是否跑飞方法

单片机项目偶尔经常出现异常&#xff0c;不知道是程序跑飞了&#xff0c;还是进入某个死循环了&#xff1f; 因为发生概率比较低&#xff0c;也没有规律&#xff0c;所以没办法在线调试查找问题。 结合这个问题&#xff0c;给大家分享一下用ST-LINK Utility识别单片机程序是否…