前言

这里简单记录一下C++静态成员变量静态成员函数,主要是涉及一些相关知识和初始化内容。

记录于此,方便自己查阅。

正文

类成员包括两类:

  1. 成员变量表示类的属性,可以是整型浮点型字符型数组指针引用等,也可以是对象。

  2. 成员函数表示类的行为。

在类的成员变量或函数上添加关键字static,那就是成为了静态成员变量静态成员函数

静态成员变量

静态类成员是在类成员定义前使用static关键字

class BiuMall {
public:
    static int age;
};

//静态变量初始化
int BiuMall::age = 10;

我这个C++版本不支持类内部初始化,下面注意事项有相关介绍。

静态类成员不仅属于类的对象,也属于类。因此,可以通过如下几种方式访问静态类成员变量。

int main()
{
    std::cout << BiuMall::age << std::endl;
    
    BiuMall::age++; //+1
    
    BiuMall biumall;
    std::cout << biumall.age << std::endl;
    
    BiuMall::age++; //+1

    BiuMall* biumallP = &biumall;
    std::cout << biumallP->age << std::endl;
}

输出结果:

10 
11
12
小结
  1. 一个类中,静态成员变量被所有的类对象共享,即无论定义多少个类对象,静态成员变量都只有一个。

  2. 如果静态成员变量被修改,则所有对象的静态成员变量都将发生改变。

注意

对于静态成员变量,下面几点需要注意。

  1. 静态类成员变量可以是当前类的对象,非静态类成员只能是当前类的指针

    class BiuMall {
    public:
         static int age ;    //静态变量
         //BiuMall biumall; // 错误, 不允许使用不完整的类型
         BiuMall* biumallP; //正确  //指针对象
         static BiuMall biuamallStatic; //正确  静态类对象
    };
  2. 静态成员变量可作为类成员函数的默认参数,普通成员变量则不允许作为成员函数的默认参数。

    class BiuMall {
    public:
         static int age_static ;    //静态变量
         int addOne(int age = age_static) {
             return age+1;
         }
         static int addTwo(int age = age_static) {
             return age + 2;
         }
    
         int age_no_static;
         //int subOne(int age = age_no_static) { // 提示:非静态成员引用必须与特定对象相对
         // return age - 1;
         //}
    };

    使用

    int main()
    {
        BiuMall biumall;
        std::cout << biumall.addOne() << std::endl;
    }
错误

注意,静态成员变量需要初始化,要不然使用就有异常。

错误1
//错误1
class BiuMall {
public:
    //static int age = 5; // 提示 :带有类内初始值设定项的成员必须为常量。
};

从C++17开始支持static变量在类内部初始化。

错误2
//错误2
class BiuMall {
public:
    static int age;
};

int main()
{
    std::cout << BiuMall::age << std::endl; 
}

没有提示,但编译无法通过

无法解析的外部符号 "public: static int BiuMall::age" (?age@BiuMall@@2HA)

这是因为没有给静态类成员变量没有初始化。

  1. 静态类成员变量不会自动初始为0,需要主动初始化

  2. 局部变量未初始化,默认值未知(VS会提示需要初始化)

  3. 全局变量(包括static修饰)默认会初始化为0

下面是正确的代码:

class BiuMall {
public:
	 static int age ;
};

//初始化
int BiuMall::age = 10;

int main()
{
	std::cout << BiuMall::age << std::endl;
}

静态成员函数

在成员函数前添加static关键字,即可为类定义一个静态成员函数。

注意事项:

  1. 静态成员函数只能访问静态成员变量,不能访问普通成员变量。

    class BiuMall {
    public:
    	 static int age_static ;    //静态变量
    	 int age;
    	// 错误,非静态成员引用必须与特定对象相对
    	// static int getAge() {
    	//	 return age; 
    	// }
    	
    	// 正确
    	 static int getAge() {
    		 return age_static;
    	 }
    };
    
    //初始化静态变量
    int BiuMall::age_static = 10;

  2. 静态成员函数不能定义为const类型,即静态成员函数末尾不能使用const关键字。

    class BiuMall {
    public:
    	 static int age_static ; 
    
    	// 静态成员函数上不允许使用类型限定符
    	// static int getAge() const { 
    	//	 return age_static;
    	// }
    };
    
    //初始化静态变量
    int BiuMall::age_static = 10;
  3. 定义静态成员函数时,如果函数实现代码在类体外,则不能使用static关键字。

    class BiuMall {
    public:
    	 static int age_static ;  
    	 static int getAge();
    };
    
    //初始化静态变量
    int BiuMall::age_static = 10;
    
    //错误,此处不能指定存储类
    //static int BiuMall::getAge() {
    //	return age_static;
    //}
    
    //正确
    int BiuMall::getAge() {
    	return age_static;
    }

参考文章

  1. 《C++从入门到精通(第6版)》

  2. 类中定义static变量后,visual studio编译时提示LNK2001“无法解析的外部符号”

相关文章

暂无评论

none
暂无评论...