第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题

news2024/9/20 23:24:32

将Page305~311的代码精简了一下,讨论一下引用含义的问题,精简之后的代码如下:

#include <iostream>
#include <SDL2/SDL.h>

using namespace std;

namespace sdl2
{

char const* last_error()
{
    return SDL_GetError();
}

struct Initiator
{
private:
    Initiator()//默认构造
        : _init_result(-1)
    {

    }
public:
    static Initiator& Instance()
    {
        static Initiator Instance;
        return Instance;
    }
    ~Initiator()
    {
        if(_init_result == 0)
        {
            SDL_Quit();
        }
    }

    void GetVersion(Uint8& major, Uint8& minor, Uint8& patch)
    {
        SDL_version ver;
        SDL_GetVersion(&ver);

        major = ver.major;
        minor = ver.minor;
        patch = ver.patch;
    }

    bool Init(Uint32 flags = SDL_INIT_EVERYTHING)
    {
        _init_result = SDL_Init(flags);
        return 0 == _init_result;
    }

//    bool operator bool()
    explicit operator bool() const
    {
        return _init_result == 0;
    }

private:
    int _init_result;
};//Initiator

struct WindowPosition
{
    WindowPosition() //默认构造,_x,_y都使用系统默认位置
            //SDL_WINDOWPOS_UNDEFINED会将窗口放到中间
        : _x(SDL_WINDOWPOS_UNDEFINED), _y(SDL_WINDOWPOS_UNDEFINED)
    {

    }

    //设置为居中,注意返回当前对象的引用
    WindowPosition& Centered(bool x_centered = true
                             , bool y_centered = true)
    {
        if(x_centered)
            _x = SDL_WINDOWPOS_CENTERED;
        if(y_centered)
            _y = SDL_WINDOWPOS_CENTERED;
    }

    int _x, _y;
};

struct WindowFlags
{
    WindowFlags() //默认构造,用于构建一个没有指定任何特性的普通窗口
        : _flags(0)
    {

    }

    Uint32 _flags;
};

struct Window
{
public:
    Window(char const* title
           , WindowPosition const& win_position
           , int w, int h
           , WindowFlags const& win_flags)
    {
        cout << &win_position << endl;
        _window = SDL_CreateWindow(title
                                   , win_position._x, win_position._y
                                   , w, h
                                   , win_flags._flags);
    }

    ~Window()
    {
        if(_window) //_window不是空指针
        {
            SDL_DestroyWindow(_window);
        }
    }

    SDL_Window* _window;
};

}

int main(int argc, char* argv[])
{
    sdl2::Initiator::Instance().Init(SDL_INIT_VIDEO
                                     | SDL_INIT_AUDIO
                                     | SDL_INIT_EVENTS
                                     | SDL_INIT_TIMER);

    if(!sdl2::Initiator::Instance())//重载转换符
    {
        cerr << "初始化就出错,没得玩了!"
             << sdl2::last_error() << endl;
        return -1;
    }

    //创建并居中显示宽640高480的游戏窗口
    sdl2::Window wnd("hello sdl"
                     , sdl2::WindowPosition().Centered(true, true)
                     , 640, 480
                     //使用空的特性标志
                     , sdl2::WindowFlags());
    SDL_Delay(5000);

    return 0;
}

可以看到代码第72和99行,使用了引用符号&,打两个断点,调试一下,当程序运行到75行时,停了下来,如下图:

说明72行,Centered函数返回的当前对象地址为0x61fe60, 继续运行到下一个断点,如下图

98行,构造函数中的参数win_position的地址是0x61fe60,这说明99行的参数win_position和72行Centered函数返回的当前对象的引用是同一个数据,继续往下执行,103行,输出了参数win_position的地址,果然是0x61fe60, 验证了我们的猜想。

若我们将99行的引用符号去掉,可以看到,72行的当前对象地址依然是0x61fe60

可是,99行的参数win_position,从调试中已看不到它的地址了,说明它只是一个复制的副本,再往下执行一行,可以看到参数win_position的地址是0x61fe3c ,这说明99行的参数win_position只是传入的复制量,和72的返回值,不再是同一个数据。

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

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

相关文章

贪心算法:买卖股票的最佳时机II 跳跃游戏 跳跃游戏II

122.买卖股票的最佳时机II 思路&#xff1a; 想要获得利润&#xff0c;至少要以两天为一个交易单元&#xff0c;因为两天才会有股价差。因此可以将最终利润进行分解&#xff0c;如prices[3] - prices[0] (prices[3] - prices[2]) (prices[2] - prices[1]) (prices[1] - pr…

07-抽象工厂

意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 适用性 在以下的情况可以选择使用抽象工厂模式&#xff1a; 一个系统要独立于它的产品的创建、组合和表示。一个系统要由多个产品系列中的一个来配置。要强调一系列相关的产品对象的…

Elasticsearch优化-04

Elasticsearch优化 1、优化-硬件选择 Elasticsearch 的基础是 Lucene&#xff0c;所有的索引和文档数据是存储在本地的磁盘中&#xff0c;具体的路径可在 ES 的配置文件…/config/elasticsearch.yml中配置&#xff0c;如下&#xff1a; # #Path to directory where to store …

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

