C++

比较完整详细

【C++基础学习】关于C++静态成员函数和变量

代码一:

class Point{
public:
void output()
{
}
static void init()
{
}
};
int main()
{
Point pt;
pt.init();
pt.output();
}class Point{
public:
void output()
{
}
static void init()
{
}
};
int main()
{
Point::init();
Point::output();//报错
}:


两个代码编译运行,代码一成功,代码二报错。错误信息:

test1.cpp(16) : errorC2352: “Point::output”: 非静态成员函数的非法调用。

错误信息提示:非法调用非静态成员函数Point::output。但为什么init函数的调用没有错呢?该函数是一个静态函数。静态成员函数和静态成员变量属于类本身,在类加载的时候,即为他们分配了空间,所以可以通过类名::函数名或类名:变量名来访问。而非静态成员函数和非静态成员变量属于对象的方法和数据,也就是应该首先产生类的对象,然后通过类的对象去引用。


代码三:

#include <iostream>
using namespace std;


class Point{
public:
void output()
{
}
static void init()
{
x = 0;
y = 0;
}
private:
int x,y;
};
int main()
{
Point::init();
//Point::output();//报错
}

1>e:\学习\程序练习\test1\test1\test1.cpp(11): error C2597: 对非静态成员“Point::x”的非法引用

1>e:\学习\程序练习\test1\test1\test1.cpp(12): error C2597: 对非静态成员“Point::y”的非法引用

在静态成员函数中非法引用Point对象的x和y数据成员。因为init是静态函数,不属于某个具体的对象,也就是说在还没有产生Point类的任一个具体的对象时,该函数就已经存在于程序的代码区了。但是,Point类的数据成员x和y还没有分配内存空间,这样,在init函数中对他们进行赋值操作会失败。也就是说,在静态成员函数中不能调用非静态成员,包括非静态成员函数和非静态成员变量。静态成员函数只能访问静态成员变量。

如果把上述代码中对x、y的赋值操作放在非静态函数中,就会成功。

但是,在非静态成员函数中可以调用静态成员函数。


我们可以在上述代码中,将Point类的数据成员x和y的定义之前加上static限定符,使他们成为静态成员变量。

staticintx,y;

编译运行,程序报错。错误信息:

1>test1.obj: error LNK2001: 无法解析的外部符号"private:static int Point::y" (?y@Point@@0HA)

1>test1.obj: error LNK2001: 无法解析的外部符号"private:static int Point::x" (?x@Point@@0HA)

这是链接时发生的错误。出错的原因是对于静态成员变量,必须对他们进行初始化,并且应在类的定义之外进行此操作。我们在Point类的定义之外,加上如下两条初始化语句:

intPoint::x = 0;
intPoint::y = 0;

则运行成功。

http://www.cnblogs.com/xiajun/archive/2011/10/10/2298645.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值