❥关于C++之类的静态成员变量&静态成员函数

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❥关于C++之类的静态成员变量&静态成员函数相关的知识,希望对你有一定的参考价值。

// strngbad.h
#include <iostream>
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad 
private:
	char* str;
	int len;
	static int num_strings;
public:
	StringBad(const char* s);
	StringBad();// default constructor
	~StringBad();
	friend std::ostream& operator<<(std::ostream& os, const StringBad& st);
;
#endif
// strngbad.cpp
#include <cstring>
#include "strngbad.h"
using std::cout;
// initializing static class member
int StringBad::num_strings = 0;
// construct StringBad from C string
StringBad::StringBad(const char* s) 
	len = std::strlen(s);
	str = new char[len + 1];          // allot storage
	std::strcpy(str, s);              // 不能 str = s,程序解读里有解释!!!
	num_strings++;
	cout << num_strings << ": \\"" << str << "\\" object created\\n";

StringBad::StringBad()             // default constructor
	len = 4;
	str = new char[4];
	std::strcpy(str, "C++");          // default string
	num_strings++;
	cout << num_strings << ": \\"" << str << "\\" default object created\\n";  // FYI

StringBad::~StringBad()           // 必要的析构器!!!
	cout << "\\"" << str << "\\" object deleted, "; // FYI
	--num_strings;                 // 必要!
	cout << num_strings << " left\\n"; // FYI
	delete[] str;                  // 必要!

std::ostream& operator<<(std::ostream& os, const StringBad& st) 
	os << st.str;
	return os;

注意到,num_string是private的,它被声明为static的,存在于程序的整个周期。

在C++中,内存分成5个区,其中[全局/静态存储区]:全局变量和静态变量被分配到同一块内存中。

为什么为不能在类中立即初始化静态成员变量呢?(比如:static int num_strings = 123; )

IDE提示:非常量静态数据成员的初始化必须不一致。 

如果是:const static int num_strings = 123; 则正常通过!省略到static,效果一样。

程序运行时类不分配空间,所有类只用声明不用初始化。

请注意,声明描述了如何分配内存,但并不分配内存。对于静态类成员,可以在类声明之外使用单独的语句来进行初始化,这是因为静态类成员是单独存储的,而不是对象的组成部分

对于一个类内static变量,它与具体的对象是无关的,因此它的初始化也与具体对象的初始化无关,得在类外进行定义以明确这个变量在什么时候初始化。


为什么对私有static变量,却可在外访问它并赋值呢?(比如:int StringBad::num_strings = 0;)

是不是私有静态变量的访问权限就跟public一样了呢?当然不是!

私有静态变量有且仅在初始化时,才可以在外部访问! 

只能在外部对私有静态变量进行一次初始化,这时是可以直接访问这个私有域变量的,但除了[初始化]操作外,不得访问/修改它,因为它是私有的! 


有2种情况可以在类声明中初始化静态数据成员:

只有静态const整型数据成员才可以立即初始化。

1. 静态数据成员为整型const;

2. 枚举型const。

注:类的const成员默认都是有static关键字的,故可省略(当然,写上static效果也一样)。

静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中直接初始化。 


静态成员函数:

首先,不能通过对象调用静态成员函数;实际上,静态成员函数甚至不能使用this指针。如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。

static int HowMany()  return num_strings; // public:
调用它的方式如下:
int count = String::HowMany(); // 调用一个静态成员函数

其次,由于静态成员函数不与特定的对象相关联,因此只能使用静态数据成员。例如,静态方法HowMany()可以访问静态成员num_string,但不能访问str和len。这点与JAVA是一样的。

以上是关于❥关于C++之类的静态成员变量&静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 静态成员函数

C++ 静态成员函数

C++ 静态成员函数

C++ static 静态变量&静态成员函数

关于c++中的静态成员变量

C++学习笔记.关键字static&静态成员变量