❥关于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++之类的静态成员变量&静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章