Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Квест для всех остальных 
:(
    Опции темы
azesmcar
Дата 9.7.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



У Сыроежки есть квест, а у всех остальных - нет. Стало как-то обидно и я решил устранить это досадное недоразумение.

1. есть ли какие-то принципиальные различия между тернарным оператором и оператором if, если есть, то какие.
другими словами можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом
2. что будет выведено и почему?
Код

#include <iostream>

int y = 0;

int foo()
{
    return ++y;
}

int main()
{
    int x;
    x = 10, foo();
    std::cout << x << ":" << y << std::endl;
}

3. что делает этот код?
Код

std::vector<std::string> data(std::istream_iterator<std::string>(is), std::istream_iterator<std::string>());

4. что выведет код и почему?
Код

#include <iostream>

int foo(int x)
{
    return x * 2;
}
int foo(int x, int y)
{
    return x * y;
}
int main()
{
    std::cout << foo((1, 2)) << std::endl;
}

5. есть ли разница между переменными x1, x2 и x3, x4. Если есть, то какая?
Код

#include <iostream>

struct X
{
    int a;
    int b;
};

int main()
{
    X x1;
    X x2 = X();
    X* x3 = new X;
    X* x4 = new X();
}

6. Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет?

пока это smile 

Это сообщение отредактировал(а) azesmcar - 9.7.2011, 14:20
PM   Вверх
fish9370
Дата 9.7.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



квест по Си, пожалуйста, в студию..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Сыроежка
Дата 9.7.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
Выделить всёкод C++
    
#include <iostream>
int y = 0;
int foo()
{
    return ++y;
}
int main()
{
    int x;
    x = 10, foo();
    std::cout << x << ":" << y << std::endl;
}



Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo.

Функция возвращает ++y, то есть значение равное 1.

Поэтому и x. и y будут равны 1. 
Я это написал без всякой проверки с помощью компилятора.

Было бы интереснее, если бы вы написали 

 x = (y = 10, foo() );
А в самой функции не   return ++y; а   return y++;

Это сообщение отредактировал(а) Сыроежка - 9.7.2011, 20:35
PM MAIL   Вверх
Qu1nt
Дата 9.7.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: нет
Всего: 50



Сыроежка,
Цитата(gcc 4.6)

10:1

PM MAIL   Вверх
volatile
Дата 9.7.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  9.7.2011,  20:34 Найти цитируемый пост)
Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo.
Функция возвращает ++y, то есть значение равное 1.
Поэтому и x. и y будут равны 1. 

У оператора запятая, приоритет ниже чем у оператора присваивания.
Знатоку тонкостей автоматического приведения типов, как-то не к лицу путаться с приоритетами.

Но хоть, по крайней мере, честно

PM MAIL   Вверх
voral
Дата 9.7.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



Мда.... 4ый не допетрил почему поучилось то, что получилось smile Какой урок я "пропустил в школе"? 
PM MAIL WWW   Вверх
volatile
Дата 10.7.2011, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(voral @  9.7.2011,  23:44 Найти цитируемый пост)
4ый не допетрил почему поучилось то, что получилось  


Код

std::cout << foo((1, 2)) << std::endl;

voral, Здесь идет вызов foo(2);
так как (1, 2) заключен в скобки, это всё - первый аргумент. Единица просто теряется, остается 2




Это сообщение отредактировал(а) volatile - 10.7.2011, 00:10
PM MAIL   Вверх
boostcoder
Дата 10.7.2011, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



не хочу торопить события... но сыроежко пустозвон? как мальчик колокольчик? я именно так и понял его ответы)
PM WWW   Вверх
voral
Дата 10.7.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



Цитата(volatile @  10.7.2011,  00:08 Найти цитируемый пост)
Единица просто теряется, остается 2

Вот как раз почему теряется единица, а не двойка я не понимаю.
Ведь если
Код

int i = 1,2;

То i будет 1......

Добавлено через 4 минуты и 55 секунд
Какая логика компиляции?
Код

    i= (1,2);

PM MAIL WWW   Вверх
volatile
Дата 10.7.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(voral @  10.7.2011,  10:03 Найти цитируемый пост)
int i = 1,2;

У присваивания приоритет выше
выполняется так
i = 1;
2;

