ICode9

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

static

2021-06-19 13:57:26  阅读:191  来源: 互联网

标签:Apple 静态 int static 类中 变量



title: static
date: 2021-06-19 13:34:49
tags: [C++]


static

静态变量: 函数中的变量,类中的变量。

静态类的成员: 类对象和类中的函数。

静态变量

函数中的静态变量

当变量声明为 static 时,空间将在程序的生命周期内分配。即使多次调用该变量,静态变量的空间也只分配一次,前一次调用中的变量值通过下一次函数调用传递。这对于在 C/C ++ 需要存储先前函数状态的任何其他应用程序非常有用。

#include <iostream> 
#include <string> 
using namespace std; 
void demo() 
{ 
	// static variable 
	static int count = 0; 
	cout << count << " "; 
	// value is updated and 
	// will be carried to next 
	// function calls 
	count++; 
} 
int main() 
{ 
	for (int i=0; i<5; i++)	 
		demo(); 
	return 0; 
} 

输出:

0 1 2 3 4 

在上面的程序中看到变量 count 被声明为 static。因此,它的值通过函数调用来传递。不会对 static 变量进行重复的初始化

类中的静态变量

由于声明为 static 的变量只被初始化一次,因为它们在单独的静态存储中分配了空间,因此**类中的静态变量被对象共享。**对于不同的对象,不能有相同静态变量的多个副本。也是因为这个原因,静态变量不能使用构造函数初始化

#include<iostream> 
using namespace std; 

class Apple 
{ 
public: 
	static int i; 
	
	Apple() 
	{ 
		// Do nothing 
	}; 
}; 

int main() 
{ 
Apple obj1; 
Apple obj2; 
obj1.i =2; 
obj2.i = 3; 
	
// prints value of i 
cout << obj1.i<<" "<<obj2.i; 
} 

在上面的程序中看到我们已经尝试为多个对象创建静态变量 i 的多个副本。但这并没有发生。因此,类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化,如下所示:

#include<iostream> 
using namespace std; 

class Apple 
{ 
public: 
	static int i; 
	
	Apple() 
	{ 
		// Do nothing 
	}; 
}; 

int Apple::i = 1; 

int main() 
{ 
	Apple obj; 
	// prints value of i 
	cout << obj.i; 
} 

输出:

1

小结

  1. 类中的静态变量被对象共享。
  2. 类中的静态变量不能使用构造函数初始化
  3. 类中的静态变量在类中定义,在类外进行初始化。

静态成员

静态类对象

就像变量一样,对象也在声明为 static 时具有范围,直到程序的生命周期。

考虑以下程序,其中对象是非静态的。

#include<iostream> 
using namespace std; 

class Apple 
{ 
	int i; 
	public: 
		Apple() 
		{ 
			i = 0; 
			cout << "Inside Constructor\n"; 
		} 
		~Apple() 
		{ 
			cout << "Inside Destructor\n"; 
		} 
}; 

int main() 
{ 
	int x = 0; 
	if (x==0) 
	{ 
		Apple obj; 
	} 
	cout << "End of main\n"; 
} 

输出:

Inside Constructor
Inside Destructor
End of main

在上面的程序中,对象在 if 块内声明为非静态。因此,变量的范围仅在 if 块内。因此,当创建对象时,将调用构造函数,并且在 if 块的控制权越过析构函数的同时调用,因为对象的范围仅在声明它的 if 块内。 如果我们将对象声明为静态,现在让我们看看输出的变化。

#include<iostream> 
using namespace std; 

class Apple 
{ 
	int i; 
	public: 
		Apple() 
		{ 
			i = 0; 
			cout << "Inside Constructor\n"; 
		} 
		~Apple() 
		{ 
			cout << "Inside Destructor\n"; 
		} 
}; 

int main() 
{ 
	int x = 0; 
	if (x==0) 
	{ 
		static Apple obj; 
	} 
	cout << "End of main\n"; 
} 

输出:

Inside Constructor
End of main
Inside Destructor

您可以清楚地看到输出的变化。现在,在 main 结束后调用析构函数。这是因为静态对象的范围是贯穿程序的生命周期

类中的静态函数

就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。我们被允许使用对象和 ‘.’ 来调用静态成员函数。但建议使用类名和范围解析运算符调用静态成员。

允许静态成员函数仅访问静态数据成员和其他静态成员函数,但静态成员函数无法访问类的非静态数据成员和成员函数

#include<iostream> 
using namespace std; 
class Apple 
{ 
    public: 
        // static member function 
        static void printMsg() 
        {
            cout<<"Welcome to Apple!"; 
        }
}; 

// main function 
int main() 
{ 
    // invoking a static member function 
    Apple::printMsg(); 
} 

输出:

Welcome to Apple!

PDF:链接 密码:8g6b

标签:Apple,静态,int,static,类中,变量
来源: https://blog.csdn.net/weixin_43203889/article/details/118052966

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

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

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

ICode9版权所有