C++中类的静态数据成员函数解析
来源:互联网 发布:西班牙语翻译软件知乎 编辑:程序博客网 时间:2024/04/25 08:21
静态数据成员:
下面看一个例子:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
}
};
void main( void )
{
Point pt;
pt.init();
pt.output();
}
这样编译是不会有任何错误的。
下面这样看
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
}
};
void main( void )
{
Point::output();
}
这样编译会处错,错误信息:illegal call of non-static member function,为什么?
因为在没有实例化一个类的具体对象时,类是没有被分配内存空间的。
好的再看看下面的例子:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
}
};
void main( void )
{
Point::init();
}
这时编译就不会有错误,因为在类的定义时,它静态数据和成员函数就有了它的内存区,它不属于类的任何一个具体对象。
好的再看看下面的例子:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
x = 0;
y = 0;
}
private:
int x;
int y;
};
void main( void )
{
Point::init();
}
编译出错:
illegal reference to data member 'Point::x' in a static member function
illegal reference to data member 'Point::y' in a static member function
在一个静态成员函数里错误的引用了数据成员,
还是那个问题,静态成员(函数),不属于任何一个具体的对象,那么在类的具体对象声明之前就已经有了内存区,
而现在非静态数据成员还没有分配内存空间,那么这里调用就错误了,就好像没有声明一个变量却提前使用它一样。
也就是说在静态成员函数中不能引用非静态的成员变量。
好的再看看下面的例子:
#include <iostream.h>
class Point
{
public:
void output()
{
x = 0;
y = 0;
init();
}
static void init()
{
}
private:
int x;
int y;
};
void main( void )
{
Point::init();
}
好的,这样就不会有任何错误。这最终还是一个内存模型的问题,
任何变量在内存中有了自己的空间后,在其他地方才能被调用,否则就会出错。
好的再看看下面的例子:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
x = 0;
y = 0;
}
private:
static int x;
static int y;
};
void main( void )
{
Point::init();
}
编译:
Linking...
test.obj : error LNK2001: unresolved external symbol "private: static int Point::y" (?y@Point@@0HA)
test.obj : error LNK2001: unresolved external symbol "private: static int Point::x" (?x@Point@@0HA)
Debug/Test.exe : fatal error LNK1120: 2 unresolved externals
执行 link.exe 时出错.
可以看到编译没有错误,连接错误,这又是为什么呢?
这是因为静态的成员变量要进行初始化,可以这样:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
x = 0;
y = 0;
}
private:
static int x;
static int y;
};
int Point::x = 0;
int Point::y = 0;
void main( void )
{
Point::init();
}
在静态成员数据变量初始化之后就不会出现编译错误了。
再看看下面的代码:
#include <iostream.h>
class Point
{
public:
void output()
{
}
static void init()
{
x = 0;
y = 0;
}
private:
static int x;
static int y;
};
void main( void )
{
}
编译没有错误,为什么?
即使他们没有初始化,因为我们没有访问x,y,所以编译不会出错。
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员函数解析[转贴]
- C++中类的静态数据成员函数解析[转贴]
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员函数解析
- C++中类的静态数据成员解析
- C++类中静态成员数据和静态成员函数的自我理解
- 类的静态数据成员和静态成员函数浅析
- 类的静态数据成员和静态成员函数
- 类的静态成员函数和静态数据成员
- 类的静态成员函数和静态数据成员
- 静态成员(静态成员函数,静态数据成员)的特性
- 类中静态的方法、成员函数只能访问静态的数据成员或者静态的方法
- objective-c 类和对象中静态数据成员和静态成员函数(类方法)详解
- 【C++】类的静态数据成员
- SubVersion安装和使用系列文章之一:下载安装篇
- Acegi 的配置(1)-web.xml
- 很cool有背景的超链接效果
- 正则校验数据
- BB错误代码快速查询
- C++中类的静态数据成员函数解析
- linux中装载动态库出错的解决办法
- 开始windows CE驱动程序之旅
- BCB/Delphi中常用的VCL函数说明
- 转:LINUX系统中动态链接库的创建与使用
- 循序渐进,探寻Excel二次开发.NET源码(1)
- C++Builder中MessageBox的基本用法
- 利用Java实现串口全双工通讯
- javascript中需要应对的窗口关闭的方式有几种?