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

网友投稿 589 2022-05-30

转自:melonstreet

static与类

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

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

② static成员函数没有this指针

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

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

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

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

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

class A

{

private:

static int a; //①

}

int A::a = 10; //②

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

④static与类的一些小应用

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

class A

{

public:

static A& getInstance();

setup(){...};

private:

A();

A(const A & rhs);

static A a;

}

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

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

class A

{

public:

static A& getInstance();

etup(){....};

private:

A();

A(const A& rsh);

...

};

A& A::getInstance()

{

static A a; // ☆

return a;

}

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

C++

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:混合云的概念以及优势劣势简单介绍
下一篇:Redis 企业应用场景
相关文章