2015-12-16 16 views
2

Из того, что я понимаю, что это законно, чтобы создать экземпляр целое число в C++ вроде этого:Почему int x = int (5) является законным, если int не является классом?

int x = int(5); 

Как программист Java я бы предположить, что эта строка кода вызывает конструктор целого проходящее «5» в качестве аргумента , Я читал, хотя это int не является классом и, следовательно, не имеет конструктора.

Итак, что же именно происходит в этой строке кода и какова принципиальная разница между инициализацией ИНТ таким образом и таким образом:

int x = 5; 

Заранее спасибо!

+4

Ну, это отличает '5' от' int'. Что ничего не делает. – BoBTFish

+10

'int (5)' - [выражение для выражения функции] (http://en.cppreference.com/w/cpp/language/explicit_cast). Это не является специфическим для инициализации и может фактически появляться в любом месте, где допускается выражение. –

+1

@BoBTFish: Нет, литье - это идентификатор типа данных в круглых скобках, за которым следует выражение. –

ответ

11

Я читал, что int не является классом и, следовательно, не имеет конструктора.

Да, технически built-in types have no constructor.

что же именно происходит в этой строке кода

Целое буквальным 5 явно приводится к int (не-ор для компилятора в основном) и назначен x.

что принципиальное различие между инициализацией ИНТ, что путь и int x = 5;

По существу, никакой разницы. Все приведенные ниже выражения являются одинаковыми в большинстве случаев, если вы не язык адвокат (например, последний предотвратить бы ограничить т.е. вызвать ошибку, если значение не может быть представлено типом):

int x = 5;   // copy initialization 
int y = int(5); // cast and copy initialization 
int z = (int)5; // cast and copy initialization 
int w(5);   // direct initialization 
int r{5};   // direct initialization 

Читать more about initializations для более тонких деталей и отличий.

+0

очень хорошее объяснение +1 – Destructor

2

C++ и java работают по-разному, когда дело доходит до типов. Хотя java (насколько мне известно) использует базовые встроенные типы и ссылочные типы, C++ использует систему другого типа.

C++ встроенные типы включают в себя фундаментальные типы (bool, типы символов, такие как char, целочисленные типы, типы с плавающей запятой и void), а также некоторые другие типы, такие как ссылочные типы, такие как double& или std::vector<std::sting>&& и типы указателей.

В дополнение к этим, C++ поддерживает определенные пользователем типы (структуры, классы, enum и enum class). стандартная библиотека предоставляет множество пользовательских типов, таких как std :: string.

Означает, что int a(5); нотация НЕ зарезервирована только для определенных пользователем типов. Язык поддерживает инициализацию значений таким образом.в C++ 11 является также юридическим сказать int a{5};

теперь о присвоении значения:

int a; //declaration 
a=5; //assignment 

int b(5); //declaration+initialization 
int c=5; //declaration+initialization (NO assignment) 

Если переменная не была объявлена, нет никакого присваивания, компилятор анализирует int c=5; так же, как int c(5);