Здесь можно задать вопрос почему в программе можно писать 2; и это не будет ошибкой.  
Можете попробовать.
Корректная (хотя и абсолютно бесполезная) программа:
Код

1234;
23345;
0x3324;
334;


http://liveworkspace.org/code/5b387bc649b1...a41564ee35503fa
smile 
PM MAIL   Вверх
voral
Дата 10.7.2011, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



Цитата(volatile @  10.7.2011,  10:26 Найти цитируемый пост)
У присваивания приоритет выше

Я это знаю.  И понимаю, почему выбрано именно 1.

И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 
Код

i =  (1,2);

здесь будет равно 2.

Пробовал подставлять функции - отрабатывают обе. Правильно ли я понимаю, что здесь, упрощенно, раскладывается на две операции:
i=1;
i=2;
соответственно первая в компилированный код не идет за ненадобностью. (Если функция то она вызывается)
Поэкспериментировал с gdb
Код

// i = 1;
0x00000000004008a2 <main+0>:    push   %rbp
0x00000000004008a3 <main+1>:    mov    %rsp,%rbp
0x00000000004008a6 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004008ad <main+11>:   mov    $0x0,%eax
0x00000000004008b2 <main+16>:   leaveq
0x00000000004008b3 <main+17>:   retq

//    i= 1,2;
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq

//    i= (1,2);
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x2,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq

//    i= (1,2,3);
0x00000000004006b4 <main+0>:    push   %rbp
0x00000000004006b5 <main+1>:    mov    %rsp,%rbp
0x00000000004006b8 <main+4>:    movl   $0x1,-0x4(%rbp)
0x00000000004006bf <main+11>:   mov    $0x0,%eax
0x00000000004006c4 <main+16>:   leaveq
0x00000000004006c5 <main+17>:   retq





PM MAIL WWW   Вверх
asmdzen
Дата 10.7.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)
И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 
Выделить всёкод C++
1:
    
i =  (1,2);

здесь будет равно 2.


потому что скобки меняют приоритет и результатом (1,2) будет 2.
PM MAIL   Вверх
volatile
Дата 10.7.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)
Меня больше интересует вопрос почему 
i =  (1,2);


Потому-что скобки. (Разве не очевидно?)  smile 
Сначала, вычисляется выражение в скобках
temp = 1;
temp = 2;
и потом присваивается переменной
i = temp;

Ну где-то так..

Смотреть на асме - естественно бесполезно.
Любой мало-мальский оптимизатор зарубит это на корню.

Добавлено через 1 минуту и 29 секунд
Упс, пока я тут заваривал кофе asmdzen, уже ответил. Сорри.
PM MAIL   Вверх
asmdzen
Дата 10.7.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



volatile, lock(thread) забыл  smile 

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
 можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом

параметры функции?
типа:
Код

void myFunc(int x);

int y,z;
myFunc(y>z ? y: z); // call with max value


Это сообщение отредактировал(а) asmdzen - 10.7.2011, 12:46
PM MAIL   Вверх
azesmcar
Дата 10.7.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(asmdzen @  10.7.2011,  12:42 Найти цитируемый пост)

параметры функции?
типа:

это можно написать с помощью if, код будет выглядеть иначе, но можно.

Добавлено через 1 минуту и 3 секунды
Цитата(voral @  10.7.2011,  12:23 Найти цитируемый пост)

Я это знаю.  И понимаю, почему выбрано именно 1.

И сам же сказал, что будет 1.  Меня больше интересует вопрос почему 

так работает оператор запятая. не совсем понятно в чем вопрос.
PM   Вверх
borisbn
Дата 10.7.2011, 13:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
можно ли написать что либо тернарным оператором, что нельзя написать простым if-ом

инициализацию (присвоение) ссылки
Код

int x = 42;
int y = 24;

int & ref = ( some ) ? x : y;


Добавлено @ 13:19
Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
5. есть ли разница между переменными x1, x2 и x3, x4. Если есть, то какая?
#include <iostream>

struct X
{
    int a;
    int b;
};

int main()
{
    X x1;
    X x2 = X();
    X* x3 = new X;
    X* x4 = new X();
}


x1 и то, на что указывает x3 - не инициализированы,
а x2 и то, на что указывает x4 - инициализированы значениями по-умолчанию. Для int - нули

P.S. а зачем #include <iostream> ? smile

Добавлено @ 13:22
Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
6. Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет?

Думаю, не имеет значения, т.к. компилятор по этой ссылке всё равно ничего не пишет, а на этапе исполнения const'ов вообще нет.
Предполагаю, что константная, но как это проверить - не имею ни малейшего понятия.

Это сообщение отредактировал(а) borisbn - 10.7.2011, 13:24


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 10.7.2011, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(borisbn @  10.7.2011,  13:12 Найти цитируемый пост)

присовение ссылки

верно, еще есть?

Добавлено через 1 минуту и 42 секунды
Цитата(borisbn @  10.7.2011,  13:12 Найти цитируемый пост)


x1 и то, на что указывает x3 - не инициализированы,
а x2 и то, на что указывает x4 - инициализированы значениями по-умолчанию. Для int - нули

P.S. а зачем #include <iostream> ? 

да, верно. а iostream от предыдущего примера остался smile

Добавлено через 6 минут и 50 секунд
Цитата(borisbn @  10.7.2011,  13:12 Найти цитируемый пост)
Думаю, не имеет значения, т.к. компилятор по этой ссылке всё равно ничего не пишет, а на этапе исполнения const'ов вообще нет.
Предполагаю, что константная, но как это проверить - не имею ни малейшего понятия

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

Добавлено через 8 минут и 7 секунд
borisbn

вышлю ответ в приват.
PM   Вверх
Сыроежка
Дата 10.7.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  9.7.2011,  23:26 Найти цитируемый пост)
Цитата(Сыроежка @  9.7.2011,  20:34 )
Здесь все просто . Если я правильно разглядел, то ч присваивается результат оператора "запятая", то есть последнее выражение, которое соответсвует вызову функции foo.
Функция возвращает ++y, то есть значение равное 1.
Поэтому и x. и y будут равны 1. 


У оператора запятая, приоритет ниже чем у оператора присваивания.
Знатоку тонкостей автоматического приведения типов, как-то не к лицу путаться с приоритетами.

Но хоть, по крайней мере, честно


Я смотрел код поверхностно. Даже с трудом разглядел, что там запятая, так как у меня заканчивалось время, выделенное на интернет в интернет-кафе. А когда суетишься, что бы успеть напечатать, то уже не вникаешь.
PM MAIL   Вверх
bsa
Дата 10.7.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Раздел вроде для новичков, а отвечают профессионалы. Ну раз так, то и я тогда отвечу:
1. отличие кардинальное - тернарный оператор можно использовать в константных выражениях. Например, для метапрограммирования (программы этапа компиляции, "Современное программирование на С++", А. Александреску) и условной инициализации констант (в т.ч. и ссылок).
3. массив будет заполнен "словами" (точнее, непробельными символами, которые изначально разделены пробельными) из потока.
6. генерируется конструктор, которому передается ссылка на константный объект
PM   Вверх
mes
Дата 10.7.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  10.7.2011,  12:12 Найти цитируемый пост)
Предполагаю, что константная, но как это проверить - не имею ни малейшего понятия.

Код

struct A {
//  A(A&) {}
};
void f(A) {}

int main () {  f( A() ); }


при неконстантом конструкторе копий этот код по стандарту не скомпилирутся.. 
(некоторые версии студии скомпилируют из за своего несоответсвия стандарту ) 

Это сообщение отредактировал(а) mes - 10.7.2011, 18:25


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 10.7.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



bsa, и Вы и azesmcar в личке говорите о
Цитата(bsa @  10.7.2011,  18:06 Найти цитируемый пост)
метапрограммирования

Можете пояснить, каким образом тернарный оператор незаменим в метапрограммировании ? Что вообще имеется в виду ?
Спасибо.

Цитата(bsa @  10.7.2011,  18:06 Найти цитируемый пост)
а отвечают профессионалы

Кого имели в виду ? Лучше ответить в личку, если не против


Добавлено через 1 минуту и 32 секунды
mes, ну я так понимаю, что при разкомментированном
Цитата

A(A&) {}

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 10.7.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  10.7.2011,  17:32 Найти цитируемый пост)
mes, ну я так понимаю, что при разкомментированном

