栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 静态成员和方法(分文件来实现static成员变量和方法有几个注意的地方c++ 11)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 静态成员和方法(分文件来实现static成员变量和方法有几个注意的地方c++ 11)

static 成员变量是作用于整个类的,存储区是静态区,并不占用类的大小。
class AA
{
public:
	AA(int a, int b)
	{
		m_a = a;
		m_b = b;
	}
	int getC()
	{
		m_c++;
		return m_c;
	}
	//静态的成员方法
	static int& getCC()
	{
		return m_c;
	}
private:
	//static修饰的静态成员变量
	static int m_c;
	int m_a;
	int m_b;
};

//静态成员变量的初始化,一定类的外边。
int AA::m_c = 100;

int main(void)
{
	AA a1(10, 20);
	AA a2(100, 200);

	cout << a1.getC() << endl;//101
	cout << a2.getC() << endl;//102

	//a1.getCC() = 200;
	AA::getCC() = 200;

	cout << a1.getC() << endl;//201
	cout << a2.getC() << endl;//202

	return 0;
}

如果static成员变量是私有变量那么将不能通过类名::变量名访问(int AA::m_c = 100;),只能通过静态方法来间接访问。静态成员的初始化不能在类中初始化,一定要在类外初始化。

静态成员方法只能访问类的静态成员,不能访问类的其他非静态成员。

分文件来实现static成员变量和方法有几个注意的地方(c++ 11)

.h文件代码片段

class Ch32Socket {

private:

    int socket_;
    struct sockaddr_in sockAddr_;
public:
    static float sinAngles_[];
    static float cosAngles_[];
    static float sinTheta0_[] ;
    static float sinTheta1_[] ;
    static void  initAngle(void);
    Ch32Socket();
    Ch32Socket(int port,std::string ipAddr);
    ~Ch32Socket();
};

.cpp文件代码片段

#include "ch32_socket.h"
float Ch32Socket::sinAngles_[3700] ={0};
float Ch32Socket::cosAngles_[3700] ={0};
float Ch32Socket::sinTheta0_[32] ={0};
float Ch32Socket::sinTheta1_[32] ={0};
void  Ch32Socket::initAngle(void){
    for (int i = 0; i < 37000; i++)
    {
        sinAngles_[i] = sin(i * CV_PI / 18000);
        cosAngles_[i] = cos(i * CV_PI / 18000);
    }
    for (int i = 0; i < 32; i++)
    {
        float theta0 = -6.67 + (int(i / 4)) * 1.33;
        float theta1 = (i % 4) * 0.33;
        sinTheta0_[i] = sin(theta0 * CV_PI / 180);
        sinTheta1_[i] = sin(theta1 * CV_PI / 180);
    }

}

需要在.h文件中 声明

static float sinAngles_[];

然后在.cpp文件中初始化

float Ch32Socket::sinAngles_[3700] ={0};后.cpp中的static静态方法才能使用。

以下借鉴:C++ Static Member Variable Initialization 静态成员变量初始化 - Roger Luo - 博客园

对于STL容器静态变量,初始化方法比较复杂,需要借助一个静态构造函数,通过拷贝构造函数来实现初始化

simple.h定义为:

#include 
using namespace std;
typedef map INT2INT;
class Simple
{
public:
    Simple(void);
    ~Simple(void);
    static bool Find(int key);
private:
    static INT2INT CreateMap(void);
    static INT2INT _i;
};

simple.cpp定义为:

bool Simple::Find(int key)
{
    INT2INT::iterator it = _i.find(key);
    if (it == _i.end())
        return false;
    return true;
}

INT2INT Simple::CreateMap(void)
{
    INT2INT _tmp;
    return _tmp;
}
INT2INT Simple::_i(Simple::CreateMap());

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/628920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号