2016-06-20 2 views
1
#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++?

+1

Прочитав ваш вопрос и свой комментарий, я думаю, вам стоит прочитать хорошую книгу о введении C++ (Мышление в C++ это хороший старт, и он свободно доступен в режиме онлайн). –

ответ

3

Линия int MyStaticClass::value; сообщает компилятору зарезервировать хранилище для переменной staticvalue. Если вы этого не сделаете, то свяжется .

В результате 9, так как тело for цикла выполняется 9 раз: вы создаете 9 новые экземпляры MyStaticClass (который не является действительно static классом, он просто имеет static элемент). Обратите внимание, что вы должны delete все эти объекты, иначе ваша программа будет утечка памяти.

MyStaticClass c(); объявляет функцию прототип для функцииc, которая не принимает никаких параметров и возвращает MyStaticClass: он делает не создать объект. Это прозвище самый неприятный синтаксис. Поскольку объект не создан, value остается в 0. Это было бы совсем другое дело, если бы вы написали MyStaticClass c;

+0

Спасибо за ваш ценный ответ! Пожалуйста, объясните мне значение строки 'int MyStaticClass :: value;' –

+0

Я попробовал 'MyStaticClass c', результат был еще 9. Итак, почему, когда мы используем указатель, он создает объект? Я имею в виду, что у него все еще есть '()'? –

+0

Yup. Это дело с самым неприятным анализом *. При использовании 'new' вам действительно нужны скобки. Но когда вы не используете 'new', вы не должны. – Bathsheba

Смежные вопросы