`
tjmzgn
  • 浏览: 159771 次
  • 性别: 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++中扮演着重要的角色,包括静态数据成员和静态函数成员两部分。静态成员是指在类体中使用static修饰符声明的成员,可以直接使用类名+静态成员名访问该静态成员。...

    C++静态成员变量和静态成员函数

    静态成员变量和静态成员函数都是C++中非常有用的特性,它们可以帮助我们更有效地管理和组织代码。通过合理地利用这些特性,可以显著提高程序的性能并简化代码结构。无论是实现对象计数还是执行与类相关的操作,这些...

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

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

    C++非静态成员函数完全可以作为线程函数

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

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

    // 编译错误:在静态成员函数中引用了类的非静态成员nonStaticVar std::cout ; } }; int MyClass::staticVar = 0; ``` 在这个例子中,`staticFunc`试图访问`nonStaticVar`,但这是不允许的,因为它没有`this`...

    静态成员变量和静态成员函数

    总结来说,`static`关键字在C++和类似语言中提供了访问控制和资源管理的手段,用于定义类的静态成员变量和静态成员函数。理解和正确使用`static`是编程中的重要概念,对于编写高效、可维护的代码至关重要。

    C++中类使用全局变量

    6. **封装**:如果一个变量需要在多个类之间共享,考虑使用静态成员变量或使用指针或引用传递,而不是全局变量。 总之,虽然全局变量在某些情况下可以简化代码,但过度依赖全局变量会导致代码难以理解和维护。在...

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

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

    C++静态成员函数小结

    静态成员函数是C++中一个非常重要的概念,特别是在类设计和对象编程中。静态成员函数可以分为两部分:静态数据成员和静态函数成员。 一、静态数据成员 静态数据成员是类中的全局变量,它们遵守public、protected和...

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

    `this`指针是一个隐含的参数,它在非静态成员函数中指向调用该函数的对象,提供了对对象状态的访问。由于静态成员函数没有`this`指针,它们无法直接访问非静态成员变量,因为这些变量是在每个对象实例中单独存储的。...

    c++静态成员使用实例

    本篇将通过两个实例——静态成员函数和静态数据成员,深入探讨它们在C++中的应用。 首先,我们来看静态成员函数。在C++中,静态成员函数可以被类的所有对象共享,它并不持有隐含的`this`指针,因此不能访问非静态...

    C++静态成员函数的说明及使用

    C++中的静态成员函数是一种特殊类型的成员函数,它不依赖于类的实例存在,而是直接与类本身相关联。在理解和使用静态成员函数时,有以下几个关键知识点: 1. **定义**: 静态成员函数的定义与普通成员函数不同,...

    C++ 静态成员变量 嵌套类分配回收内存

    在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...

    CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

    静态成员函数不依赖于类的任何实例,可以直接通过类名调用,无需创建类的对象。由于它不访问任何非静态数据成员,因此在设计上更为安全和独立。 ### 小贴士与注意事项 - 若希望全局变量仅在一个C文件中访问,将其...

    C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf

    在我们的示例代码中,我们定义了一个类WinHook,具有一个成员变量value和一个成员函数HookProcess2。我们尝试将HookProcess指向HookProcess2,但是编译失败,提示类型不能转化。这是因为类成员函数 HookProcess2 不...

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

    在C++编程语言中,静态成员变量和静态成员函数是类的重要组成部分,它们与非静态成员有着显著的区别。本文将详细解析这两种特性的使用方法。 首先,我们来看静态成员变量。静态成员变量是通过在变量声明前加上`...

    详解c++ 静态成员变量

    因此,它们可以调用非静态成员函数,包括私有函数,只要这些函数没有依赖于对象实例的状态。 3. **存储位置**:静态成员变量存储在全局数据区,与其他全局变量一样,它们在整个程序的生命周期内都存在。 4. **初始...

Global site tag (gtag.js) - Google Analytics