Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
1

Непонятны некоторые операторы

03.05.2012, 23:03. Показов 2014. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Читал, читай книгу по C++. Что понял что нет. Пожалуйста помогите с такими вопросами:
- Для чего нужна операция "?:" ?, я этого не понял.
- пожалуйста обьясните русским языком что такое перегрузка операции... Ничего не понял по этому поводу.
-пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
Пишите не стесняйтесь, буду рад абсолютно любому ответу, главное правильному.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2012, 23:03
Ответы с готовыми решениями:

Непонятны некоторые функции
Непонятны следующие функции, что они выполняют: (char)((int)('a')+j)) break; // что значит эта...

Шейкер Сортировка! Непонятны некоторые моменты
Столкнулся с задачей реализации Шейкер сортировки .Почитал теорию и понял , что она очень похожа на...

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

Создать класс "Триада" и перегрузить некоторые операторы
1) Создать базовый класс "Триада" (три числа). Определить методы: конструктор, виртуальные функции...

21
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
03.05.2012, 23:13 2
- Для чего нужна операция "?:" ?, я этого не понял.
Это тернарный оператор - http://ru.wikipedia.org/wiki/%... 0%B8%D1%8F

Добавлено через 1 минуту
Цитата Сообщение от No10 Посмотреть сообщение
- пожалуйста обьясните русским языком что такое перегрузка операции
Это когда функция/член класса с одним и тем же именем принимает и возвращает разные типы и их количество (для каждой перегрузки определяется своя функция/член класса)

Добавлено через 4 минуты
Цитата Сообщение от No10 Посмотреть сообщение
- пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
Это операции для динамического управления памятью. С их помощью можно выделить память как для одной переменной, так и для нескольких сотен/тысяч/миллионов/миллиардов переменных.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
04.05.2012, 03:28 3
Цитата Сообщение от lazybiz Посмотреть сообщение
Это когда функция/член класса с одним и тем же именем принимает и возвращает разные типы и их количество
Возвращаемый тип в перегрузке не участвует, только имя и типы параметров, т.е. такой код приведёт к ошибке:
C++
1
2
void f();
double f();
0
32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 06:41  [ТС] 4
блин, вы ответили как в книге.
Обьясните что такое перегруз операции? А то по вашему обьяснения я понял что это очень похоже на шаблон функции. И функция может принимать любые типы данных... В общем я окончательно запутался просто капец. Вообще каша какаято.0_о. Обьясните мне это как новичку, как вы это поймаете а не как в книге написано. Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных? А по поводу знака "?:"- тернарный оператор... Стало еще "понятней". Что значит тернарный?
0
70 / 70 / 36
Регистрация: 16.06.2009
Сообщений: 240
04.05.2012, 08:37 5
C++
1
2
int a = 2, b = 4;
int c = (a>b)?a:b;
Принцип работы: проверяется условие до "?" - если оно верно (в данном случае нет, ибо a не больше b), то выполняется код до ":", а если условие ложно - выполняется то, что стоит после ":" (в данном случае условие ложно и выполнится код c = b - можно запустить программу и посмотреть: c = 4. Кстати, если условие ложно, то на код, стоящий перед ":" и после "?", не обращается внимания при выполнении - его как бы нет; и наоборот: если бы условие было бы истинным, то код после ":" игнорился бы. ).

Тернарный оператор - оператор, который выполняет действия с 3-мя переменными.
2
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.05.2012, 08:39 6
Цитата Сообщение от No10 Посмотреть сообщение
Обьясните что такое перегруз операции?
Две разных функции могут иметь одинаковое имя, тогда они называются перегруженными. Например:
C++
1
2
3
4
5
6
7
8
9
10
void foo(int x) {
}
 
void foo(const std::string &x) {
}
 
