ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 静态全局变量V static global类变量

2019-08-26 06:06:55  阅读:265  来源: 互联网

标签:c global-variables static


更推荐哪种方式声明字符串const?

>是在文件范围声明全局变量.
>将其声明为全局类.

该变量仅用于类成员函数.我倾向于认为2更好,因为它仅限于类成员函数.

A.cpp
---------------------
static const std::string hello_str = "Hello";

void A::print()
{
    std::cout << hello_str;
}

(要么)

A.h
---------------------
class A{
public:
    static const std::string hello_str;
    void print();
}

A.cpp
---------------------
const std::string A::hello_str = "Hello";

void A::print()
{
    std::cout << A::hello_str;
}

编辑-1:

我要说hello_str的内容可以改变.例如.每当他对文件进行更改时,开发人员都会手动更新字符串.

在这种情况下,将变量初始化保留在函数内是否有意义?
用户更新字符串可能不明确/明显.如果它对文件(1)或类(2)保持全局,那么其他开发人员可以“识别”&修改此字符串.

鉴于上述用例,您是否仍然建议使用函数来返回字符串?或者我可以使用类级静态变量(使用私有访问说明符)?

解决方法:

匿名命名空间是另一种选择:

A.cpp

namespace {
  const std::string hello_str("Hello");
}

void A::print() {
    std::cout << hello_str;
}

但你应该将它包装在一个延迟初始化的函数中.

采取以下形式:

A.h
---------------------
class A{
public:
    static const std::string& hello_str();
    void print();
}

A.cpp
---------------------
const std::string& A::hello_str() {
  static const std::string str("Hello"); // << constructed on first call of A::hello_str()
  return str;
}

void A::print() {
    std::cout << A::hello_str();
}

在这种情况下,您也可以简单地按值返回,并完全避免静态/全局.你的std c库实现可能会使用什么叫做“小字符串优化” – 如果是这样,那么创建或移动字符串就不需要堆分配了.

还要注意你的两个例子不一样;一个是有效私人的,另一个是公开可见的.

最终,你不应该使用你提出的方法.考虑函数中的静态来进行延迟初始化,或者(在许多情况下更好)按值返回.

回答你原来的问题:我赞成在课堂上宣言,但是私下.我发现在事件实现转变时更容易维护.当然,如果外部实现以某种方式访问​​cpp中的静态,那么您可能还希望在类中将其声明为私有,以便其他人无法访问它.

标签:c,global-variables,static
来源: https://codeday.me/bug/20190826/1727023.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有