при раскомментированом  компилиться не должен.. на этом принципе основана "защита" от копирования auto_ptr (в vector).. 


Это сообщение отредактировал(а) mes - 10.7.2011, 18:55


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 10.7.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



azesmcarmes, спасибо. По поводу вопроса 
Цитата
Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет?

всё стало понятно - и вопрос и ответ smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 10.7.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @ 10.7.2011,  18:23)
Код

struct A {
//  A(A&) {}
};
void f(A) {}

int main () {  f( A() ); }


при неконстантом конструкторе копий этот код по стандарту не скомпилирутся.. 
(некоторые версии студии скомпилируют из за своего несоответсвия стандарту )
А я вот не понял.
mes, Почему этот код не скомпилится. По крайней мере здесь компилится.
http://liveworkspace.org/code/ea840a0b6f28...2cddb89f87265fe

На студии тоже скорей всего скомпилится.

???

Или вы имелли ввиду не скомпилится при расскоментировании?

Это сообщение отредактировал(а) volatile - 10.7.2011, 20:10
PM MAIL   Вверх
bsa
Дата 10.7.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(borisbn @  10.7.2011,  18:32 Найти цитируемый пост)
Можете пояснить, каким образом тернарный оператор незаменим в метапрограммировании ? Что вообще имеется в виду ?

имеется в виду программы этапа компиляции.
PM   Вверх
borisbn
Дата 10.7.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  10.7.2011,  20:07 Найти цитируемый пост)
имеется в виду программы этапа компиляции.

Есть у меня дурацкое свойство - не понимаю общие понятия, люблю разбираться на примерах... поэтому не понял... :(
Что именно имеется в виду ? Можно пример на Си++ ? Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 10.7.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  10.7.2011,  19:02 Найти цитируемый пост)
 Почему этот код не скомпилится. По крайней мере здесь компилится.


Цитата(mes @  10.7.2011,  17:23 Найти цитируемый пост)
при неконстантом конструкторе копий этот код по стандарту не скомпилирутся.. 

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

Добавлено через 3 минуты и 6 секунд
Цитата(volatile @  10.7.2011,  19:02 Найти цитируемый пост)
Или вы имелли ввиду не скомпилится при расскоментировании?

если б генерировался (только) неконстантный, то нескомпилировался (если конечно других нарушений стандарта в этом русле у компилятора нет ) 


--------------------
PM MAIL WWW   Вверх
mes
Дата 10.7.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вобщем помойму лучше сразу поянить, чтоб не вызывать кучу дополнительных вопросов.. 
по стандарту при пристыковке rvalue (условно говоря временного объекта) к константной ссылке, время жизни объекта увеличивается на время жизни ссылки..  С неконстантной ссылкой попытка подобного присвоения вызовет ошибку.. 
поэтому возможно так
Код

int f(const int& )
{
    const int cri& = 1; // можно
  
    return cri;  
}
f(2); // можно
const int cri = f(3);

но нельзя тоже самое с неконстантной :

Код

int f(int& )
{
    int ri& = 1; // нельзя
  
    return cri;  
}
f(2); // нельзя
int ri = f(3); // нельзя

в студии (помойму 2008) пошли "на встречу" пользователю и убрали несправедливость по отношению к обычной ссылке, позволяя к ней пристыковывать rvalue.. поэтому на ней вторая часть кода компилится "нормально" , что не позволяет проверить какой конструктор копий она генерит по умолчанию.. А также этим создает целый ряд неожидаемых и трудноуловиммых ошибок.. 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 10.7.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(bsa @  10.7.2011,  18:06 Найти цитируемый пост)
1. отличие кардинальное - тернарный оператор можно использовать в константных выражениях. Например, для метапрограммирования (программы этапа компиляции, "Современное программирование на С++", А. Александреску) и условной инициализации констант (в т.ч. и ссылок).

 smile 

Цитата(bsa @  10.7.2011,  18:06 Найти цитируемый пост)
3. массив будет заполнен "словами" (точнее, непробельными символами, которые изначально разделены пробельными) из потока.

это объявление прототипа функции.

Цитата(bsa @  10.7.2011,  18:06 Найти цитируемый пост)
6. генерируется конструктор, которому передается ссылка на константный объект 

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