int main() {
    foo(5);
    foo("string");  
}
Две разных функции с одинаковым именем. Компилятор сам выберет подходящую.
Цитата Сообщение от No10 Посмотреть сообщение
Что значит тернарный?
Операции бывают унарные, бинарные и тернарные. Унарный имеют один аргумент, например инкремент или унарный минус. Бинарные - два аргумента, например арифметические сложение/умножение/деление и т.д. И, наконец, тернарные имеют три аргумента (Условие ? Выражение 1 : Выражение 2). Грубо говоря тернарный оператор это некий аналог конструкции if-else, за исключением того, что if-else это не оператор.
Код
if (Условие)
	Выражение 1
else
	Выражение 2
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.05.2012, 10:38 7
Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных?
Что значит чем? В программе нужно создать массив интов из n элементов, n к примеру вводится с клавиатуры. Написать int a[n] мы не можем (ну точнее в С99 можем, но мы же сейчас о С++), поэтому, чтобы создать массив из n элементов пишем int* a = new int[n], теперь а указатель на начало массива из n элементов. delete[] a - очистит память выделенную под этот массив в куче.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 10:52 8
Цитата Сообщение от No10 Посмотреть сообщение
это очень похоже на шаблон функции
Не, шаблоны функций посложнее будут.
Для примера, попробуйте сказать без компилятора, какая надпись выведется на экран в результате исполнения этой программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
template < class T >
void foo( T )
{
    std::cout << "first";
}
 
template < class T >
void foo( T* )
{
    std::cout << "second";
}
 
