C++中,如何访问类的静态成员!

classTest{public:staticvoidfun(){cout<<"CallFun"<<endl;};staticinttCount;};intTest::t... class Test
{
public:
static void fun(){cout<<"Call Fun"<<endl;};
static int tCount;
};
int Test::tCount = 5;

int main()
{
cout<<Test.tCount<<endl; //这句可编译过去,但有警告!
Test.fun(); //这句语法错误,正确应该用::
}

我不明白为什么同是静态成员,为什么一个可以访问一个不可以访问呢?
再者,为什么用.符号就会有警告呢?是因为向下兼容吗?
展开
 我来答
dong_1984dd
推荐于2017-09-16 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1070
采纳率:100%
帮助的人:231万
展开全部
1.静态成员函数中不能调用非静态成员。
2.非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
3.静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错。
4.在类的非静态成员函数中使用类的静态成员
class Point
{
public:
void init()
{
output();
}
static void output()
{
}
};
void main()
{
Pointpt;
pt.output();
}
5.使用类的静态成员变量
#include <stdio.h>
class Point
{
public:
Point()
{
m_nPointCount++;
}
~Point()
{
m_nPointCount--;
}
static void output()
{
printf("%d\n", m_nPointCount);
}
private:
static int m_nPointCount;
};
int Point::m_nPointCount = 0;
void main()
{
Pointpt;
pt.output();
}
云创
2023-07-25 广告
要找到一家更省钱的代码静态分析服务,可以考虑以下几个方面:1. 了解自身的需求和预算:首先需要了解自己的项目对代码静态分析服务的需求,以及可承受的预算范围。这将有助于缩小选择范围,找到适合自己的服务。2. 调查市场上的竞争情况:了解市场上提... 点击进入详情页
本回答由云创提供
wangyu0831
推荐于2017-09-06 · TA获得超过540个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:401万
展开全部
cout<<Test.tCount<<endl; //这句可编译过去,但有警告!

这句不可能编译过去,静态成员和成员函数可以通过类名访问也可以通过类的实例访问,但通过类访问时必须使用域解析符::,所以你这句就是一个语法错误。

Test.fun(); //这句语法错误,正确应该用::
道理同上,要用.来访问静态成员或成员函数就必须先创建一个实例。

下面的两种方法是正确的调用方法:
1.
cout<<Test::tCount<<endl;
Test::fun();

2.
Test t;
cout<<t.tCount<<endl;
t.fun();

不过通过类名来访问静态成员或成员函数更符合静态的定义。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蚁雅可沙舟
2020-06-07 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:26%
帮助的人:921万
展开全部
1.静态成员函数中不能调用非静态成员。
2.非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
3.静态成员变量使用前必须先初始化(如int
MyClass::m_nNumber
=
0;),否则会在linker时出错。
4.在类的非静态成员函数中使用类的静态成员
class
Point
{
public:
void
init()
{
output();
}
static
void
output()
{
}
};
void
main()
{
Pointpt;
pt.output();
}
5.使用类的静态成员变量
#include
class
Point
{
public:
Point()
{
m_nPointCount++;
}
~Point()
{
m_nPointCount--;
}
static
void
output()
{
printf("%d\n",
m_nPointCount);
}
private:
static
int
m_nPointCount;
};
int
Point::m_nPointCount
=
0;
void
main()
{
Pointpt;
pt.output();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
絕望de生魚片
2008-01-07 · TA获得超过121个赞
知道答主
回答量:71
采纳率:0%
帮助的人:0
展开全部
对象用 “.” ···
这里你访问的是 静态成员 用的是 类 ,而不是通过对象来访问的,所以用 作用域解析符 “::“ !
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wenbos
2008-01-07 · TA获得超过1042个赞
知道答主
回答量:58
采纳率:0%
帮助的人:0
展开全部
你用的是类名,必须用::来限定使用,而.号是对象才用的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式