c++-函数中static问题。。。。。。

问题描述

函数中static问题。。。。。。
小白一个,下面代码调用f(Monitor*)时i的值增加超过应有的值
而且多次调用和调用一次值不同
若调用f()一切正常,里面的monitor是全局的
以上三点我都不能理解 还请各位大神指教

解决方案

错误原因:
main函数结束时:m先被释放、析构,
然后析构静态的mon,这时输出的i,已经是个随机的。

 #include<iostream> using namespace std; class Monitor{     int i;public:     Monitor(){ i=0; cout<<""Monitor 构造:i=""<<i<<endl; }    ~Monitor(){ cout<<""Monitor 析构:i=""<<i<<endl; }    void print()    { cout<<"" ""<<i<<endl; }}; class Monitor2{     Monitor* mon; public:    Monitor2(Monitor* a):mon(a)    {         cout<<""Monitor2 constructor "";         mon->print();     }    ~Monitor2()    {         cout<<""Monitor2 destructor "";         mon->print();    }}; void f(Monitor* a){     static Monitor2 mon(a);} void main(){    Monitor m;    cout<<""ok1""<<endl;    f(&m);    cout<<""ok2""<<endl;}

解决方案二:
提问不能上传图片 代码如下

解决方案三:
关于static函数能不能在其他文件中使用的问题
static函数
C++ static函数 继承问题

解决方案四:

 第一个: static Monitor2 mm(mo); //静态变量,程序一执行就要分配空间、初始化,而mo是局部变量,还未存在。所以错误。 第二个 static Monitor2 mm(&mo_extern); // mo_extern是全局变量,在mm初始化时,mo_extern已经存在,所以没问题。

解决方案五:
函数中的静态变量,只是在程序开始分配内存初始化,执行一次,以后该条语句不再执行。

解决方案六:

 void main(){    Monitor m;    cout<<""ok1""<<endl;    f(&m);    cout<<""ok2""<<endl;    f(&m);    cout<<""ok2""<<endl;      f(&m);    cout<<""ok2""<<endl;}

解决方案七:
第一个:
static Monitor2 mm(mo); //静态变量,程序一执行就要分配空间、初始化,而mo是局部变量,还未存在。所以错误。
第二个
static Monitor2 mm(&mo_extern); // mo_extern是全局变量,在mm初始化时,mo_extern已经存在,所以没问题。

时间: 2025-01-19 09:18:28

c++-函数中static问题。。。。。。的相关文章

c#-在Main函数中访问不到Analyze方法 把private改为static就可以哪位大神解释一下

问题描述 在Main函数中访问不到Analyze方法 把private改为static就可以哪位大神解释一下 class Program { static StringBuilder sb = new StringBuilder(); static void Main(string[] args) { Type t4 = typeof(double); Analyze(t4); MessageBox.Show(sb.ToString(), "Analyze of type is " +

关于泛型在static函数中

问题描述 publicstaticjava.util.Listfunc(java.util.Listl){}在这个函数中,怎么知道l中元素具体的类型?比如如果实参是List<Integer>,List<String>等等 解决方案 解决方案二:答案是:使用泛型jdk1.5过后就支持泛型了,你在形参上面也定义好了泛型不就知道了吗.解决方案三:请注意是static函数解决方案四:是static函数解决方案五:List所带的泛型信息在运行时会"擦出"的在func函数中

php中static关键字对变量和函数影响

1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其

php 函数中使用static变量

 代码如下 复制代码 function sendHeader($num, $rtarr = null) {     static $sapi = null;     if ($sapi === null) {         $sapi = php_sapi_name();     }     return $sapi++; 看PW源码的时候发现setHeader()函数中使用static关键字,很奇怪,以前也没这样用过. static用在函数里面,声明一次变量后,如果再次调用这个函数将会在初始

c++问题-C++的类中怎么在一个函数中引用上一层的函数

问题描述 C++的类中怎么在一个函数中引用上一层的函数 在同一个类中怎么引用先定义的函数来定义函数?比如在一个时期类的定义中,一个日期加1的函数中怎么调用先定义的一个求是否闰年的函数. 解决方案 C++定义隐式转换函数将类转换为内部的一个成员变量c++函数默认参数是一个好的设计吗? 解决方案二: 直接在函数内调用就可以了.不知道你说的上一层是什么意思.是基类的函数还是集合类所属的对象的函数,前者直接调用,或者用 基类类名::函数名后者用构造函数传对象指针 解决方案三: 同一个类中的函数都是通过t

Thinking:Java中static、this、super、final用法

Thinking:Java中static.this.super.final用法   本篇旨在帮助准备学习Java以及刚接触Java的朋友认识.掌握和使用static.this.super.final这几个关键字的使用.Java博大精深,我也是一位正在学习和使用Java的爱好者,文中难免有不妥之处,欢迎指正. 一.static 请先看下面这段程序:   public class Hello{    public static void main(String[] args){ //(1)     

PHP中static关键字以及与self关键字的区别

  这篇文章主要介绍了PHP中static关键字以及与self关键字的区别,本文讲解了static关键字的定义.迟绑定(Late Static Bindings).以及与self关键字的区别等内容,需要的朋友可以参考下 概述 正在学习设计模式,之前有一篇文章关于单例模式的文章,重新读了这篇文章,发现对static关键字掌握不是很牢靠,重新温习一下. static关键字 PHP手册里对static关键字的介绍如下: 代码如下: Declaring class properties or metho

function-android中如何在另一个函数中调用监听器

问题描述 android中如何在另一个函数中调用监听器 现在有以下的代码,想在另一个函数和另一个类中调用这个监听器,加入什么样的代码能实现这个功能啊? public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_UP) { Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); Random

c# c++ dll-C#调用C++和opencv生成的dll库文件,其中函数中带有指针

问题描述 C#调用C++和opencv生成的dll库文件,其中函数中带有指针 大家好,我用C#调用C++的dll,其中一个函数中有指针,参数的定义在C++中是一个结构体,但是我现在遇到的问题是无法获取托管类型的地址和大小,或无法声明指向它的指针,下面我把这个函数在C++中的定义和我自己转到C#中的定义给大家贴出来,大家帮帮忙,本人属于C++和C#新手. C++ 1. int THFI_Create (short nChannelNum,THFI_Param* pParam) 功能:初始化THFa