`
tjmzgn
  • 浏览: 156359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ 类中的静态变量和静态成员函数

    博客分类:
  • C++
阅读更多
静态数据成员:
下面看一个例子:
#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++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...

    吕鑫:【C++语法与数据结构第06天】【第3堂课】静态成员变量与静态成员函数(面试题)

    1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;

    C++ 中静态成员函数与非静态成员函数的区别

    静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针-&gt;调用,调用时编译器会向函数传递this指针;静态成员函数则有类名::或者对象名.调用,编译器不向函数传递this指针,不识别对象个体,...

    c++类中的静态成员和非静态成员

    首先呢我们知道c++类中的成员分为成员变量和成员函数两大类,如果再加上static给以区分的话那么会有以下四种:静态成员变量,非静态成员变量;静态成员函数,非静态成员函数  (1)成员变量  我们知道类的静态成员...

    C++静态成员变量和静态成员函数的使用方法总结

    下面小编就为大家带来一篇C++静态成员变量和静态成员函数的使用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    C++中静态成员函数访问非静态成员的实例

    C++中静态成员函数访问非静态成员的实例 实现代码: #include /* 静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可...

    C++静态成员函数不能调用非静态成员变量(详解)

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为...先在静态成员函数中调用静态成员变量: #include using namespace std; class vpoet { public: static int a; int b; public: vpo

    c++静态局部变量和静态函数示例

    静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。该变量在全局数据区内分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行...

    静态成员变量和函数程序

    静态成员变量和函数程序

    关于C++静态成员函数访问非静态成员变量的问题

    原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非...

    C++ 类的静态成员深入解析

    在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻...

    C++之类的静态变量

    类的静态成员 静态成员变量 存储在 全局数据区 #include class Test { private: ///静态成员变量访问权限 static int c1; public: static int GetC1() { return c1; } static void SetC1(int i) { c1=i; } void ...

Global site tag (gtag.js) - Google Analytics