关于Json11源代码的一些混淆

时间:2018-03-19 14:52:56

标签: c++ json c++11

当我阅读SqlCommand cmd = new SqlCommand(@" UPDATE t1 SET t1.ScheduledStartUTC = t2.ScheduledStartUTC FROM ScheduleTickets AS t1 INNER JOIN @SetScheduledStart AS t2 ON t1.ScheduleId = t2.ScheduleId AND t1.PatchSessionId = t2.PatchSessionId ", c); cmd.Parameters.Add("@SetScheduledStart", SqlDbType.Structured).Value = SetScheduleTicketsDateDT; cmd.ExecuteNonQuery(); 的源代码时,我发现了令我困惑的事情。

Json11

为什么函数 /* * * * * * * * * * * * * * * * * * * * * Static globals - static-init-safe */ struct Statics { const std::shared_ptr<JsonValue> null = make_shared<JsonNull>(); const std::shared_ptr<JsonValue> t = make_shared<JsonBoolean>(true); const std::shared_ptr<JsonValue> f = make_shared<JsonBoolean>(false); const string empty_string; const vector<Json> empty_vector; const map<string, Json> empty_map; Statics() {} }; static const Statics & statics() { static const Statics s {}; return s; } /* * * * * * * * * * * * * * * * * * * * * Constructors */ Json::Json() noexcept : m_ptr(statics().null) {} Json::Json(std::nullptr_t) noexcept : m_ptr(statics().null) {} 返回声明为static const的引用值statics

为什么使用函数s来获取成员null?

1 个答案:

答案 0 :(得分:1)

Statics结构,如注释所述,旨在保存在代码中重复使用的常量值。而不是创建这些常用对象的多个实例,只需要一个,减少内存使用(并可能使比较更容易)。函数statics()返回对Statics结构的唯一全局实例的引用。这有点像singleton pattern in C++,但正如NathanOliver指出的那样,Statics仍然有一个公共构造函数,所以没有什么可以阻止你创建结构的新实例。

Json的构造函数使用单例Statics实例来获取它的null成员,这是指向JsonNull对象的指针。这意味着每个新的Json对象都是使用null值创建的,但JsonNull的相同实例用于初始化所有这些对象。由于Statics对象及其成员都是const,原则上(原则上)不可能偶然修改静态数据。