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

Особенности Visual Studio 2010 - C++

Восстановить пароль Регистрация
 
 
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 00:57     Особенности Visual Studio 2010 #1
Всем привет. Вопрос знатокам С/C++.

Мы знаем, что, взять например язык С:
1) Компилятор языка при присвоении одной переменной одного типа другой переменной другого типа, где возможна потеря данных не требует явного привидения типов, но выдаст предупреждение, хотя в такой же ситуации компилятор
С++ выдаст ошибку.

Вот например:

C++
1
2
3
4
5
6
/* Какой-то код */
// .. где-то внутри функции main
int *pdm;
// ...
pdm = malloc(100 * sizeof(int));
// ...
По идее компилятор С должен выдать предупреждение, однако компилируя этот код в VS2010 компилятор выдает мне ошибку и не компилирует.
Требует писать как в С++:
C++
1
pdm = (int *)malloc(100 * sizeof(int));
При этом файл назывался так - proc.c.

2) Еще один пример касаемо именно С++. При создании, если самому не определять конструктор, то его должен неявно определить компилятор, но если мы сами вручную его определяем, то именно он и должен работать...
Однако с точки зрения компилятора это почему-то не так...

C++
1
2
3
4
5
6
class T {
    int i;
public:
    T(int x) { i = x; }
    int get_i() { return i; }
};
Однако при таком объявлении класса, создать его объект таким образом представляется возможным:

C++
1
T test_obj;
То есть получается VS2010 сам еще неявно создает конструктор для неинициализированного объекта?
Спасибо за внимание!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 00:57     Особенности Visual Studio 2010
Посмотрите здесь:

C++ Visual Studio 2010
C++ Visual Studio 2010
C++ Visual Studio 2010
C++ c++, visual studio 2010! 1.
c++, visual studio 2010! 2. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:08     Особенности Visual Studio 2010 #2
Цитата Сообщение от ASCII Посмотреть сообщение
1) Компилятор языка при присвоении одной переменной одного типа другой переменной другого типа, где возможна потеря данных не требует явного привидения типов, но выдаст предупреждение, хотя в такой же ситуации компилятор
С++ выдаст ошибку.
В чем вопрос-то? Языки разные - С++ и С.
Цитата Сообщение от ASCII Посмотреть сообщение
C++
1
2
3
4
5
6
class T {
 int i;
public:
 T(int x) { i = x; }
 int get_i() { return i; }
};
Однако при таком объявлении класса, создать его объект таким образом представляется возможным:
C++
1
T test_obj;
Если это так, то это ошибка компилятора. В чем я сомневаюсь, поэтому делаю вывод, что это твоя ошибка.
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:16  [ТС]     Особенности Visual Studio 2010 #3
Цитата Сообщение от ASCII Посмотреть сообщение
C++
1
2
3
4
5
6
/* Какой-то код */
// .. где-то внутри функции main
int *pdm;
// ...
pdm = malloc(100 * sizeof(int));
// ...
Короче говоря, в чистом С, такой код должен компилироваться, а в С++ - нет, в VS2010 он же не компилируется, хотя файл , а значит и запускаться должен компилятор языка С. Так вот почему так?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:20     Особенности Visual Studio 2010 #4
Цитата Сообщение от ASCII Посмотреть сообщение
Так вот почему так?
Потому что у тебя что-то неверно сделано. Если создавать пустой проект и добавить туда файл .c, то все будет работать as expected и компилироваться будет сишным компилятором.
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:21  [ТС]     Особенности Visual Studio 2010 #5
Цитата Сообщение от Vourhey Посмотреть сообщение
Если это так, то это ошибка компилятора. В чем я сомневаюсь, поэтому делаю вывод, что это твоя ошибка.
Ты сам то обрати внимание, где там может быть ошибка? Есть класс, в нем есть конструктор с 1 аргументом, однако можно создать объект этого класса неинициализированным. Проверь в VS2010 и убедишься... Так ведь не должно быть в стандарте С++ не так ведь. Во всех книгах которые я читал написано это.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.08.2014, 01:21     Особенности Visual Studio 2010 #6
ASCII, касательно второго примера - ты определил конструктор, принимающий int, а проверяешь его , создавая объект класса T, не передавая ему в конструктор ничего. Сл-но вызывается неявно сгенерированный конструктор по умолчанию, а не твой с одним параметром типа int. Обычно такую экзотику надо явно засвидетельствовать, чтобы читающие твой код не впадали в замешательство:
C++
1
2
3
4
5
6
7
class T {
    int i;
public:
    T() = default; // <- вот так
    T(int x) { i = x; }
    int get_i() { return i; }
};
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:22  [ТС]     Особенности Visual Studio 2010 #7
Цитата Сообщение от Vourhey Посмотреть сообщение
Потому что у тебя что-то неверно сделано. Если создавать пустой проект и добавить туда файл .c, то все будет работать as expected и компилироваться будет сишным компилятором.
Я так и делал, но результат такой, как я описал.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:23     Особенности Visual Studio 2010 #8
Цитата Сообщение от gromo Посмотреть сообщение
Сл-но вызывается неявно сгенерированный конструктор по умолчанию, а не твой с одним параметром типа int.
Не должно быть никаких неявно сгенерированных конструкторов, когда есть конструктор с параметрами.

