указатели
|
papam
Сообщения: n/a |
Помогите пожалуста:
|
|
Отправлено: 22:11, 17-12-2005 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Swap( int& a, int& b )
{ int c( a ); a = b; b = c; } |
Отправлено: 08:30, 19-12-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 278
|
Профиль | Отправить PM | Цитировать ого, первый раз вижу такую конструкцию: int c( a );, проверил, даже работает! ох уж этот си, хотя на мой взгляд нагляднее просто int с = a;
|
Отправлено: 21:46, 19-12-2005 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать В C++ эта конструкция правильней. Она обозначает явный вызов конструктора копирования.
Ещё полезные примеры: double x = double(); // то же самое, что double x(double()), но с явным вызовом. class X { public: explicit X() {cout << "X::X()\n";} } X x = X(); // сработает X x(X()); // сработает X x; // ошибка - нет неявного конструктора. X x(); // ошибка - описание функции; template<class T> class temp1 { double y; X x; public: temp1() : x(), y() {} // вызов явных конструкторов, x=X(), y=double() } |
Отправлено: 08:50, 22-12-2005 | #4 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Если есть интерес, то вот обсуждение одного из способов употребления этой конструкции на RSDN...
Кстати, я даже писал Bjarne Stroustrup по этому поводу... И он мне ответил... Prof. Bjarne Stroustrup Собственно, могу порекомендовать свои программы... |
|
Отправлено: 11:49, 22-12-2005 | #5 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать pva, небольшая неаккуратность... (не ошибка!)
template<class T> class temp1 { double y; X x; public: temp1() : x(), y() {} // вызов явных конструкторов, x=X(), y=double() } То есть, сначала — y(), а потом — x()... Можно, конечно, писать x(), y(), ничего от этого не изменится... Но, например, новички (да и просто по рассеянности) могут подумать, что Вы специально так написали, чтобы изменить порядок создания членов... Лично я стараюсь всегда указывать в порядке объявления... |
Отправлено: 12:01, 22-12-2005 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Почитал предложенные ссылки, проверил на доступных сейчас компиляторах
Один считает это синтаксической ошибкой, другой уточняет, что ему не нравится инициализация переменной в условии. Если цель стояла в создании класса и приведении его к bool, можно было сделать: if (SomeClass(123)) ... [code] class A { public: explicit A(int) {} operator bool() const {return false;} }; int main() { for(A a (123); A b(123)/*ошибка*/; ) {} if (A a(123)/*ошибка*/) { /// } return 0; } [code] Короче, я понял, что дело в объявлении переменных: - ошибка По поводу "пыльных углов": попродуйте код: Ничего не уничтожится. |
Отправлено: 13:00, 22-12-2005 | #7 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Если ещё интересно про A a(123) и for_each(delete):
В С/C++ все выражения принимаются в виде lvalue = rvalue (левому присвоить правое). lvalue должна иметь адрес в памяти, rvalue - значение. Формально A a = A(123) значит {A a; a=A(123)}, то есть по синтаксису используется A& operator=(...), который возвращает rvalue. Конструкции, где используется значение, например if (...), требуют rvalue, а конструкция объявления переменных A a(123) не является rvalue (это lvalue). Подобно этому, {A b(124), a=A(123)} - тоже не может быть приведена к rvalue. Между тем, компиляторам рекомендуется делать оптимизацию, уменьшающую количество копирований, даже если имеются побочные эффекты присваивания, копирования и разрушения объектов. На синтаксисе это не сказалось. Я проверил, что делает for_each(begin, end, operator delete) на предмет повреждения памяти. Оказалось, что здесь шаблон for_each(Iterator, Iterator, Transform) раскрывается как for_each(vector<A*>::iterator, vector<A*>::iterator, operator delete(void*)), То есть освобождение памяти есть, а вызова деструктора - нет (даже если он виртуальный). Тесты проводились в том числе на GCC 3.3.2. |
Отправлено: 11:32, 26-12-2005 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Константы и Указатели | oRaVeNo | Программирование и базы данных | 2 | 31-05-2008 23:37 | |
* Теория * | C++ Доступ к членам класса через указатели | Kincajou | Программирование и базы данных | 6 | 30-07-2006 22:36 | |
Зачем нужны указатели С++? | Guest | Программирование и базы данных | 10 | 08-05-2004 18:37 |
|