Форум программистов, компьютерный форум CyberForum.ru

Непонятны некоторые операторы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
03.05.2012, 23:03     Непонятны некоторые операторы #1
Читал, читай книгу по C++. Что понял что нет. Пожалуйста помогите с такими вопросами:
- Для чего нужна операция "?:" ?, я этого не понял.
- пожалуйста обьясните русским языком что такое перегрузка операции... Ничего не понял по этому поводу.
-пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
Пишите не стесняйтесь, буду рад абсолютно любому ответу, главное правильному.
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 23:03     Непонятны некоторые операторы
Посмотрите здесь:

Написать программу, используя операторы циклов и операторы ветвления C++
C++ Главная функция (вводит некоторые значения и передает их и ссылки на некоторые переменные в функцию)
Непонятны некоторые функции C++
C++ Шейкер Сортировка! Непонятны некоторые моменты
С++.Операторы в С++: условные операторы, операторы break и continue C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
03.05.2012, 23:13     Непонятны некоторые операторы #2
- Для чего нужна операция "?:" ?, я этого не понял.
Это тернарный оператор - http://ru.wikipedia.org/wiki/%D0%A2%...86%D0%B8%D1%8F

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

Добавлено через 4 минуты
Цитата Сообщение от No10 Посмотреть сообщение
- пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
Это операции для динамического управления памятью. С их помощью можно выделить память как для одной переменной, так и для нескольких сотен/тысяч/миллионов/миллиардов переменных.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.05.2012, 03:28     Непонятны некоторые операторы #3
Цитата Сообщение от lazybiz Посмотреть сообщение
Это когда функция/член класса с одним и тем же именем принимает и возвращает разные типы и их количество
Возвращаемый тип в перегрузке не участвует, только имя и типы параметров, т.е. такой код приведёт к ошибке:
C++
1
2
void f();
double f();
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 06:41  [ТС]     Непонятны некоторые операторы #4
блин, вы ответили как в книге.
Обьясните что такое перегруз операции? А то по вашему обьяснения я понял что это очень похоже на шаблон функции. И функция может принимать любые типы данных... В общем я окончательно запутался просто капец. Вообще каша какаято.0_о. Обьясните мне это как новичку, как вы это поймаете а не как в книге написано. Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных? А по поводу знака "?:"- тернарный оператор... Стало еще "понятней". Что значит тернарный?
amfisat
 Аватар для amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 235
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-мя переменными.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.05.2012, 10:38     Непонятны некоторые операторы #7
Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных?
Что значит чем? В программе нужно создать массив интов из n элементов, n к примеру вводится с клавиатуры. Написать int a[n] мы не можем (ну точнее в С99 можем, но мы же сейчас о С++), поэтому, чтобы создать массив из n элементов пишем int* a = new int[n], теперь а указатель на начало массива из n элементов. delete[] a - очистит память выделенную под этот массив в куче.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 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);
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
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;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:46     Непонятны некоторые операторы #10
Цитата Сообщение от lazybiz Посмотреть сообщение
Да что ты говоришь. А почему нижеприведенный код у меня отлично работает?
Потому что первая функция принимает void, т.е. ничего, а вторая - int.
А на типы параметров перегрузка распространяется...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
04.05.2012, 11:50     Непонятны некоторые операторы #11
diagon, Я это прекрасно понимаю, мне это не надо объяснять. Объясни это тому кто сказал что "Возвращаемый тип в перегрузке не участвует"
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:51     Непонятны некоторые операторы #12
Правильно он все сказал.
C++
1
2
int foo();
void foo();
Такое не скомпилируется, ибо различаются только типы возвращаемых значений
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.05.2012, 11:52     Непонятны некоторые операторы #13
lazybiz, Возвращаемый тип не учавствует. Именно поэтому вы получите ошибку при попытке сделать

C++
1
2
3
4
5
6
7
void func() { }
bool func() { }
 
int main()
{
   func();
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
04.05.2012, 12:09     Непонятны некоторые операторы #14
Он "не участвует", но перегруженные функции могут возвращать разные значения...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.05.2012, 12:24     Непонятны некоторые операторы #15
lazybiz, Могут. Никто не говорил, что не могут. Говорили, что возвращаемый тип не участвует.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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/ObjectsAndPointers.xml
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 20:24  [ТС]     Непонятны некоторые операторы #17
diagon, выведется third. Я без компилятора. Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
Bers
Заблокирован
04.05.2012, 21:36     Непонятны некоторые операторы #18
Цитата Сообщение от No10 Посмотреть сообщение
Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
Когда компиль встречает вызов функции, ему нужно понять: какую именно функцию дернуть.
Он начинает анализировать сигнатуру функций, в которую входят имя функции, и типы её аргументов.

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

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

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

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

Итого: 3й вариант (не проверял, но я так думаю(!) ) Потому что у этого шаблона аргумент из параметра шаблона выводить не нужно.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.05.2012, 08:55     Непонятны некоторые операторы #19
Цитата Сообщение от No10 Посмотреть сообщение
выведется third
Цитата Сообщение от Bers Посмотреть сообщение
3й вариант
http://liveworkspace.org/code/a66c54...41d8d769fbbb77

Добавлено через 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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2012, 12:16     Непонятны некоторые операторы
Еще ссылки по теме:

Создать класс "Триада" и перегрузить некоторые операторы C++
C++ Непонятны функции
Не работает swap и непонятны некоторые строки в программе C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.05.2012, 12:16     Непонятны некоторые операторы #20
diagon, Ну там то понятно что второй. Тут третий. Т.к. в том случае функция которая принимает int* обязана так же принять шаблонный параметр, а т.к. мы не передаем шаблонный параметр, то эта функция в выборе просто не учавствует. А в этом третий, потому как уже объяснил Bers.
Yandex
Объявления
05.05.2012, 12:16     Непонятны некоторые операторы
Ответ Создать тему
Опции темы

Текущее время: 04:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru