类的组合、作用域与可见性、类的静态成员、单例模式、

类的组合

一个类内嵌其他类的对象作为成员的情况

has - a组合

初始化列表的另一用途:为了调用数据成员的带参构造函数

能够层层递进

class Line
{
public:
    Line(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0);
    Line(const Line &other);
    ~Line();
    Line(const Point &p1, const Point &p2);
    void showLine(void);
private:
    Point m_p1, m_p2;
};
Line::Line(int x1, int y1, int x2, int y2) : m_p1(x1, y1), m_p2(x2, y2)
{

}

Line::Line(const Line &other) : m_p1(other.m_p1), m_p2(other.m_p2)
{

}

Line::~Line()
{

}

Line::Line(const Point &p1, const Point &p2) : m_p1(p1), m_p2(p2)
{

}

void Line::showLine()
{
    m_p1.showPoint();
    cout << "->";
    m_p2.showPoint();
    cout << endl;
}
    Line l1(1, 2, 3, 4);
    Line l2(l1);
    Point p1(5, 6);
    Point p2(7, 8);
    Line l3(p1, p2);
    l1.showLine();
    l2.showLine();
    l3.showLine();

前向引用声明

针对引用和指针

class A; //前向声明

class B
{
public:
    void fn(A *a){} //或者 void fn(A &a){}

};

class A
{
public:
    void fn(B *b){} //或者 void fn(B &b){}
};

作用域

全局作用域 — 名称前面加两个冒号

匿名作用域(相当于c中的static) — 直接使用

作用域的关系

全局命名空间作用域,要访问时加上::

例::x

作用域可见性的一般规则如下:

1、标识符要声明在前,引用在后

2、在同一作用域中,不能声明同名的标识符

3、在没有互相包含关系的不同的作用域中声明的同名标识符,互不影响

4、如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见

生存期

静态生存期:对象的生存期与程序的运行期相同

        全局变量(全局对象)

        static修饰的静态局部变量:调用时创建,程序结束之后销毁

动态生存期:诞生于声明点,作用域结束时会被销毁

匿名对象生存期

        匿名对象:函数返回值为一个对象时,调用函数返回的对象就是匿名对象

        为动态生存期,若是对匿名对象加名字(加常引用),匿名对象生存期将会被改变

const Clock &ref = Clock(11, 22, 33);

左值和右值

locatiable  left   value:能被取地址就是左值

readable   right value:不能被取地址就是右值

所有的匿名对象都是右值而非左值

右值引用:希望能够使用匿名对象,起一个右值引用类型的别名

(给匿名对象起名字)

例:Clock &&ref = Clock(11, 22, 33);

类的静态成员

静态属性不为本类对象所特有的,而为本类所有对象所共有的属性

数据类型 类名 ::成员名

 即类中的对象为声明,实际的对象是全局变量

静态对象函数:不需要使用对象.函数来调用,可以直接类名::函数来使用

静态数据成员:具有唯一性,对象有几个都没关系,这个成员在内存中只有一份

静态成员函数:不需要对象出现就能调用

在类的静态成员中不能访问类的非静态成员

在类的非静态成员中既可以访问类的非静态数据成员也可以访问类的静态数据成员

单例模式

#include <iostream>

using namespace std;

class Singleton
{
public:
    static Singleton *creat()//creat在没有对象的时候也能调用(类名::函数)
    {
        if (m_p == NULL)
        {
            m_p = new Singleton;//new:在堆上申请一个空间
        }
        return m_p;
    }
    static void destory()
    {
        delete m_p;//相当于free
        m_p = NULL;
    }
private:
    Singleton() {}
    static Singleton *m_p;//使得对象只能创建一个
};

Singleton *Singleton::m_p = NULL;

int main()
{
    Singleton *p, *q;
    p = Singleton::creat();
    q = Singleton::creat();//虽然分两次调用,但是调用的都是同一个东西,称为单例调用

    cout << p << endl;
    cout << q << endl;

    Singleton::destory();//类的使用者使用完之后调用销毁程序
    
    return 0;
}

使用counter验证是否为单例模式

#include <iostream>

using namespace std;

