c++中,宣告一个类的时候,这个类的静态资料成员,必须是私有的吗?
c++中,宣告一个类的时候,这个类的静态资料成员,必须是私有的吗?
不是必须的。可以是public的。静态资料成员是属于这个类的。
如果定义为公有可以在类外面这样A::a访问,如果是私有则只能由成员函式访问。
参考如下:
:yesky./20010828/194000.s
c++ 类的静态资料成员在记忆体的哪个位置
资料段
位置和全域性变数一样
在C++中类的静态成员变数必须在类外再宣告一次吗?
类的定义其实就像是你画一个表格模板(像word里面的快速建表格那个模板一样,在程式开始是看不到,是一个抽像的东西),以后呼叫到的时候你向计算机请求得到这个表格,并往表格里面填入资料(即初使化),所以类中的静态成员的初使化必须在类外(不然的话那个表格里面的东西都固定了,有何用处)
为什么类的静态资料成员定义在任何函式之外
比如定义一个苹果,所有java教程中都会出现的例子。
定义的是抽象的苹果,例项化后才是具体的某一个苹果,但是如果某些属性是不属于任何具体化苹果的,比如例项化苹果数量,某一种类苹果的价格---是属于苹果这个类的属性,这样的属性就需要用静态变数储存。当然实际也不是完全这样,不知道能不能帮助你理解?
非静态函式是属于例项化物件的,没有例项化之前,不能使用的。因为他们是具体物件的动作。当然也可以定义静态函式,这个是类的动作。
基类的静态变数如何被派生类呼叫, 有几种方式呼叫基类的静态资料成员.
以下说明成立的前提是该基类的静态变数为protected或者public的访问许可权
如果派生类没有与其重名的成员,可以直接使用变数名
如果派生类有成员与其重名,则可以用“基类名::静态成员”来呼叫
这个其实和普通成员的支配与覆盖规则一致
若AA为一个类,a为该类的非静态资料成员,在该类的一个成员函式定义中访问a时,其书写格式能不能为:AA.a
你的AA是指类名么
那是不行的
AA.a 点号这个运算子左边应该是结构体或者类物件
直接用a好了
定义一个Cat类,拥有静态资料成员numofcats,记录Cat的个体数目;静态成员函式getnumofcats(),读取numofcat。
#include <iostream>
#include <string>
using namespace std;
class Cat
{
public:
Cat(){++numOfCats;}
Cat(const Cat& cat){++numOfCats;}
virtual ~Cat(){--numOfCats;}
static int getNumOfCats(){return numOfCats;}
private:
static int numOfCats;
};
int Cat::numOfCats=0;
int main()
{
Cat a;
Cat b;
cout<<"numOfCats:"<<Cat::getNumOfCats()<<endl;
Cat c(a);
Cat* p=new Cat();
cout<<"numOfCats:"<<Cat::getNumOfCats()<<endl;
delete p;
cout<<"numOfCats:"<<Cat::getNumOfCats()<<endl;
return 0;
}
解释静态资料成员的必性,如何定义?如何分配空间?
class Foo
{
public:
static int a;
stataic void func();
}
静态资料成员和函式都是在宣告前加static
静态成员必须要在类外初始化,无法在建构函式内初始化。新标准的C++也允许在生命静态资料成员的是后直接加等于号进行初始化,但是大部分编译器不支援。所以最保险的办法就是在类定义的外面再写:
int Foo::a = 0;
注意,这时候不需要再static了。
函式则很普通成员函式的宣告以及实现没区别,唯一要注意的是,静态函式是没有this指标的,因此不能访问任何非静态的其他成员函式或成员变数,如果要访问需要传递this指标进去,比如
class Foo
{
public:
int a;
static void func(Foo* ptrFoo)
{
a = 0; 错误!a不是静态变数,无法访问!
ptrFoo->a= 0; 正确。
}
void test()
{
非静态成员函式呼叫静态成员函式可以传递this指标,让静态成员函式通过他来访问
其他成员函式和成员变数。
Foo::func(this);
}
}
c++大神请问下,类的静态常资料成员需要在类外再定义,类的常资料成员需要吗?
类中的常资料成员只能通过建构函式的引数初始化表进行初始化。不能在外定义
不允许 dllimport 静态资料成员 的定义,该怎么解决
首先,你在需要汇出函式的专案属性中定义 KEYBOARD_EXPORTS,在使用dll的专案中不定义。
在标头档案中这样写
#ifdef KEYBOARD_EXPORTS
#define KEYBOARD_API __declspec(dllexport)
#else
#define KEYBOARD_API __declspec(dllimport)
#endif
KEYBOARD_API BOOL EnableKeyboardCapture();
KEYBOARD_API BOOL DisableKeyboardCapture();