关于static的相关讨论:
1)类中的静态成员变量;
类中的静态成员变量不属于某个对象所有,而是同一个类的不同对象共有的。他只占一个内存空间(而不是为每个对象都保留一个内存空间)。每一个对象都可以引用这个变量,而且他对每一个成员都是一样的。如果改变他的值,则对象中这个值都变了。
如果声明了一个类,如果没有对他定义对象,则类的一般数据成员不占内存空间,只有定义了对象才占内存空间。但静态成员变量不属于某个对象,在为对象分配内存空间时不包括静态成员所占的内存空间。他是在所有类对象中单独开辟的,即使不定义类对象,这个成员也占内存空间。可以被引用。
静态成员可以初始化,但只能在类体外进行。他可以通过对象名引用也可以通过类名引用。
观察程序:
1)
#include<iostream>
using namespace std;
class stu
{
static int a;
int b;
public:
stu();
如果改成:stu::stu()
{
stu::stu()
{
a=1;
b=2;
}
void stu::print()
b=2;
}
int stu::a=1;
就不会出错。
|
void print();
};
{
cout<<a<<""<<b<<endl;
}
int main()
{
stu aa;
aa.print();
return 0;
}
此程序在编译时没有发现什么错误,但在连接时出现了两个错误。
wjh.obj : error LNK2001: unresolved external symbol "private: static intstu::a" (?a@stu@@0HA)
Debug/wjh.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
但把关键字static去掉就不出现问题了。
2)
#include<iostream>
using namespace std;
class stu
{
public:
void print();
};
void stu::print()
{
static int b=1;
cout<<""<<b++<<endl;
}
int main()
{
stu aa[5];
int i;
for(i=0;i<5;i++)
aa[i].print();
getchar();
return 0;
}
输出结果:
1
2
3
4
5
这说明了成员函数中的静态成员变量也是作用于所有的类对象的。
3)
#include<iostream>
using namespace std;
class stu
{ int a,b;
public:
void print();
};
void stu::print()
{
static int b=1;
cout<<""<<b++<<endl;
}
int main()
{
stu aa;
cout<<sizeof(aa)<<endl;
getchar();
return 0;
}
结果输出:8
把pint函数删除,输出的结果依然为8
这是否说明了类中的函数体不占用内存,但为什么不占用内存?
Static 变量实际上可以看作是一个全局变量,只是他有自己 的作用范围。在一个函数中定义,他只作用于定义的一类函数中,不经特别申请不能被别的函数调用。在调用函数时不为这函数中的静态成员分配地址,因为他的地址是在编译时已经分配。Static变量实现了数据在一类函数中的共享。
在类中,成员函数不占用内存。经过测试,一个类所占用的内存只与他所定义的变量个数和种类有关。关于类的赋值问题还须待进一步讨论。
#include<iostream>
using namespace std;
class stu
{
int a;
public:
static void display();
};
void stu::display()
{
cin>>a;
cout<<""<<a<<endl;
}
int main()
{
stu aa;
aa.display();
getchar();
return 0;
}
调试结果:
C:/Program Files/Microsoft Visual Studio/MyProjects/wjh1/wjh1.cpp(11) : error C2597: illegal reference to data member 'stu::a' in a static member function
C:/Program Files/Microsoft Visual Studio/MyProjects/wjh1/wjh1.cpp(12) : error C2597: illegal reference to data member 'stu::a' in a static member function
书本上有这么一句话:当调用一个成员函数时系统会把该对象的其始地址赋给成员函数this指针。而静态成员函数不属于某个对象,他与任何对象都无关,因此静态成员函数不能进行默认访问(即引用数据成员时不指定对象名)。静态成员函数可以直接引用本类中的静态成员变量,因为静态成员同样属于类的,可以直接引用。
|
|
下面有关静态成员函数的讨论:
把a定义成为static变量,调试通过,但连接出错:wjh1.obj : error LNK2001: unresolved external symbol "private: static intstu::a" (?a@stu@@0HA)
Debug/wjh1.exe : fatal error LNK1120: 1 unresolved externals
为什么调用本类中的静态成员会出错?
|
把a变成共有的静态成员变量,还是 有错误:wjh1.obj : error LNK2001: unresolved external symbol "public: static intstu::a" (?a@stu@@2HA)
Debug/wjh1.exe : fatal error LNK1120: 1 unresolved externals
|
代码1:
分享到:
相关推荐
标题“test_static_html:java生成静态HTML”暗示了这是一个关于使用Java编程语言生成静态HTML页面的主题。在IT领域,静态HTML是指不包含服务器端脚本的网页,它们的内容在发送到浏览器时不会改变。这样的页面通常...
在《关于static的小结(Java内存溢出)》这篇文章中,作者主要探讨了与Java中的`static`关键字相关的知识点,以及如何可能导致内存溢出的情况。下面我们将深入分析这些内容。 #### Java中的`static`关键字 `static...
关于构造函数是否是静态方法,《Java编程思想》中的说法可能是指,虽然构造函数不直接使用`static`关键字,但它们在逻辑上类似于静态方法,因为它们在创建对象时被调用,且不依赖于实例状态。然而,构造函数并非真正...
下面我们将详细讨论这两个方面的使用方法和实例。 首先,我们来看一下 `static` 数据成员。静态数据成员是属于类的所有实例共享的,而不是每个实例都有自己的副本。这意味着,无论创建了多少个对象,静态数据成员只...
标题“22_static video”和描述“22_static javase 视频文件”暗示了这个压缩包中的内容可能与Java编程语言的“static”关键字有关,特别是与Java SE(标准版)平台的基础教学视频相关。Java中的“static”关键字是...
下面将详细讨论相关知识点。 1. **Node.js**:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让开发者可以使用JavaScript进行服务器端编程。它的非阻塞I/O模型和事件驱动特性使其在处理大量并发连接时...
在探讨C语言编程中,static关键字以及printf函数的格式化输出和全局变量的使用是三个密切相关且非常重要的概念。首先,static关键字在C语言中具有两种主要用途,一种用于修饰变量,另一种用于修饰函数。其次,printf...
下面将详细讨论HTML相关的重要知识点,以及如何通过静态分析来提升网页性能。 **HTML基础知识** 1. **HTML结构**:HTML(HyperText Markup Language)是网页的基础,用于构建网页内容的结构。它由元素(tags)组成...
结合提供的文件名,我们可以看到可能与`static`关键字相关的测试代码: - `TestForStatic.cpp`:可能包含对`static`关键字的使用进行测试的代码。 - `Sample2_1.h` 和 `Sample2_2.h`:可能是包含类定义和`static`...
这个标题暗示我们将讨论如何使用Shifter工具在本地环境中处理WordPress网站的静态图像。 **描述解析:** 描述与标题相同,"shifter-static-local:运行Shifter静态WordPress图像本地化",这表明这个项目或教程专注...
通过上述讨论,我们可以总结出`extern`和`static`的主要用法和区别: - `extern`用于声明变量或函数在其他地方有定义,主要用于跨模块的数据共享。 - `static`用于控制变量的作用域和生命周期,可以使变量具有文件...
在数字集成电路(IC)设计领域,静态时序分析(Static Timing Analysis,STA)是确保芯片性能和可靠性的核心技术之一。它是一种无模拟运行的分析方法,用于预测电路在给定电源电压、工艺条件和温度下的运行速度,以...
当我们讨论“Java static静态初始化块”时,我们关注的是如何在类加载时执行特定的初始化代码。 首先,让我们理解`static`关键字的基本概念。`static`在Java中用于声明类变量或静态方法,这些变量和方法不需要创建...
下面将详细讨论与“Staticc”和“字体”相关的知识点。 1. **字体基础**: - 字体是文字的视觉表现形式,包括字形、大小、间距等特征。 - 常见的字体类型有衬线字体(如Times New Roman)、无衬线字体(如Arial)...
"Boilerplate-Static-Archoda:使用gulp的静态网站样板" 这个标题揭示了我们正在讨论一个专为构建静态网站设计的项目模板,它基于Gulp工作流。"Boilerplate"通常指的是一个基础框架或起点,包含一组预配置的文件和...
在IT行业中,"staticCode:资源文件及代码"这一标题暗示了我们正在讨论的是静态代码或资源文件的集合,这通常是指不随程序运行而改变的文件,如HTML、CSS、JavaScript、图片、字体等。这些文件对于构建网站、应用程序...
标题"由Static控件制作的StaticList控件"暗示我们这里讨论的是一个利用多个静态控件构建的自定义列表组件,它允许开发者在保持静态控件特性的同时,实现类似于列表视图的效果。这种控件的灵活性很高,可以适应各种...
接下来,我们讨论`static`关键字。`static`主要用于表示与类相关联的成员,而不是类的实例。其主要特性包括: 1. **静态变量**:`static`修饰的变量称为静态变量,它们属于类,而不是类的任何实例。所有实例共享同...
社区、讨论、贡献和支持行为守则 概述 本地持久卷允许用户通过标准的 PVC 接口以简单便携的方式访问本地存储。 PV 包含系统用于将 pod 调度到正确节点的节点亲缘关系信息。 此处提供了一个外部静态供应器,以帮助...
接着,我们讨论“静态类型”(Static Types)。静态类型与动态类型相对,动态类型语言如JavaScript在运行时才确定变量的类型,而静态类型语言则在编译时就确定了。在JavaScript中引入静态类型的概念,主要是通过...