类和对象(8):explicit,static成员,友元,内部类

一、explicit

class Date
{
public:Date(int year = 2023, int month = 1, int day = 1):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day;
};int main()
{// Date d1(1); // 这是正常初始化Date d1 = 1;return 0;
}

不妨猜测一下,d1的初始化结果是什么?

构造函数不仅可以构造与初始化对象,对于1. 单个参数 2. 全缺省 3. 除第一个参数无默认值外其余均有默认值的构造函数,还具有类型转换的作用。

explicit修饰构造函数,将会禁止构造函数的默认转换。

二、static成员

2.1 概念

声明为static的类成员,称为类的静态成员(静态成员变量或静态成员函数)静态成员变量一定要在类外初始化

class A
{
private:static int _a;// 声明
};int _a = 0;// 初始化

2.2 特性

  1. 静态成员所有类对象共享,存在静态区。

  2. 静态成员变量必须在类外初始化,初始化时不加static

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

class A
{
public:static int GetCount_top(){_top++;return _top;}A():_a1(1){}private:int _a1;static int _top;
};int A::_top = 0;int main()
{A a1;cout << a1.GetCount_top() << endl; // 对象.静态成员cout << A().GetCount_top() << endl;// A() 为匿名对象cout << A::GetCount_top() << endl; // 类名::静态成员return 0;
}

A() 为匿名对象,当前语句结束后自动销毁。

  1. 类静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  2. 静态成员也是类的成员,同样受访问限定符的限制
int main()
{A a1;cout << a1._top << endl; // error C2248: “A::_top”: 无法访问 private 成员(在“A”类中声明)return 0;
}

三、友元

友元是一种突破封装的方式,部分场景能提供便利。但友元会增加耦合度,不宜多用。

3.1 友元函数
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1):_year(year), _month(month), _day(day){}friend ostream& operator<<(ostream& out, const Date& d); // 友元函数friend istream& operator>>(istream& in, Date& d);private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "-" << d._month << "-" << d._day;return out;
}istream& operator>>(istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}

友元函数可以直接访问类的私有成员,它是定义在类外部的函数,不是类的成员函数;需要在类的内部声明,声明时加friend

PS:

  1. 友元函数不能用const修饰

  2. 友元函数可以在类定义的任何位置声明,不受访问限定符限制

  3. 一个函数可以是多个类的友元函数。

  4. 友元函数的调用与普通函数相同。

3.2 友元类

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

  1. 友元关系是单向的,不具备交换性。
class A
{friend class B;// B是A的友元类,但A不是B的友元类
public:A():_a(1){}
private:int _a;
};class B
{
public:B():_b(1){A a1;}
private:int _b;
};int main()
{B b1;return 0;
}
  1. 友元关系不能传递

B是A的友元,C是B的友元,但C和A没有友元关系。

四、内部类

4.1 概念

存在类A、B,如果B定义在A的内部,B称为A的内部类

内部类是一个独立的类,不属于外部类不能通过外部类的对象访问内部类的成员

PS: 内部类就是外部类的友元类,外部类不是内部类的友元。

4.2 特性
  1. 内部类可以定义在外部类的任何位置。
  2. 内部类可以直接访问外部类static成员,不需要使用外部类的 类名对象
  3. sizeof(外部类)=外部类,与内部类无关

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

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

相关文章

两栏布局:左侧固定,右侧自适应

左侧宽度固定&#xff0c;右侧宽度自适应剩余空间 方法一&#xff1a;float margin 方法二&#xff1a;flex布局 相关HTML代码 <div class"container"><div class"left"></div><div class"main"></div> </d…

C#入门(1):程序结构、数据类型

一、C#程序结构 第一个C#程序 using System;namespace base_01 {class Program{#region 代码折叠块static void Main(string[] args){//控制台输出Console.WriteLine("Hello World!");Console.Write("C#是微软的编程语言"); //不换行输出//Console.Rea…

python表白程序,无法拒绝

# codinggbk import tkinter as tk import random import tkinter.messagebox as messagebox# 创建主窗口并隐藏 root tk.Tk() root.attributes(-alpha, 0) # 设置主窗口为不可见# 表白内容 message "做我女朋友好不好&#xff1f;"# 获取屏幕宽度和高度 screen_w…

linux网络——HTTPS加密原理

目录 一.HTTPS概述 二.概念准备 三.为什么要加密 四.常⻅的加密⽅式 1.对称加密 2.⾮对称加密 五.数据摘要&#xff0c;数字签名 六.HTTPS的加密过程探究 1.方案一——只使用对称加密 2.方案二——只使⽤⾮对称加密 3.方案三——双⽅都使⽤⾮对称加密 4.方案四——⾮…

设计模式(二)-创建者模式(2)-工厂模式

一、为何需要工厂模式&#xff08;Factory Pattern&#xff09;? 由于简单工厂模式存在一个缺点&#xff0c;如果工厂类创建的对象过多&#xff0c;使得代码变得越来越臃肿。这样导致工厂类难以扩展新实例&#xff0c;以及难以维护代码逻辑。于是在简单工厂模式的基础上&…

QFile文件读写操作QFileInFo文件信息读取

点击按钮选择路径&#xff0c;路径显示在lineEdit中 将路径下的文件的内容放在textEdit中 最后显示出来 &#xff01;file.atend()//没有读到文件尾就一直读 file.readline表示按行进行读 追加的方式进行写 要是重新写的话用file.open(QIODevice::write) 用QFileInFo来读取…

2023年【安全员-A证】报名考试及安全员-A证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证报名考试是安全生产模拟考试一点通总题库中生成的一套安全员-A证新版试题&#xff0c;安全生产模拟考试一点通上安全员-A证作业手机同步练习。2023年【安全员-A证】报名考试及安全员-A证新版试题 1、【多选…

【MySQL--->用户管理】

文章目录 [TOC](文章目录) 一、用户管理表二、基本操作三、用户权限分配给用户某个数据库中某个表的某个权限. grant 权限 on 库.表名 to 用户名主机名. ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe8eb171ef9343c3a09bd64d4f0db5c1.png)分配给用户某个数据库中全部表…

指南:关于帮助中心需要注意的一些细节

在现代商业环境中&#xff0c;帮助中心已经成为企业提供客户支持和解决问题的重要方式之一。然而&#xff0c;建立一个高效的帮助中心并不简单。除了选择合适的软件平台和工具之外&#xff0c;还需要注意一些细节&#xff0c;以确保能够真正帮助客户并提高客户满意度。 | 1.设计…

RobotFramework框架之导入自己打包的python程序(十五)

引言 RobotFramework自动化框架&#xff08;以下简称RF&#xff09;之前文章我们讲了通过import第三方的library&#xff08;RequestsLibrary等&#xff09;&#xff0c;在实际项目中第三方的包并不能满足我们的需要&#xff0c;此时我们可自己编写python模块&#xff08;.py文…

Adversarially Robust Neural Architecture Search for Graph Neural Networks

Adversarially Robust Neural Architecture Search for Graph Neural Networks----《面向图神经网络的对抗鲁棒神经架构搜索》 摘要 图神经网络&#xff08;GNN&#xff09;在关系数据建模方面取得了巨大成功。尽管如此&#xff0c;它们仍然容易受到对抗性攻击&#xff0c;这对…

Java读写Jar

Java提供了读写jar的类库Java.util.jar&#xff0c;Java获取解析jar包的工具类如下&#xff1a; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import …