C#中的封装、继承和多态

1.引言 在面向对象的编程中&#xff0c;封装、继承和多态是三个重要的概念。它们是C#语言中的基本特性&#xff0c;用于设计和实现具有高内聚和低耦合的代码。本文将详细介绍C#中的封装、继承和多态的相关知识。 目录 1.引言2. 封装2.1 类2.2 访问修饰符 3. 继承4. 多态4.1 虚方…

36个校招网络原理面试题

1.如何理解 URI&#xff1f; URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符&#xff0c;它的作用很简单&#xff0c;就是区分互联网上不同的资源。但是&#xff0c;它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分&#xff0c;由…

如何从众多知识付费平台中正确选择属于自己的平台(明理信息科技知识付费平台)

在当今的知识付费市场中&#xff0c;用户面临的选择越来越多&#xff0c;如何从众多知识付费平台中正确选择属于自己的平台呢&#xff1f;下面&#xff0c;我们将为您介绍明理信息科技知识付费平台相比同行的优势&#xff0c;帮助您做出明智的选择。 一、创新的技术架构&#…

全套SpringBoot讲义01

hello&#xff0c;我是小索奇&#xff0c;全套SpringBoot教程~一起来学习叭 文章目录 SpringBoot文档更新日志前言课程内容说明课程前置知识说明 SpringBoot基础篇JC-1.快速上手SpringBootJC-1-1.SpringBoot入门程序制作&#xff08;一&#xff09;JC-1-2.SpringBoot入门程序制…

Qt之QNetworkAccessManager 从本地和内存中上传数据到Http服务器

简述 接连做了好几个服务器的项目&#xff0c;例如文件传输用的Ftp和对象存储服务器(Object Storage Service)&#xff0c;简单的信息传输用的WebServer&#xff0c;之前也有用过HttpServer不过都和WebServer一样简单的调用接口提交数据并没有上传过文件&#xff0c;正好趁这次…

人工智能导论习题集(2)

第三章&#xff1a;确定性推理 题1题2题3题4题5题6题7 题1 题2 题3 题4 题5 题6 题7

设计模式之结构型设计模式(二):工厂模式 抽象工厂模式 建造者模式

工厂模式 Factory 1、什么是工厂模式 工厂模式旨在提供一种统一的接口来创建对象&#xff0c;而将具体的对象实例化的过程延迟到子类或者具体实现中。有助于降低客户端代码与被创建对象之间的耦合度&#xff0c;提高代码的灵活性和可维护性。 定义了一个创建对象的接口&…

spring 笔记九 Spring AOP

Spring 的 AOP 简介 什么是AOP AOP 为Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架…

【Spark精讲】Spark存储原理

目录 类比HDFS的存储架构 Spark的存储架构 存储级别 RDD的持久化机制 RDD缓存的过程 Block淘汰和落盘 类比HDFS的存储架构 HDFS集群有两类节点以管理节点-工作节点模式运行&#xff0c;即一个NameNode(管理节点)和多个DataNode(工作节点)。 Namenode管理文件系统的命名空…

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…

Java系列-ConcurrentHashMap-addCount

1.addCount public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>implements ConcurrentMap<K,V>, Serializable {private final void addCount(long x, int check) {CounterCell[] as; long b, s;//1.counterCells不为null//2.或者 x加到baseCou…

挑战52天学小猪佩奇笔记--day24

52天学完小猪佩奇--day24 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day24 的视频内容总结&#xff0c;方便复习。强烈建议大家去关注一波UP&#xff0c;配合UP视频学习。 注&#xff1a;这集开始变成一段一段的猜台词&#xff0c;加…

网站提示“不安全”

当你在浏览网站时&#xff0c;有时可能会遇到浏览器提示网站不安全的情况。这通常是由于网站缺乏SSL证书所致。那么&#xff0c;从SSL证书的角度出发&#xff0c;我们应该如何解决这个问题呢&#xff1f; 首先&#xff0c;让我们简单了解一下SSL证书。SSL证书是一种用于保护网站…

pybind11:对比C++和Python解线性方程组的速度

前言 上篇博客介绍了如何在用pybind11实现ndarray和C数组的转换自由&#xff0c;pybind11&#xff1a;实现ndarray转C原生数组&#xff08;没看过的朋友可以去看一看&#xff09;下面我们以一个实际的算法例子演示一下如何使用这个技术&#xff0c;方便的实现 Python 调用 C 写…

Java架构师系统架构高可用维度分析

目录 1 导语2 可用性介绍3 本地高可用-集群、分布式4 本地高可用-数据逻辑保护5 异地容灾-双活、两地三中心6 异地容灾-DRP规划&BCP业务连续性7 多活和妥协方案8 高可用流程9 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在进行系统架构设…

蓝桥杯专题-真题版含答案-【排序法 - 改良的选择排序】【插补搜寻法】【稀疏矩阵】【欧拉与鸡蛋】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…