Добавлено через 45 секунд
Цитата Сообщение от ASCII Посмотреть сообщение
Я так и делал, но результат такой, как я описал.
Я делал так же когда-то, и все было ок.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.08.2014, 01:23     Особенности Visual Studio 2010 #9
Цитата Сообщение от ASCII Посмотреть сообщение
хотя файл .с, а значит и запускаться должен компилятор языка С.
Можно "заставить" компилировать как С-код (опция -Tc вроде)
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:23  [ТС]     Особенности Visual Studio 2010 #10
Цитата Сообщение от gromo Посмотреть сообщение
касательно второго примера - ты определил конструктор, принимающий int, а проверяешь его , создавая объект класса T, не передавая ему в конструктор ничего. Сл-но вызывается неявно сгенерированный конструктор по умолчанию, а не твой с одним параметром типа int.
Но в стандарте С++ сказано иначе. Грубо говоря стандарт говорит, если программист сам взялся за создание конструктора, то я(компилятор) за это больше не отвечаю, конструктор генерировать не буду, тк он(программист) сам его написал...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:24     Особенности Visual Studio 2010 #11
Цитата Сообщение от ASCII Посмотреть сообщение
Проверь в VS2010 и убедишься...
Я знаю, что компилироваться пример не будет, зачем мне это лишний раз проверять.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
12.08.2014, 01:25     Особенности Visual Studio 2010 #12
Цитата Сообщение от ASCII Посмотреть сообщение
Но в стандарте С++ сказано иначе. Грубо говоря стандарт говорит, если программист сам взялся за создание конструктора, то я(компилятор) за это больше не отвечаю, конструктор генерировать не буду, тк он(программист) сам его написал...
Видимо, у Вас у одного такая ошибка, никогда такого не наблюдал. Да, нарывался на баги в студийном компиляторе, но не на такие.

P.S. Ничего там студия не компилирует
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:25  [ТС]     Особенности Visual Studio 2010 #13
Цитата Сообщение от Vourhey Посмотреть сообщение
Я делал так же когда-то, и все было ок.
Я могу скинуть скрин.
Цитата Сообщение от Vourhey Посмотреть сообщение
Не должно быть никаких неявно сгенерированных конструкторов, когда есть конструктор с параметрами.
Наверное в микрософте считают иначе.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:26     Особенности Visual Studio 2010 #14
Цитата Сообщение от ASCII Посмотреть сообщение
Я могу скинуть скрин.
Я тоже.
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:26  [ТС]     Особенности Visual Studio 2010 #15
Странно однако... Ну ладно, благодарю всех за внимание!
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:27     Особенности Visual Studio 2010 #16
Цитата Сообщение от ASCII Посмотреть сообщение
Наверное в микрософте считают иначе.
Вот, блин, из-за тебя студию теперь поднимать, примеры твои копировать... На.
Особенности Visual Studio 2010
VS 2013, компилятор майкрософтский.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
12.08.2014, 01:33     Особенности Visual Studio 2010 #17
ASCII,
12 /1
The default constructor (12.1), copy constructor and copy assignment operator (12.8), move constructor
and move assignment operator (12.8), and destructor (12.4) are special member functions. [ Note: The
implementation will implicitly declare these member functions for some class types when the program does
not explicitly declare them.
Добавлено через 3 минуты
Хм... на gcc тоже нельзя создать default-constructed объект класа T.
Ведь написано в стандарте, что к спец. функциям-членам относится только конструктор по умолчанию ( и никакие другие конструкторы) и если он, конструктор по умолчанию, не определен явно, то должен быть сформирован неявно компилятором.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:34     Особенности Visual Studio 2010 #18
Цитата Сообщение от gromo Посмотреть сообщение
ASCII,
12 /1
The default constructor (12.1), copy constructor and copy assignment operator (12.8), move constructor
and move assignment operator (12.8), and destructor (12.4) are special member functions. [ Note: The
implementation will implicitly declare these member functions for some class types when the program does
not explicitly declare them.
Note that the default constructor dissappears when you define a constructor requiring arguments.
.....
ASCII
 Аватар для ASCII
82 / 54 / 8
Регистрация: 15.12.2013
Сообщений: 369
Завершенные тесты: 2
12.08.2014, 01:35  [ТС]     Особенности Visual Studio 2010 #19
хм, то ли я действительно что-то не так делаю...
Миниатюры
Особенности Visual Studio 2010  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 01:35     Особенности Visual Studio 2010
Еще ссылки по теме:

c++, visual studio 2010! 6. C++
c++, visual studio 2010! 7 C++
Visual studio 2010 C++

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

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.08.2014, 01:35     Особенности Visual Studio 2010 #20
Цитата Сообщение от gromo Посмотреть сообщение
Хм... на gcc тоже нельзя создать default-constructed объект класа T.
Удивительно, да
Yandex
Объявления
12.08.2014, 01:35     Особенности Visual Studio 2010
Ответ Создать тему
Опции темы

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