c++:静态成员变量声明与定义需要注意的问题
c++类的静态成员(多文件举例)
==========================
c++:静态成员变量声明与定义需要注意的问题
一:静态成员变量声明
在类中将一个变量声明为static时不可以进行初始化,此时静态成员变量要放在类外进行初始化操作。
但是如果声明的为static const T则可以进行初始化
class A
{
static int a;
static int b=0;//error
static const int c=0;//true
};
二:静态成员变量的定义
如果你使用xxx.h来定义一个类,然后使用xxx.cc来实现一个类中的方法,然后再yyy.cc中引用xxx.h文件,那么如果你在xxx.h的类中声明了一个静态 成员变量**(该成员变量是一个指针或者隐含指针),那么你应该将这个静态成员变量的初始化(定义)放在xxx.cc文件中,否则就可以出现double free的问题。
下面是一个例子:
config.h文件
在这里如果我将**最后一行configs_**放在config.h(当前文件中),那么我在使用时就出现了double free错误(排查了好久,差点爆炸),但是当我将最后一行放在config.cc文件中进行定义,那么问题将得到解决。
————————————————
版权声明:本文为CSDN博主「大头哇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40531074/article/details/121758722
类内静态成员变量的定义和声明
https://blog.csdn.net/SavenNeer/article/details/114021879
c++类的静态成员(多文件举例)
https://blog.csdn.net/lyricsSZ/article/details/116922723
声明的位置:client.h
//有static
static void ChangeServerName(char name);//改变服务器名称
//client.h
#pragma once
#ifndef CLIENT_H
#define CLIENT_H
class CLIENT
{
public:
CLIENT();
~CLIENT();
static void ChangeServerName(char name);//改变服务器名称
static void ShowNum();//输出客户个数
static void ShowServerName();//输出服务器名
private:
static int ClientNum; //客户数量
static char ServerName; //服务器名
};
#endif
定义的位置:client.cpp
//无static
void CLIENT::ChangeServerName(char name)
//client.cpp
#include"client.h"
#include<iostream>
using namespace std;
int CLIENT::ClientNum = 0; //静态数据成员初始化,类外定义
char CLIENT::ServerName = 'A';//静态数据成员初始化,类外定义
CLIENT::CLIENT() { ClientNum++; }
CLIENT::~CLIENT() { ClientNum--; }
//静态成员函数
void CLIENT::ChangeServerName(char name)
{
//这里需要注意 this->ServerName = name是不行的,原因可能是
//静态成员函数不需要this指针
ServerName = name;
}
void CLIENT::ShowNum()
{
cout << "客户的数量为:" << ClientNum << endl;
}
void CLIENT::ShowServerName()
{
cout << "服务器名为:" << ServerName << endl;
}
调用的位置:text.cpp
//类作用域
CLIENT::ShowServerName();//同上
//text.cpp
#include<iostream>
#include"client.h"
using namespace std;
int main()
{
CLIENT::ShowNum();//未创建对象,先试试能不能输出客户个数
CLIENT::ShowServerName();//同上
CLIENT A;//创建对象
A.ChangeServerName('A');//修改服务器名
//输出
A.ShowNum();
A.ShowServerName();
//以下同理
CLIENT B;
B.ChangeServerName('B');
B.ShowNum();
B.ShowServerName();
return 0;
}