#include <iostream>
using namespace std;
class myclass {
int a;
public:
explicit myclass(int x) { a = x; }
int geta() { return a; }
};
Теперь будут разрешены к применению только конструкторы, заданные в таком формате.
myclass ob(110);
Автоматическое преобразование из типа аргумента конструктора в вызов конструктора само по себе имеет интересные последствия. Рассмотрим, например, следующий код.
#include <iostream>
using namespace std;
class myclass {
int num;
public:
myclass(int i) { num = i; }
int getnum() { return num; }
};
int main()
{
myclass о(10);
cout << o.getnum() << endl; // отображает 10
/* Теперь используем неявное преобразование для присвоения нового значения. */
о = 1000;
cout << o.getnum() << endl; // отображает 1000
return 0;
}
Обратите внимание на то, что новое значение присваивается объекту о с помощью такой инструкции:
о = 1000;
Использование данного формата возможно благодаря неявному преобразованию из типа int в тип myclass, которое создается конструктором myclass(). Конечно же, если бы конструктор myclass() был объявлен с помощью спецификатора explicit, то предыдущая инструкция не могла бы выполниться.
В примерах программ из предыдущих глав члены данных получали начальные значения в конструкторах своих классов. Например, следующая программа содержит класс myclass, который включает два члена данных numA и numB. Эти члены инициализируются в конструкторе myclass().
#include <iostream>
using namespace std;
class myclass {
int numA;
int numB;
public:
/* Инициализируем члены numA и numB в конструкторе myclass(), используя обычный синтаксис. */
myclass(int х, int у) { numA = х; numA = y;}
int getNumA() { return numA; }
int getNumB() { return numB; }
};
int main()
{
myclass ob1(7, 9), ob2 (5, 2);
cout << "Значения членов данных объекта ob1 равны " << ob1.getNumB() << " и " << ob1.getNumA() << endl;
cout << "Значения членов данных объекта ob2 равны " << ob2.getNumB() << " и " << ob2.getNumA() << endl;
return 0;
}
Результаты выполнения этой программы таковы.
Значения членов данных объекта ob1 равны 9 и 7
Значения членов данных объекта ob2 равны 2 и 5
Присвоение начальных значений членам данных numA и numB в конструкторе, как это делается в конструкторе myclass(), — обычная практика, которая применяется для многих классов. Но этот метод годится не для всех случаев. Например, если бы члены numA и numB были заданы как const-переменные, т.е. таким образом:
class myclass {
const int numA; // const-член
const int numB; // const-член