class Singleton
{
public:
    static Singleton *creat()//creat在没有对象的时候也能调用(类名::函数)
    {
        if (m_p == NULL)
        {
            m_p = new Singleton;//new:在堆上申请一个空间
        }
        return m_p;
    }
    static void destory()
    {
        delete m_p;//相当于free
        m_p = NULL;
    }
    static int getcounter()
    {
        return counter;
    }
    ~Singleton()
    {
        --counter;
    }
private:
    Singleton()
    {
        ++counter;
    }
    static Singleton *m_p;//使得对象只能创建一个
    static int counter;
};

Singleton *Singleton::m_p = NULL;
int Singleton::counter = 0;

int main()
{
    Singleton *p, *q;
    cout << Singleton::getcounter() << endl;
    p = Singleton::creat();
    q = Singleton::creat();//虽然分两次调用,但是调用的都是同一个东西,称为单例调用
    cout << Singleton::getcounter() << endl;

    cout << p << endl;
    cout << q << endl;

    Singleton::destory();//类的使用者使用完之后调用销毁程序
    cout << Singleton::getcounter() << endl;

    return 0;
}

类的友元函数 / 类

临时打破类的访问权限设置,从而在类外对类内的私有成员访问的机制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux mail命令及其历史

一、【问题描述】 最近隔壁组有人把crontab删了&#xff0c;crontab这个命令有点反人类&#xff0c;它的参数特别容易误操作&#xff1a; crontab - 是删除计划表 crontab -e 是编辑&#xff0c;总之就是特别容易输入错误。 好在可以通过mail命令找回&#xff0c;但是mai…

恭喜!国内医生喜提哈佛大学布莱根妇女医院访问学者邀请函

【校园简介】 布莱根妇女医院(Brigham and Women’s Hospital&#xff0c;BWH)位于马萨诸塞州波士顿的哈佛医学区&#xff0c;毗邻于哈佛医学院校园&#xff0c;是哈佛大学医学院的主要附属医院之一。位于马萨诸塞州波士顿的布莱根妇女医院有12项成人学科位居全国权威,并在耳鼻…

【Linux】详解线程控制之线程创建线程终止线程等待线程分离

一、线程创建 thread&#xff1a;这是一个指向pthread_t类型的指针&#xff0c;用于获取新创建线程的线程ID。在调用pthread_create后&#xff0c;这个指针会被设置为新线程的ID。 attr&#xff1a;这是一个指向pthread_attr_t类型的指针&#xff0c;用于设置线程的属性&#x…

网络工程师备考1——基础学习

认识设备 1 交换机 一、什么是交换机&#xff1f; 实现不同电脑之间数据的转发 换机是一种用于电(光)信号转发的网络设备。 它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层&#xff0c;即数据…

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务)

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务) 一、开通阿里云短信服务 阿里云官网:阿里云官网 选择产品中企业服务与云通信中的短信服务 选择免费开通 选择快速学习和测试 根据这几个全部配置一下我这里是配置好了所以学习进度是100% 1.1 添加资质 首先选择新增资质 …

SpringBoot发送邮箱

一、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 二、添加配置 application.yml文件 将username修改为自己的邮箱&#xff0c;password修改为…

【Vue】Vue2使用ElementUI

目录 Element UI介绍特点Vue2使用Element安装引入ElementUI组件库 使用ElementUI用户注册列表展示其他 mint-ui介绍特点安装组件引入组件Mint-ui相关组件 Element UI 介绍 官网(基于 Vue 2.x ):https://element.eleme.cn/#/zh-CN ElementUI 是一个基于 Vue.js 的桌面端组件库…

基于Arduino的电梯超载报警系统

企鹅&#xff1a;2583550535 项目和论文都有 第1章 绪论.............................................................................................................................. 1 1.1 项目背景及意义........................................................…

ABP.VNET 项目结构

想要了解ABP分层架构&#xff1a;ABP分层架构-CSDN博客 可以看此篇文章 apb.vnet 生成的项目的目录结构 .Application 项目 应用服务用于将领域(业务)逻辑暴露给展现层。 展现层通过传入DTO(数据传输对象)参数来调用应用服务&#xff0c;而应用服务通过领域对象来执行相应的…

