漫谈C++:良好的编程习惯与编程要点【2】

举报
ShaderJoy 发表于 2021/12/30 01:39:23 2021/12/30
【摘要】 转自:melonstreet static与类 ① 不和对象直接相关的数据,声明为static 想象有一个银行账户的类,每个人都可以开银行账户。存在银行利率这个成员变量,它不应该属于对象,而应该属于银行这个类,由所有的用户来共享。static修饰成员变量时,该成员变量放在程序的全局区中,整个程序运行过程中只有该成员变量的一份副本。...

转自:melonstreet

static与类

① 不和对象直接相关的数据,声明为static

想象有一个银行账户的类,每个人都可以开银行账户。存在银行利率这个成员变量,它不应该属于对象,而应该属于银行这个类,由所有的用户来共享。static修饰成员变量时,该成员变量放在程序的全局区中,整个程序运行过程中只有该成员变量的一份副本。而普通的成员变量存在每个对象的内存中,若把银行利率放在每个对象中,是浪费了内存。
 

② static成员函数没有this指针

static成员函数与普通函数一样,都是只有一份函数的副本,存储在进程的代码段上。不一样的是,static成员函数没有this指针,所以它不能够调用普通的成员变量,只能调用static成员变量。普通成员函数的调用需要通过对象来调用,编译器会把对象取地址,作为this指针的实参传递给成员函数:
 

obj.func() ---> Class :: fun(&obj);
 

 


而static成员函数即可以通过对象来调用,也可以通过类名称来调用。

 

 

 

③在类的外部定义static成员变量


另一个问题是static成员变量的定义。static成员变量必须在类外部进行定义:

 

 

 

 

 


  
  1. class A
  2. {
  3. private:
  4. static int a; //①
  5. }
  6. int A::a = 10; //②

 



注意①是声明,②才是定义,定义为变量分配了内存。

 

 

 

④static与类的一些小应用


这些可以用来应付一下面试,在实现单例模式的时候,static成员函数与static成员变量得到了使用,下面是一种称为”饿汉式“的单例模式的实现:

 

 

 

 

 


  
  1. class A
  2. {
  3. public:
  4. static A& getInstance();
  5. setup(){...};
  6. private:
  7. A();
  8. A(const A & rhs);
  9. static A a;
  10. }

 



这里把class A的构造函数都设置为私有,不允许用户代码创建对象。要获取对象实例需要通过接口getInstance。”饿汉式“缺点在于无论有没有代码需要a,a都被创建出来。下面是改进的单例模式,称为”懒汉式“

 

 

 

 


  
  1. class A
  2. {
  3. public:
  4. static A& getInstance();
  5. etup(){....};
  6. private:
  7. A();
  8. A(const A& rsh);
  9. ...
  10. };
  11. A& A::getInstance()
  12. {
  13. static A a; // ☆
  14. return a;
  15. }

 

 

"懒汉式"只有在真正需要a时,调用getInstance才创建出唯一实例。这可以看成一个具有拖延症的单例模式,不到最后关头不干活。很多设计都体现了这种拖延的思想,比如string的写时复制,真正需要的时候才分配内存给string对象管理的字符串。

 

 

 

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/51794475

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。