2015-06-28 3 views
-4

Я сделал простой класс для представления координаты x, y. Он имеет инкапсулированный Int для обоих и следующий конструктор:Почему объявление переменной вызывает конструктор

//point.h 
Point(int x = 3, int y = 5); // not zero for example purposes 

//point.cpp 
Point::Point(int x, int y) : x(x), y(y) {} 

Я тогда файл main.cpp:

#include "point.h" 
#include <iostream> 

int main() { 
    Point p; 
    std::cout << "x: " << p.getX() << " y: " << p.getY() << std::endl; 
    p.setX(7); 
    p.setY(9); 
    std::cout << "x: " << p.getX() << " y: " << p.getY() << std::endl; 
} 

Исходя из фона Java, я ожидаю, что это будет придумать нулевой указатель , но вместо этого распечатывает:

x: 3 y: 5 
x: 7 y: 9 

Вопрос: почему мой вопрос объявляет переменную, вызывающую конструктор?

+3

Что значит «нулевой указатель»? В вашем коде нет переменных типа указателя, поэтому ничего, что могло бы иметь значение «NULL». 'почему heck объявляет переменную, вызывающую конструктор?' Потому что это требует спецификация языка C++. –

+2

C++ - это не Java. Я предлагаю вам получить хорошую книгу на C++ и не делать предположений о C++ на основе вашего фона Java. – Blastfurnace

+0

В C++ вам не нужно делать 'new Point()' вещь для создания объекта. Когда вы объявляете «Point P», он создает объект в памяти стека, так как ваш конструктор имеет значения по умолчанию, поэтому конструктор получает вызов, а ваши 'x' и' y' получают значение по умолчанию – user007

ответ

1

Если вы исходите из java, вы привыкли ко всему, что выделяется в куче, и используя новый оператор для создания экземпляра класса или типа данных, он не работает так, как в C++.

Point p; 

это то же самое, как

Point p = new Point(); 

в Java, за исключением нескольких очевидных вещей, за исключением.

Вы можете достичь того же в C++ с использованием нового оператора

Point* p = new Point(); 

Но вы не заботиться о управлении памятью себя и использовать

delete p; 

, когда вам больше не нужно р или вам У меня будет утечка памяти. Утечка памяти также произойдет, если перед освобождением памяти произойдет исключение, поэтому пример выше не рекомендуется.

2

Вы объявили объект типа класса и не указали в объявлении инициализатор. Это означает, что если класс имеет пользовательский конструктор по умолчанию, то этот конструктор по умолчанию используется для инициализации объекта. Вот как работает C++. Спецификация языка говорит, что это происходит, поэтому это происходит.

Я не вижу, что «нулевой указатель» вы ожидаете увидеть и где. В вашем коде нет указателей.

+0

Это просто то, что произойдет, если бы я сделал то же самое в Java, потому что я явно не называл конструктор. – Czipperz

0

В инстанцировании объектов,

В C++

MyClass obj; //calls the default constructor. There can only be one. 
       //either with empty parameter list or with args default. 
MyClass obj(int,int); //constructor with non default args. 

//equivalent of methods above 
MyClass obj = MyClass() 
MyClass obj = MyClass(int,int); 

//You can now have pointers 
MyClass *obj = new MyClass(); 
MyClass *obj = new MyClass(int,int); 

В Java

MyClass obj = new MyClass(); //or 
MyClass obj = new MyClass(int,int); 

Изучите основы C++ хорошо И не путать его с Java.

+0

MyClass obj(); не хорошая идея –

0

в C++ конструктор по умолчанию является значение по умолчанию назначить в каждом из объектов или значения по умолчанию в каждом из объектов

Point(int x = 3, int y = 5); /// default constructor 

поэтому, когда вы создали объект без инициализации некоторых значений объект будет имеют значения по умолчанию, исходящие от конструктора по умолчанию

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