【网络安全】2030年十大新兴网络安全威胁

欧盟网络安全局&#xff08;ENISA&#xff09;已发布了一份全面的清单&#xff0c;列出了预计到2030年将影响数字领域的十大新兴网络安全威胁。 该预测是为期八个月的广泛研究的成果&#xff0c;融合了ENISA前瞻专家小组、CSIRTs网络以及欧盟CyCLONe专家的见解。 这项研究突显…

抖音小店无货源怎么做?从开店到发货,最全教程来了!

哈喽~我是电商月月 近几年&#xff0c;抖音的发展如火如荼&#xff0c;抖音小店也吸引了大批新手商家入驻 那抖音小店具体流程到底怎么做&#xff1f;无货源的商家去哪找货&#xff1f;怎么上架&#xff0c;如何推流? 不知道&#xff1f; 今天我就给大家讲一下抖音小店从开…

[集群聊天服务器]----(五)User类、UserModel类

接着上文[集群聊天服务器]----(四)MySQL数据库模块&#xff0c;接下来我们对User类、UserModel类进行剖析&#xff0c;User表和UserModel类是项目最基本也是最重要的部分&#xff0c;通过它我们对用户的id&#xff0c;用户名&#xff0c;密码&#xff0c;状态相关信息进行存储&…

数据分析【方差分析】四

方差分析的核心 什么是方差分析:方差分析是假设检验的一种延续与扩展,主要用于多个总体均值(三组或三组以上均值)是否相等做出假设检验,研究分类型自变量对数值型因变量的影响。 它的零假设和设备假设分别为: 单因素方差分析的前提条件 独立性 组内独立(随机抽样、…

<string.h>中部分库函数的模拟实现

前言 嗨&#xff0c;我是firdawn&#xff0c;本章将简单介绍&#xff0c;<string.h>中部分库函数的模拟实现&#xff0c;如strncpy&#xff0c;strncat&#xff0c;memcpy&#xff0c;memmove。在本文片末&#xff0c;还讲简单介绍判断机器大小端的函数实现&#xff0c;…

【Linux】LAMP集群分布式安全方案

LAMP集群分布式安全方案主要涉及确保Linux、Apache、MySQL和PHP&#xff08;LAMP&#xff09;组合构成的集群环境的安全性和稳定性。 本次实验通过网络层安全对防火墙配置&#xff1a;使用防火墙&#xff08;如iptables或firewalld&#xff09;来限制对集群的访问&#xff0c;只…

设计模式在芯片验证中的应用——单例

一、单例模式 单例模式(Singleton)是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。验证环境配置(configuration)类、超时(timeout)处理类等可以使用单例实现。比如说验证环境需要在特定场景中监测特定接口上的超时事…

AI+BI?国内期待值最高的4款智能问答类BI产品测评

AI大模型的这股风终是吹到了数据分析圈。与传统BI相比&#xff0c;问答BI进一步降低了数据获取门槛&#xff0c;通过对话的方式就可以访问数据并得出相应结论&#xff0c;更方便业务人员快速上手分析数据&#xff01; 问答BI&#xff08;Q&A BI&#xff09;在数据分析领域…

【论文笔记】| 定制化生成PuLID

PuLID: Pure and Lightning ID Customization via Contrastive Alignment ByteDance, arXiv:2404.16022v1 Theme: Customized generation 原文链接&#xff1a;https://arxiv.org/pdf/2404.16022 Main Work 提出了 Pure 和 Lightning ID 定制 (PuLID)&#xff0c;这是一种用于…

LaTeX 2022软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; LaTeX 2022是基于ΤΕΧ的一种排版系统&#xff0c;特别适用于生成科技和数学文档的高质量打印。它可用于各种文档类型&#xff0c;从简单信函到完整…

使用DataGrip连接Elasticsearch

使用DataGrip连接Elasticsearch 前言&#xff0c;公司需要使用ES来做数据的查询&#xff0c;我安装完ES&#xff0c;安装完Kibana的时候&#xff0c;想先开始尝试一下&#xff0c;插入查询数据能否可用&#xff0c;但是上次使用ES是好久前了&#xff0c;增删改查的请求根本记不…