【问题标题】:About class in C++?关于 C++ 中的类?
【发布时间】:2016-06-20 09:04:14
【问题描述】:
#include <iostream>

using namespace std;

class MyStaticClass{
public:
    static int value;
    MyStaticClass(){ 
        value++; 
    }
    ~MyStaticClass(){}
};
int MyStaticClass::value;
void main(){
    MyStaticClass::value = 0;
    for (int i = 0; i<9; i++)
        MyStaticClass *c = new MyStaticClass();
    cout << MyStaticClass::value;
    system("pause");
}

请解释一下为什么结果是 9,当替换 MyStaticClass *c = new MyStaticClass()MyStaticClass c() 时结果变为 0?最后int MyStaticClass::value;的含义是什么,为什么当我删除该行时编译器显示错误?谢谢大家!

【问题讨论】:

  • 阅读您的问题和评论,我认为您应该阅读一本关于 c++ 的好介绍书(Thinking in c++ 是一个好的开始,并且可以在线免费获得)。

标签: c++ class oop static


【解决方案1】:

int MyStaticClass::value; 行告诉编译器为static 变量value 保留存储空间。如果你不这样做,那么 linker 将会失败。

结果为 9,因为 for 循环体执行了 9 次:您正在创建 MyStaticClass 的 9 个新实例(这并不是真正的 static 类,它只有一个 static 成员)。请注意,您应该 delete 所有这些对象,否则您的程序会泄漏内存。

MyStaticClass c();function c 声明了一个函数 prototype,它不接受任何参数并返回一个 MyStaticClass:它确实不是 创建一个对象。这被称为最令人头疼的解析。由于没有创建对象,value 保持为 0。如果你写的是 MyStaticClass c;,那将是另一回事

【讨论】:

  • 感谢您的宝贵回答!请解释一下int MyStaticClass::value;这一行的含义
  • 我试过MyStaticClass c,结果还是9。那么为什么当我们使用指针时它会创建对象呢?我的意思是它还有()
  • 是的。这就是最令人头疼的解析。使用new 时,您确实需要括号。但是当你不使用new时,你不应该使用。
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 2011-06-08
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多