template < class T >
void foo( int * )
{
    std::cout << "third";
}
 
 
int main()
{
    int *x;
    foo(x);
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.05.2012, 11:42 9
Цитата Сообщение от gray_fox Посмотреть сообщение
Возвращаемый тип в перегрузке не участвует, только имя и типы параметров
Да что ты говоришь. А почему нижеприведенный код у меня отлично работает?
C++
1
2
3
4
5
6
7
8
9
int test()
{
    return a;
}
 
void test( int v )
{
    a = v;
}
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:46 10
Цитата Сообщение от lazybiz Посмотреть сообщение
Да что ты говоришь. А почему нижеприведенный код у меня отлично работает?
Потому что первая функция принимает void, т.е. ничего, а вторая - int.
А на типы параметров перегрузка распространяется...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.05.2012, 11:50 11
diagon, Я это прекрасно понимаю, мне это не надо объяснять. Объясни это тому кто сказал что "Возвращаемый тип в перегрузке не участвует"
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:51 12
Правильно он все сказал.
C++
1
2
int foo();
void foo();
Такое не скомпилируется, ибо различаются только типы возвращаемых значений
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.05.2012, 11:52 13
lazybiz, Возвращаемый тип не учавствует. Именно поэтому вы получите ошибку при попытке сделать

C++
1
2
3
4
5
6
7
void func() { }
bool func() { }
 
int main()
{
   func();
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
04.05.2012, 12:09 14
Он "не участвует", но перегруженные функции могут возвращать разные значения...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.05.2012, 12:24 15
lazybiz, Могут. Никто не говорил, что не могут. Говорили, что возвращаемый тип не участвует.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
04.05.2012, 14:20 16
Цитата Сообщение от No10 Посмотреть сообщение
- Для чего нужна операция "?:" ?, я этого не понял.
Это конструкция if-then-else(или тернарный оператор, как уже было сказано выше). Например, результатом выражения a < b ? "a < b" : "a >= b" будет строка "a < b", если a < b, и "a >= b" в противном случае. Используется это в основном при инициализации объектов. Например, есть у нас такой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class some_class
{
    public:
        // конструктор без параметров
        some_class()
        {
            std::cout << "some_class()\n";
        }
 
        // конструктор с параметром
        some_class(const char*)
        {
            std::cout << "some_class(const char*)\n";
        }
 
        // оператор присваивания
        some_class& operator = (const char*)
        {
            std::cout << "some_class& operator = (const char*)\n";
            return *this;
        }
};
и два варианта кода в каждом из которых происходит присваивание перменной sc некоторого значение в зависимости от условия
1)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//...
int main()
{
    int a;
    std::cin >> a;
 
    int b;
    std::cin >> b;
 
    some_class sc;
    if(a < b)
        sc = "a < b";
    else
        sc = "a >= b";
    
    // работаем дальше с переменной sc...
}
2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//,,,
int main()
{
    int a;
    std::cin >> a;
 
    int b;
    std::cin >> b;
 
    some_class sc = a < b ? "a < b" : "a >= b";    
    
    // работаем дальше с переменной sc...
}
если в первом случае нам понадобился конструтор без параметров и оператор присваивания, то во втором случае только конструктор с параметром.
Цитата Сообщение от No10 Посмотреть сообщение
- пожалуйста обьясните русским языком что такое перегрузка операции... Ничего не понял по этому поводу.
перегрузка операции(оператора) это назначение встроенному оператору C++ определённого поведения при использовании его с пользовательскими типами(классами). Например, выше для класса some_class перегружен оператор присваивания(operator = ). Т.е. определена специальная функция, которая будет вызвана при попытке присвоить объекту типа some_class значение переменной типа const char*(в нашем случае это просто вывод сообщения на экран). Для каждого типа, который будет стоять справа от оператора присваивания можно определить свою функцию. В отличии от простых функций операторы можно перегружать только по типу параметров. Подробнее обо всём этом можно прочесть в любой книге по C++.
Цитата Сообщение от No10 Посмотреть сообщение
-пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
http://www.rsdn.ru/article/cpp... inters.xml
1
32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 20:24  [ТС] 17
diagon, выведется third. Я без компилятора. Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
0
Заблокирован
04.05.2012, 21:36 18
Цитата Сообщение от No10 Посмотреть сообщение
Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
Когда компиль встречает вызов функции, ему нужно понять: какую именно функцию дернуть.
Он начинает анализировать сигнатуру функций, в которую входят имя функции, и типы её аргументов.

Это не тривиальный затратный процесс. Назовем его "конкурсом".
"Конкурс" имеет "ленивую" природу. Что бы сократить время на парсинг, все, что можно не делать - не делается.

Поэтому, сначала анализируются самые простые претенденты - обычные функции. И только потом - шаблоны функций.

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

Поэтому, среди претендентов первыми анализируются те шаблоны функции, у которых можно быстрее вывести тип аргумента. И если среди них претендент не найден, только в самую последнюю очередь производится полный вывод типов из всех остальных.

Итого: 3й вариант (не проверял, но я так думаю(!) ) Потому что у этого шаблона аргумент из параметра шаблона выводить не нужно.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.05.2012, 08:55 19
Цитата Сообщение от No10 Посмотреть сообщение
выведется third
Цитата Сообщение от Bers Посмотреть сообщение
3й вариант
http://liveworkspace.org/code/... d769fbbb77

Добавлено через 8 минут
И еще один вариант кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
template < class T >
void foo( T )
{
    std::cout << "first";
}
 
template < class T >
void foo( T* )
{
    std::cout << "second";
}
 
template <>
void foo< int * > ( int * )
{
    std::cout << "third";
}
 
 
int main()
{
    int *x;
    foo(x);
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.05.2012, 12:16 20
diagon, Ну там то понятно что второй. Тут третий. Т.к. в том случае функция которая принимает int* обязана так же принять шаблонный параметр, а т.к. мы не передаем шаблонный параметр, то эта функция в выборе просто не учавствует. А в этом третий, потому как уже объяснил Bers.
0
05.05.2012, 12:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2012, 12:16
Помогаю со студенческими работами здесь

С++.Операторы в С++: условные операторы, операторы break и continue
Выяснить, пересекаются ли параболы у=аx2+bx+с и у=dx2+ex + f. При положительном ответе найти точки...

Непонятны функции
Или ссылку на нее..

Непонятны алгоритмы программ
Объясните, не пойму логику как работают эти 3 программы, есть догадки, но все равно не пойму,кто...

Непонятны разные функции библиотеки cctype
Код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cctype&gt; void strcount(const std::string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru