Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » указатели

Ответить
Настройки темы
указатели
papam


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 22:11, 17-12-2005

 

Пользователь


Сообщения: 117
Благодарности: 1

Профиль | Сайт | Отправить PM | Цитировать


Swap( int& a, int& b )
{
int c( a );

a = b;
b = c;
}

Отправлено: 08:30, 19-12-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Zippy

Старожил


Сообщения: 278
Благодарности: 2

Профиль | Отправить PM | Цитировать


ого, первый раз вижу такую конструкцию: int c( a );, проверил, даже работает! ох уж этот си, хотя на мой взгляд нагляднее просто int с = a;

Отправлено: 21:46, 19-12-2005 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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
Благодарности: 1

Профиль | Сайт | Отправить PM | Цитировать


Если есть интерес, то вот обсуждение одного из способов употребления этой конструкции на RSDN...

Кстати, я даже писал Bjarne Stroustrup по этому поводу...

И он мне ответил...

Prof. Bjarne Stroustrup


Собственно, могу порекомендовать свои программы...

Отправлено: 11:49, 22-12-2005 | #5


Пользователь


Сообщения: 117
Благодарности: 1

Профиль | Сайт | Отправить 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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Почитал предложенные ссылки, проверил на доступных сейчас компиляторах
Код: Выделить весь код
if (int ok(123))
{
}
Один считает это синтаксической ошибкой, другой уточняет, что ему не нравится инициализация переменной в условии.
Если цель стояла в создании класса и приведении его к 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]
Короче, я понял, что дело в объявлении переменных:
Код: Выделить весь код
bool(A a(123))
- ошибка

По поводу "пыльных углов":
попродуйте код:
Код: Выделить весь код
std::vector<A*> as;
// fill some way with operator new

std::for_each(as.begin(), as.end(), delete);
Ничего не уничтожится.

Отправлено: 13:00, 22-12-2005 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » указатели

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Константы и Указатели oRaVeNo Программирование и базы данных 2 31-05-2008 23:37
* Теория * | C++ Доступ к членам класса через указатели Kincajou Программирование и базы данных 6 30-07-2006 22:36
Зачем нужны указатели С++? Guest Программирование и базы данных 10 08-05-2004 18:37




 
Переход