2016-06-26 5 views
0

Извините, если это начинающий вопрос, но я не мог найти ответ в любом месте - я наткнулся класса деструктор в C++, в котором естьдвойное тире перед переменной в C++

--num_strings; 

Я задаюсь что означает двойная тире. Любая помощь приветствуется, спасибо. Ниже приведены части заголовочных файлов и CPP:

// strngbad.h 
#include <iostream> 
class StringBad 
{ 
private: 
    char * str; 
    int len; 
    static int num_strings; 

public: 
    StringBad(const char * s); 
    StringBad(); 
    ~StringBad(); 
}; 

// strngbad.cpp 
#include <cstring> 
#include "strngbad.h" 
using std::cout; 
.... 
.... 
.... 

StringBad::StringBad(const char *s) 
{ 
    len = std::strlen(s); 
    str = new char[len + 1]; 
    std::strcpy(str, s); 
    num_strings++; 
} 

StringBad::~StringBad() 
{ 
    --num_strings; 
    delete [] str; 
} 
+4

Почему вы знаете, что такое класс и деструктор, но вы еще не знаете арифметических операторов? С каким источником вы изучаете C++? –

+3

Поиск оператора [https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B). Почему сначала не читайте книгу на C++? –

+1

@JerryHu +1 для публикации хорошо сформулированного вопроса вместе с соответствующим кодом. Для всех остальных, прежде чем наказывать OP, пожалуйста, подумайте, что не всегда легко, особенно для самостоятельного объявленного новичка, найти правильные ключевые слова для поиска даже «очевидного» ответа. Например, собственная логика SO, предположительно хорошо выдержанная на C++, по-видимому, не связывает «двойную тире перед переменной» с «префиксом декремента оператора», судя по тому, что указано в столбце 'related' для этого вопроса - даже после нескольких ответы были опубликованы. – dxiv

ответ

8

Сво prefix decrement operator. Он вычитает 1 из переменной и сохраняет результат обратно в переменной. В качестве выражения оно имеет значение результата после декремента. Существует также постфиксирующий декремент-оператор, который ведет себя одинаково, за исключением того, что значение выражения является значением переменной до декремента.

(Это потому, что num_strings является int. Конечно, как и большинство операторов в C++, если переменная является класс, он может определить свою собственную семантику для оператора префикс --, поэтому все ставки выключены, как к тому, что он делает .)

5

- Это оператор префикса декремента, а это означает, что вы отсутствуете из значения.

--num_strings; 

это точно так же, как:

num_strings=num string -1; 
2

-- является C++ с декремент оператор (уменьшает значение из его операнда на единицу). Внутри конструктора память выделяется из кучи (свободного хранилища) для хранения массива char strings, а num_strings увеличивается на один, чтобы отслеживать количество массивов символов, плавающих вокруг в любой момент времени. В деструкторе память, которая была выделена этому массиву символов, возвращается обратно в свободное хранилище с помощью оператора delete[], но чтобы убедиться, что num_strings по-прежнему верен, его нужно уменьшить на единицу, и это именно то, что оператор -- делает внутри деструктора.