Цитата(borisbn @  10.7.2011,  18:32 Найти цитируемый пост)
Можете пояснить, каким образом тернарный оператор незаменим в метапрограммировании ? Что вообще имеется в виду ?

http://liveworkspace.org/code/92ed0e2bdbf8...0dd43271d886de0
PM   Вверх
mes
Дата 11.7.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  10.7.2011,  22:52 Найти цитируемый пост)
Если один из членов класса имеет неконстантный аргумент конструктора копирования, то и сгенерированный будет неконстантным.

имелось ввиду не имеет константного ? 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 11.7.2011, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



azesmcar, спасибо, понял (про тернарный в константном выражении)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 11.7.2011, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Ну в общем-то практически на все вопросы уже ответили, но все равно сгруппировать стоит.
Кому хочется еще подумать можете не читать smile 

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
1. есть ли какие-то принципиальные различия между тернарным оператором и оператором if, если есть, то какие.

Тернарный оператор умеет работать на этапе компиляции и может быть использован в метапрограммировании. В этом и есть его принципиальное различие.

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
2. что будет выведено и почему?

Как верно заметили на первой странице, приоритет оператора присваивания выше приоритета оператора запятая. Потому здесь будет выведено 10:1

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
3. что делает этот код?

Это не вызов конструктора класса std::vector, это обявление прототипа функции по имени data, возвращающей std::vector<std::string> и принимающей два параметра типа std::istream_iterator<std::string> с именем формального параметра is и вторую, того же типа но без имени..скобки игнорируются. В C++ все, что может быть интерпретировано как объявление интерпретируется как объявление.

Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
4. что выведет код и почему?

Здесь все действительно просто. Вызывается оператор запятая, потому работает первая перегрузка.
Цитата(volatile @  10.7.2011,  00:08 Найти цитируемый пост)
Единица просто теряется


Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
5. есть ли разница между переменными x1, x2 и x3, x4. Если есть, то какая?

В случаях x2 и x4 структура инициализируется нулями.
Цитата

An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
...
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized


Цитата(azesmcar @  9.7.2011,  13:57 Найти цитируемый пост)
6. Какой конструктор копирования генерирует компилятор для класса при необходимости, с константной ссылкой или нет?

Здесь стоит рассказать побольше.
В C++ копирующим конструктором является конструктор, принимающий аргументом константную, либо обычную ссылку (+ все комбинации const и volatile) на объект своего типа. Если копирующий конструктор не написан пользователем, но необходим, компилятор попытается сгенерировать его сам. Сгенерированный конструктор копирования для класса
Код

struct A
{
   int x;
   int y;
};

будет иметь следующий вид
Код

A(const A& aref): x(aref.x), y(aref.y) {}

теперь заменим int x на какой нибудь класс X. В строчке x(aref.x) вызывается конструктор копирования для класса X, которому передается константная ссылка на объект класса X (константная, потому-что aref константа). В таком случае компилятор не сможет откомпилировать этот код и ему придется убрать константность аргумента копирующего конструктора класса A. Если вкратце, то константность аргумента копирующего конструктора решается компилятором в зависимости от константности аргументов конструкторов всех членов класса.


Это сообщение отредактировал(а) azesmcar - 11.7.2011, 09:15
PM   Вверх
bsa
Дата 11.7.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(azesmcar @  10.7.2011,  23:52 Найти цитируемый пост)
это объявление прототипа функции.

эх, черт. прозевал.
PM   Вверх
azesmcar
Дата 11.7.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(bsa @  11.7.2011,  10:31 Найти цитируемый пост)
эх, черт. прозевал. 

а ведь знал smile 
помню, что была тема с твоим участием.
PM   Вверх
bsa
Дата 11.7.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



azesmcar, почему-то в тесте для сыроежки я увидел, а здесь нет. Видимо, из-за того, что погнался сразу за ожидаемым результатом...
PM   Вверх
mes
Дата 11.7.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



в продолжение квеста :
сколько конструкторов копий имеет нижеследующая структура ? 
Код

struct A 
{
   A(A&);
   A();
   A(double);   
   A(const A&, int i=5);   
   А(A&, int, double d=4.4);
   A(int, const A&);
   A(double, A&);
};




