读书人

C++中static成员函数的有关问题

发布时间: 2012-02-12 17:16:33 作者: rapoo

C++中static成员函数的问题
//using namespace std;
#include <iostream.h>
#include <stdio.h>

class T{

private:
char name[20];
int age;
int Balance;

//static int code;
public:
T(){
cout < < "the private structure can be visited " < <endl;

}
public:
static int code;
int CheckBablance() const;

int getCode(){

return code;
}


static T* visit(){
return(new T);
}
static void display(){
cout < < "the static function be visited\n ";
}


};

int T::code=2004;
//T:: int code=2004; //error

int T::CheckBablance() const
{
if((Balance==100)||(Balance <100))
cout < < "你卡上的余额已近不足,请尽快冲值! " < <endl;
return Balance;
}


void main(){

char c1;

T* vis=T::visit();
cout < < "the value of static member is " < <vis-> getCode() < <endl;
(*vis).CheckBablance();
T::display();
delete vis;

cout < < "========================================= " < <endl;

T t1;
cout < < "the value of static member is " < <t1.getCode() < <endl;
t1.CheckBablance();
printf( "*******************TO END*******************\n ");
scanf( "%c ",&c1);


}


/*问题:1, 首先通过在class T中定义了一个static成员函数生成class T的指针,即 T* vis
我们知道,只有在创建对象的时候,系统才会分内存并且调用构造函数。但是,现在在没有创建任何对象的前提下,怎么会调用class T的构造函数?


2, 命名空间using namespace std的作用是什么?
为什么加上这句话后总是出错?
error C2871: 'std ' : does not exist or is not a namespace


Thanks for your help!

*/


[解决办法]
静态成员函数是编译时就构造了,他不属于对象,而是属于类的,所以不随创建对象而创建,就想全局变量和景泰变量类似,编译时就构造了
命名空间是为了避免重复使用标识符 如果你要是USING NAMESPACE STD不报错 可以用C++的头文件 INCLUDE <IOSTREAM> 不要加.H 因为那是C语言格式的 在C语言中没用到STD 所以你要是用C格式的头文件加上STD声明当然就错了

[解决办法]
要么用C++用法
#include <iostream>
using namespace std;
要么就用C语言用法
#include <iostream.h>


不可以混用的。

楼上已经把另一个问题说得很清楚了。静态成员变量与静态成员函数是不属于对象的,它在程序编译时就已经构造,因此在没有建立任何对象的情况下也可以直接用“类名::函数名(变量名)”就可以正确访问。
[解决办法]
iostream.h的形式是C++98之前的库头文件名,是C库的文件名,那时候还没有加入名字空间(namespace)的概念。如LZ用DEV C++编译的话没有问题。

另外一个问题上面也已经解决了


[解决办法]
1,new T 这里就在堆上分配内存,并且调用T的构造函数生成对象.
2. iostream.h是c标准库里头的文件,这里的代码是全局的.而iostream是C++标准库的,这里的代码放在命名空间std中.

读书人网 >C++

热点推荐