C++的static 的理解

Hello, 大家好,我是爱吃香蕉的猴子,写写C++中对static的理解


#include <iostream>
#include <string.h>

using namespace std;

/**
1、什么是static?
	   static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。

	2、为什么要引入static?
	   函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,
	   这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 
	   最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,
	   最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。

	3、什么时候用static?
	   需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

	4、static的内部机制:
	   静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
	   这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;
	   三是应用程序的main()函数前的全局数据声明和定义处。
	  静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。
	  类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。
	  它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
	  static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,
	  注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。

	5、static的优势:
	   可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。
	   静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,
	   这样可以提高时间效率。
**/

class Person {
private:
	static int cnt;
	char* name;
	int age;
	char* work;

public:

	static int getCount(void);

	Person() {//cout <<"Pserson()"<<endl;
		name = NULL;
		work = NULL;
		cnt++;
	}
	Person(char* name)
	{
		//cout <<"Pserson(char *)"<<endl;
		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);
		this->work = NULL;
		cnt++;
	}

	Person(char* name, int age, const char* work = "none")
	{
		cout << "Pserson(char*, int), name = " << name << ", age= " << age << endl;
		this->age = age;

		this->name = new char[strlen(name) + 1];
		strcpy(this->name, name);

		this->work = new char[strlen(work) + 1];
		strcpy(this->work, work);
		cnt++;
	}

	Person(Person& per)
	{
		cout << "Pserson(Person &)" << endl;
		this->age = per.age;

		this->name = new char[strlen(per.name) + 1];
		strcpy(this->name, per.name);

		this->work = new char[strlen(per.work) + 1];
		strcpy(this->work, per.work);
		cnt++;
	}

	~Person()
	{
		cout << "~Person()" << endl;
		if (this->name) {
			cout << "name = " << name << endl;
			delete this->name;
		}
		if (this->work) {
			cout << "work = " << work << endl;
			delete this->work;
		}
	}

	void setName(char* n)
	{
		name = n;
	}
	int setAge(int a)
	{
		if (a < 0 || a > 150)
		{
			age = 0;
			return -1;
		}
		age = a;
		return 0;
	}
	void printInfo(void)
	{
		//printf("name = %s, age = %d, work = %s\n", name, age, work); 
		cout << "name = " << name << ", age = " << age << ", work = " << work << endl;
	}
};

int Person::cnt = 0; /* 定义和初始化 */

int Person::getCount(void)
{
	return cnt;
}


int main(int argc, char** argv)
{
	Person p[100];
	cout << "person number = " << Person::getCount() << endl;
	cout << "person number = " << p[0].getCount() << endl;
	cout << "person number = " << p[1].getCount() << endl;

	return 0;
}



                                        Code的搬运工V1.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值