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

本文主要是介绍第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将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;
};//Initiatorstruct 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的返回值,不再是同一个数据。

这篇关于第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503559

相关文章

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②