对象的使用(1)

1)static成员

2)static成员函数

3)类/对象大小计算

1)static成员

对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。

如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。

非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。

//#pragma once
#ifndef _COUNTED_OBJECT_H_
#define _COUNTED_OBJECT_H_

class CountedObject
{
public:
	CountedObject(void);
	~CountedObject(void);

	static int count_;  //静态成员的引用性声明
	//static int count_ = 100;error,成员变量的初始化不能在类声明时给出,不管是静态的还是动态的。

};

#endif // !_COUNTED_OBJECT_H_

#include "CountedObject.h"

int  CountedObject::count_  = 0; //静态成员的定义性声明

CountedObject::CountedObject()
{
	++count_;
}


CountedObject::~CountedObject()
{
	--count_;
}

#include "CountedObject.h"
#include <iostream>

using namespace std;

int main(void)
{
	cout << CountedObject::count_ << endl;
	CountedObject co1;
	cout << CountedObject::count_ << endl;

	CountedObject* co2 = new CountedObject;
	cout << CountedObject::count_ << endl;
	delete co2;
	cout << CountedObject::count_ << endl;

	return 0;
}

static成员优点

        static成员的名字是在类的作用域中,因此可以避免与其它类成员或全局对象名字冲突。

        可以实施封装,static成员可以是私有的,而全局对象不可以。

        阅读程序容易看出static成员与某个类相关联,这种可见性可以清晰地反映程序员地意图。

        static成员地定义:static成员需要在类定义体外进行初始化与定义。

        特殊的整型static const成员:整型static const 成员可以在类定义体中初始化,但仍然需在类定义体外进行定义。

#include <iostream>
using namespace std;
/*这里为了说明问题方便,将类定义在同一个文件中*/
class Test
{
public:
	Test()
	{
	
	}
	~Test()
	{
	
	}

	static const int x_ = 100;  //静态成员的引用性说明,只有static const int/char 才允许在声明时初始化,也可以在类外定义中初始化。
};

const int Test::x_;				//静态成员的定义性说明

int main(void)
{
	cout << Test::x_ << endl;
}

2)static成员函数

static 成员函数没有this指针。

非静态成员函数可以访问静态成员。

静态成员函数不可以访问非静态成员

#include <iostream>
using namespace std;
/*这里为了说明问题方便,将类定义在同一个文件中*/
class Test
{
public:
	Test()
	{

	}
	~Test()
	{

	}
	static void TestStaticFun()
	{
		//cout << "y = " << y_ << endl; error,静态成员函数不能访问非静态成员,静态成员函数没有this指针,不能访问非静态成员。
		//TestFun(); Error,静态成员函数不能调用非静态成员函数
	}
	void TestFun()
	{
		cout << "x_ = " << x_ << endl; //OK,非静态成员函数可以访问静态成员

	}

	static int x_;  //静态成员的引用性说明
	int y_;
};

int Test::x_ = 100;				//静态成员的定义性说明

int main(void)
{
	Test t;
	cout << Test::x_ << endl;
	t.TestFun();
	cout << t.x_ << endl; //静态成员允许用对象.的方式,不推荐这种方式。


}

3)类/对象大小计算

类大小计算遵循前面学过的结构体对齐原则。

类的大小与数据成员有关与成员函数无关。

类的大小与静态数据成员无关。

虚函数对类的大小的影响。

虚继承对类的大小的影响。

#include <iostream>
using namespace std;
/*这里为了说明问题方便,将类定义在同一个文件中*/
class Test
{
public:
	Test()
	{

	}
	~Test()
	{

	}
	static void TestStaticFun()
	{
		//cout << "y = " << y_ << endl; error,静态成员函数不能访问非静态成员,静态成员函数没有this指针,不能访问非静态成员。
		//TestFun(); Error,静态成员函数不能调用非静态成员函数
	}
	void TestFun()
	{
		cout << "x_ = " << x_ << endl; //OK,非静态成员函数可以访问静态成员

	}

	static int x_;  //静态成员的引用性说明
	int y_;
};

int Test::x_ = 100;				//静态成员的定义性说明

int main(void)
{
	cout << sizeof(Test) << endl;

}

/*
输出:
	4
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值