1) Конструкторы должны использоваться исключительно для инициализации переменных-членов.
class A {
public:
A() { a = 0; b = 0; }
A(int a, int b) { this->a = a; this->b = b; }
private:
int a;
int b;
};
В вышеприведенном классе у нас есть два конструктора, каждый из которых инициализирует переменные-члены, один с нулями, а другой сзаданные аргументы.
Класс может иметь любое количество конструкторов.При создании экземпляра класса вы всегда должны вызывать один из них, например:
A a1; // uses first constructor, i.e. A::A()
A a2(); // also uses first constructor
A* a3 = new A(1, 2); // uses second constructor, i.e. A::A(int a, int b)
A a4(1, 2); // also uses second constructor
2) Объявление:
A a(1, 2)
объявляет переменную, которая содержит экземпляр, связанный с областью действия, что означает, чтоЭкземпляр будет автоматически удален при выходе программы из этой области.Например:
void fn() {
A a(1, 2);
...
...
}
в начале экземпляра функции создается, который будет автоматически удален при выходе из этой функции.
В случае:
A *a = new A(1,2)
объявлена переменная a, и она указывает на вновь созданный экземпляр A. Вы должны вручную удалить экземпляр, на который указывает точка, с помощью «delete a», но ваш экземпляр может остаться в области действия, в которой объявлен объект.Например:
A* fn()
{
A *a = new A(1,2)
return a;
}
здесь функция fn возвращает экземпляр, созданный внутри своего тела, т.е. экземпляр сохраняется в области действия функции.