Это сообщение отредактировал(а) mes - 11.7.2011, 12:55


--------------------
PM MAIL WWW   Вверх
xvr
Дата 11.7.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(mes @  11.7.2011,  12:54 Найти цитируемый пост)
сколько конструкторов копий имеет нижеследующая структура ? 

3

Маленькое замечание по тернарному ? и инициализации референсов. В большинстве случаев его можно заменить на if и тут, введя промежуточные указатели:
Код

int a,b;

int& c=f?a:b;

/////
int* tmp;
if (f) tmp=&a; else tmp=&b;
int& c=*tmp;

Исключение -
Код

class A;

A func1();
A func2();

const A& r = f?func1():func2();


PM MAIL   Вверх
azesmcar
Дата 11.7.2011, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(xvr @  11.7.2011,  13:10 Найти цитируемый пост)
3

а где третий?

если ты про
Цитата(mes @  11.7.2011,  12:54 Найти цитируемый пост)
A(double);   

то
Цитата

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other
parameters have default arguments (8.3.6).106) [Example: X::X(const X&) and X::X(X&, int=1)
are copy constructors.


Это сообщение отредактировал(а) azesmcar - 11.7.2011, 16:00
PM   Вверх
bsa
Дата 11.7.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(azesmcar @  11.7.2011,  15:46 Найти цитируемый пост)
а где третий?

mes, немного отредактировал код - изначально был конструктор типа А(A&, double d=4.4)
PM   Вверх
azesmcar
Дата 11.7.2011, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(bsa @  11.7.2011,  16:26 Найти цитируемый пост)
mes, немного отредактировал код - изначально был конструктор типа А(A&, double d=4.4) 

Ясно. Хотя тогда это была бы ошибка компиляции smile 

Это сообщение отредактировал(а) azesmcar - 11.7.2011, 16:37
PM   Вверх
mes
Дата 11.7.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bsa @  11.7.2011,  15:26 Найти цитируемый пост)
mes, немного отредактировал код - изначально был конструктор типа А(A&, double d=4.4) 

неправда smile при редактированнии удалил лишь лишний пробел.. аргументы конструкторов не трогал smile

Цитата(azesmcar @  11.7.2011,  14:46 Найти цитируемый пост)
а где третий?

третьего не было smile

Это сообщение отредактировал(а) mes - 11.7.2011, 20:33


--------------------
PM MAIL WWW   Вверх
bsa
Дата 11.7.2011, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



mes, странно. видимо, мне, как и xvr показалось...
PM   Вверх
xvr
Дата 12.7.2011, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(mes @  11.7.2011,  20:22 Найти цитируемый пост)
третьего не было

Третьего действительно не было. Я слегка невнимательно прочел вопрос  smile 3й был A::A(double); Это конечно не копи конструктор, но для присваивания объектам класса A double'ов он может пригодится  smile 


PM MAIL   Вверх
azesmcar
Дата 14.7.2011, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



продолжим
Код

#include <string>

class A {
public:
    A(const std::string& x) { /* специально для Сыроежки ... */ }
    std::string foo() { return "something"; }
};

class B : public A
{
    std::string x;
public:
    B(): A(x = foo()) {}
};

int main()
{
    B b;
}

есть ли проблемы в коде и если есть, то какие.
PM   Вверх
xvr
Дата 14.7.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Есть, как минимум 2:
  • Вызов A::foo до инициализации собственно класса A (хотя в данном примере оно и не сломается)
  • Инициализация базовых классов и мемберов будет проходить в порядке их описания в теле класса, т.е. сначала A потом x. Т.ч. присваивание в x в процессе вычисления параметра для конструктора A будет: во первых производится в неинициализированный экземпляр std::string, и во вторых это содержимое (полученное в std::string) будет уничтожено, т.к. конструктор (пустой) std::string все же будет вызван (но позже)
PS. В стандарт не смотрел, т.к. вне зависимости от того, сколько пунктов стандарта нарушает этот код, так писать нельзя  smile 


Это сообщение отредактировал(а) xvr - 14.7.2011, 10:56
PM MAIL   Вверх
azesmcar
Дата 14.7.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



xvr

все верно smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2607 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.