c++:静态成员变量声明与定义需要注意的问题,及文件位置

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值