Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
No10
30 / 28 / 4
Регистрация: 03.06.2010
Сообщений: 465
#1

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

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

Читал, читай книгу по C++. Что понял что нет. Пожалуйста помогите с такими вопросами:
- Для чего нужна операция "?:" ?, я этого не понял.
- пожалуйста обьясните русским языком что такое перегрузка операции... Ничего не понял по этому поводу.
-пожалуйста обьясните про работу операций New и Delete и чем они отличаются от обычного обьявиения переменной?
Пишите не стесняйтесь, буду рад абсолютно любому ответу, главное правильному.
Заранее спасибо!
http://www.cyberforum.ru/cpp-beginners/thread795105.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 23:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Непонятны некоторые операторы (C++):

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

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

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

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

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

21
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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 и чем они отличаются от обычного обьявиения переменной?
Это операции для динамического управления памятью. С их помощью можно выделить память как для одной переменной, так и для нескольких сотен/тысяч/миллионов/миллиардов переменных.
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
04.05.2012, 03:28 #3
Цитата Сообщение от lazybiz Посмотреть сообщение
Это когда функция/член класса с одним и тем же именем принимает и возвращает разные типы и их количество
Возвращаемый тип в перегрузке не участвует, только имя и типы параметров, т.е. такой код приведёт к ошибке:
C++
1
2
void f();
double f();
0
No10
30 / 28 / 4
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 06:41  [ТС] #4
блин, вы ответили как в книге.
Обьясните что такое перегруз операции? А то по вашему обьяснения я понял что это очень похоже на шаблон функции. И функция может принимать любые типы данных... В общем я окончательно запутался просто капец. Вообще каша какаято.0_о. Обьясните мне это как новичку, как вы это поймаете а не как в книге написано. Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных? А по поводу знака "?:"- тернарный оператор... Стало еще "понятней". Что значит тернарный?
0
amfisat
67 / 67 / 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
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.05.2012, 10:38 #7
Что New и Delete это динамическое распредиление памяти я прекрасно знаю. Я не могу понять почему именно оно динамичное и чем это отличается от обьявиения обычных переменных?
Что значит чем? В программе нужно создать массив интов из n элементов, n к примеру вводится с клавиатуры. Написать int a[n] мы не можем (ну точнее в С99 можем, но мы же сейчас о С++), поэтому, чтобы создать массив из n элементов пишем int* a = new int[n], теперь а указатель на начало массива из n элементов. delete[] a - очистит память выделенную под этот массив в куче.
0
diagon
Higher
1937 / 1203 / 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
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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;
}
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:46 #10
Цитата Сообщение от lazybiz Посмотреть сообщение
Да что ты говоришь. А почему нижеприведенный код у меня отлично работает?
Потому что первая функция принимает void, т.е. ничего, а вторая - int.
А на типы параметров перегрузка распространяется...
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
04.05.2012, 11:50 #11
diagon, Я это прекрасно понимаю, мне это не надо объяснять. Объясни это тому кто сказал что "Возвращаемый тип в перегрузке не участвует"
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 11:51 #12
Правильно он все сказал.
C++
1
2
int foo();
void foo();
Такое не скомпилируется, ибо различаются только типы возвращаемых значений
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.05.2012, 11:52 #13
lazybiz, Возвращаемый тип не учавствует. Именно поэтому вы получите ошибку при попытке сделать

C++
1
2
3
4
5
6
7
void func() { }
bool func() { }
 
int main()
{
   func();
}
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
04.05.2012, 12:09 #14
Он "не участвует", но перегруженные функции могут возвращать разные значения...
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.05.2012, 12:24 #15
lazybiz, Могут. Никто не говорил, что не могут. Говорили, что возвращаемый тип не участвует.
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
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
1
No10
30 / 28 / 4
Регистрация: 03.06.2010
Сообщений: 465
04.05.2012, 20:24  [ТС] #17
diagon, выведется third. Я без компилятора. Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
0
Bers
Заблокирован
04.05.2012, 21:36 #18
Цитата Сообщение от No10 Посмотреть сообщение
Потому что функция foo принимает указатель на int в не на T. Если я не прав, обьясни почему и поподробней если сможешь)
Когда компиль встречает вызов функции, ему нужно понять: какую именно функцию дернуть.
Он начинает анализировать сигнатуру функций, в которую входят имя функции, и типы её аргументов.

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

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

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

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

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

Добавлено через 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
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.05.2012, 12:16 #20
diagon, Ну там то понятно что второй. Тут третий. Т.к. в том случае функция которая принимает int* обязана так же принять шаблонный параметр, а т.к. мы не передаем шаблонный параметр, то эта функция в выборе просто не учавствует. А в этом третий, потому как уже объяснил Bers.
0
05.05.2012, 12:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2012, 12:16
Привет! Вот еще темы с решениями:

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

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

Определить и вывести количество дней между двумя датами (логические операторы и операторы ветвлений)
Задачка Пользователь вводит две даты (день, месяц, год в виде целых чисел)....

«Языки и технологии программирования» «Операторы цикла. Условные операторы»
Не получается сделать что бы программа выводила все значения в промежутке, она...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru