c++类和对象(八) static成员 友元

news2024/11/28 23:58:50

1.1 概念

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

        面试题:实现一个类,计算程序中创建出了多少个类对象。

求1+2+3+...+n_牛客题霸_牛客网 这时我们要了解一道题,本题很好的能反映上述问题。

        由于vs编译器还不支持变长数组,但是牛客上面用的Linux下的gcc 它支持。

        如果要算构造了多少字,直接单独让i++ 就行。

1.2 特性

        1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
        2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
        3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
        4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
        5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

        注意:非静态成员函数(本来就在类域中)可以访问静态成员函数。

       2.1 友元函数

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

        问题:现在尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。

class Date
{
public:
Date(int year, int month, int day)
  : _year(year)
  , _month(month)
  , _day(day)
{}

// d1 << cout; -> d1.operator<<(&d1, cout); 不符合常规调用
// 因为成员函数第一个参数一定是隐藏的this,所以d1必须放在<<的左侧
ostream& operator<<(ostream& _cout)
{
  _cout << _year << "-" << _month << "-" << _day << endl;
  return _cout;
}
private:
int _year;
int _month;
int _day;
};

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

class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
_cin >> d._year;
_cin >> d._month;
_cin >> d._day;
return _cin;
}
int main()
{
Date d;
cin >> d;
cout << d << endl;
return 0;
}

        说明:

        友元函数可访问类的私有和保护成员,但不是类的成员函数
        友元函数不能用const修饰
        友元函数可以在类定义的任何地方声明,不受类访问限定符限制
        一个函数可以是多个类的友元函数
        友元函数的调用与普通函数的调用原理相同

        注意:友元函数为单向关系 a是b的友元,a可以访问b的私有,但是b访问不了a的私有。友元函数不具有传递性, a是b的友元  b是c的友元 ,a不是b的友元。

       2.2 友元类

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

        友元关系是单向的,不具有交换性。
        比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接
        访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
        友元关系不能传递
        如果C是B的友元, B是A的友元,则不能说明C时A的友元。
       

        在c++中了解友元类就好,并不常用。

2.3 内部类

        概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
        注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

        特性:
        1. 内部类可以定义在外部类的public、protected、private都是可以的。
        2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
        3. sizeof(外部类)=外部类,和内部类没有任何关系。

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

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

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

相关文章

Leetcode—187.重复的DNA序列【中等】

2023每日刷题&#xff08;二十&#xff09; Leetcode—187.重复的DNA序列 实现代码 class Solution { public:const int L 10;vector<string> findRepeatedDnaSequences(string s) {unordered_map<string, int> str;vector<string> ans;int len s.size()…

第 370 场 LeetCode 周赛题解

A 找到冠军 I 枚举求强于其他所有队的队 class Solution { public:int findChampion(vector<vector<int>> &grid) {int n grid.size();int res 0;for (int i 0; i < n; i) {int t 0;for (int j 0; j < n; j)if (j ! i)t grid[i][j];if (t n - 1) …

Linux环境基础开发工具使用(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Linux项目自动化构建工具-make/Makefile1、背景2、实例代码3、依赖关系4、依赖方法5、原理…

精品基于Python的图书借阅归还管控系统

《[含文档PPT源码等]精品基于Python的图书管控系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;Ja…

从NetSuite Payment Link杂谈财务自动化、数字化转型

最近在进行信息化的理论学习&#xff0c;让我有机会跳开软件功能&#xff0c;用更加宏大的视野&#xff0c;来审视我们在哪里&#xff0c;我们要到哪去。 在过去20多年&#xff0c;我们的财务软件经历了电算化、网络化、目前处于自动化、智能化阶段。从NetSuite这几年的功能发…

理解 fopen的 rwa r+w+a+ 参数含义

tags: C categories: C 理解 一图胜千言 我愿称之为最强 c - Difference between r and w in fopen() - Stack Overflow; 需要注意里面的a和 a, 区别在于 a 不可以读而 a可以读. c - Difference between r and w in fopen() - Stack Overflow; ModeReadWriteCreate New Fil…

【Java基础】内部类

一、什么是内部类 在一个类的里面&#xff0c;再定义一个类。&#xff08;在一个类的内部定义的类&#xff0c;称为内部类&#xff09; 举例:在A类的内部定义B类&#xff0c;B类就被称为内部类 二、内部类的访问特点 1.内部类可以直接访问外部类的成员&#xff0c;包括…

数据处理中的中心化

数据处理中的中心化&#xff0c;就是将原数据减去平均值&#xff0c;得到新的数据&#xff0c;新的数据的平均值为0。 假设原数据是x&#xff08;x可以是多维的&#xff09;&#xff0c;其平均值是&#xff0c;新的数据&#xff0c;那么新数据的平均值是为0的。下面证明下&…

[LeetCode] 2.两数相加

一、题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个…

网络编程 - HTTP协议

目录 HTTP协议格式 一&#xff0c;请求格式 1.1 URL的基本格式 1.2 方法(method) 1.3 请求头header 二&#xff0c;响应格式 2.1 状态码 HTTP协议格式 HTTP协议与之前讲的TCP/IP协议不同&#xff0c;HTTP协议要分为两个部分——请求和响应&#xff0c;也就是一种"一…

过了面试,后面的在线测评还会刷人吗?

过了面试&#xff0c;后面的在线测评还会刷人吗&#xff1f;完全有可能刷&#xff0c;如果不是为了刷&#xff0c;何必要给你做线上测评&#xff0c;我说的有道理不&#xff1f; 好吧&#xff0c;说到为什么在线测评要刷人&#xff0c;怎么刷&#xff1f; 怎么才能确保不被刷&…

教你快速阅读java简单字节码

我们举例代码 public class Read {public static void main(String[] args) {int a20;int b30;a1;b15;System.out.println((ab)/2);}}我们将他进行运行&#xff0c;我们就会在target 里面出现.class文件&#xff0c;我们需要进入 执行这个代码 javap -c Read.class就会出现…

【ICN综述】信息中心网络隐私安全

ICN基本原理&#xff1a; 信息中心网络也是需要实现在不可信环境下可靠的信息交换和身份认证 信息中心网络采用以数据内容为中心的传输方式代替现有IP 网络中以主机为中心的通信方式&#xff0c;淡化信息数据物理或逻辑位置的重要性&#xff0c;以内容标识为代表实现数据的查找…

基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

项目介绍 本系统是针对目前交通管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的市轨道交通线路查询系统存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率…

webgoat-(A1)injection

SQL Injection (intro) SQL 命令主要分为三类&#xff1a; 数据操作语言 &#xff08;DML&#xff09;DML 语句可用于请求记录 &#xff08;SELECT&#xff09;、添加记录 &#xff08;INSERT&#xff09;、删除记录 &#xff08;DELETE&#xff09; 和修改现有记录 &#xff…

随机微分方程的分数扩散模型 (score-based diffusion model) 代码示例

随机微分方程的分数扩散模型&#xff08;Score-Based Generative Modeling through Stochastic Differential Equations&#xff09; 基于分数的扩散模型&#xff0c;是估计数据分布梯度的方法&#xff0c;可以在不需要对抗训练的基础上&#xff0c;生成与GAN一样高质量的图片。…

【JavaEE初阶】 UDP服务器与客户端的搭建

文章目录 &#x1f333;前言&#x1f332;DatagramSocket API&#x1f384;DatagramPacket API&#x1f340;InetSocketAddress API&#x1f38d;回显客户端与服务器&#x1f4cc;建立回显服务器&#x1f4cc;回显客户端&#x1f4cc;成果展示 &#x1f38b;翻译小助手服务器与…

NTFS文件系统解析(三)

1、引言 对于NTFS文件系统而言&#xff0c;无论文件内容本身&#xff0c;抑或真实的文件属性&#xff0c;都被称之为属性。 而正如前文说到的&#xff0c;NTFS预定义了16种属性用于文件系统的管理。 而通常情况下&#xff0c;往往只需要关注其中的某些属性即可。 2、属性头 …

用户自定义消息及层次划分

有些人对术语 WM_USER 表示消息范围基的名称有不同的意见&#xff0c;因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是&#xff0c;用户不能使用它们&#xff0c;因为它们属于窗口类定义的一部分。 但是&#xff0c;问题是&#xff0c;”这里的用户是谁&#xff1f;”…

【Mybatis小白从0到90%精讲】10:Mybatis动态SQL:foreach、choose标签

文章目录 前言一、foreach 标签二、choose、when、otherwise 标签前言 动态SQL 是 Mybatis的亮点功能之一,如果你经历过 拼接SQL 的繁琐痛苦,那么你就能切身感受到动态SQL到底有多爽!真香哈~ 另外,Mybatis将动态SQL设计的如此自然,让人看看就能理解和接受,我想这也是My…