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

Что не так с этим кодом? - C++

Восстановить пароль Регистрация
 
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.02.2014, 14:46     Что не так с этим кодом? #1
Что не так с этим кодом?
C++
#include <stdio.h>
 
struct Texture
{
    unsigned int tex;
 
    Texture() { tex = 0; }
};
 
int main()
{
    Texture texture;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
19.02.2014, 14:48     Что не так с этим кодом? #2
А что с ним не так?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.02.2014, 14:51  [ТС]     Что не так с этим кодом? #3
Цитата Сообщение от Тамика Посмотреть сообщение
А что с ним не так?
А Скот Маерс ругается на этот код.

Добавлено через 2 минуты
Вот что он пишет:
Цитата Сообщение от Scott Meyers
warning: ‘Texture::tex’ should be initialized in the member initialization list
Только не понятно почему от так считает.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
19.02.2014, 14:52     Что не так с этим кодом? #4
Цитата Сообщение от programina Посмотреть сообщение
Texture(): tex(0){}
Да и неплохо бы сделать переменную tex приватной. А для получения tex - константную GetTex();
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.02.2014, 14:55  [ТС]     Что не так с этим кодом? #5
Цитата Сообщение от Тамика Посмотреть сообщение
Texture(): tex(0){}
Texture() { tex = 0; }
А какая между ними разница? ))
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
19.02.2014, 14:57     Что не так с этим кодом? #6
Переменна будет инициализирована до начала тела конструктора. Это не критично в данном случае. Но лучше делать так.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.02.2014, 14:59     Что не так с этим кодом? #7
Тошо не следует выполнять определение переменных внутри тела конструктора. Лучше пользоваться строкой инициализации.
Цитата Сообщение от programina Посмотреть сообщение
А какая между ними разница? ))
Дело в том, что строка инициализации вызывает конструкторы для соответствующих полей класса, а определение в теле конструктора вызывает оператор присваивания. Таким образом вы дважды определяете поля класса сперва конструкторами по умолчанию затем оператором присваивания.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.02.2014, 15:07  [ТС]     Что не так с этим кодом? #8
Цитата Сообщение от Ilot Посмотреть сообщение
Тошо не следует выполнять определение переменных внутри тела конструктора
для чего же тогда нужен конструктор если не для инициализации переменных?

Вобщем Скот Маерс идет лесом, я отключаю его опцию -Weffc++.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
19.02.2014, 15:15     Что не так с этим кодом? #9
Цитата Сообщение от programina Посмотреть сообщение
для чего же тогда нужен конструктор если не для инициализации переменных?
Вы должно быть не до конца поняли. При определении полей класса в теле конструктора сперва будут созданны эти переменные конструкторами по умолчанию, а затем им будет присвоено значение из тела конструктора. Если пользоваться строкой инициализации то для полей класса будут вызванны соответствующие конструкторы которые создадут переменные полей класса.
Попробуйте запустить два констуктора для В:
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
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
class A {
    int a;
public:
    A(): a()
    {
        cout << "Конструктор по умолчанию A()\n";
    }
    A(int _a): a(_a)
    {
        cout << "Конструктор A(int a)\n";
    }
    A& operator= (A& _a)
    {
        a = _a.a;
        cout << "Оператор присваения\n";
        return *this;
    }
};
class B
{
    A a_in_B;
public:
    B(A a)
    {
        a_in_B = a;
    }
    //B(A a): a_in_B(a) {}
};
int main() {
    system("chcp 1251>0");
    A a(10);
    B b(a);
    system("pause");
    return 0;
}
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
19.02.2014, 15:31     Что не так с этим кодом? #10
Таким образом вы дважды определяете поля класса сперва конструкторами по умолчанию затем оператором присваивания.
будут созданны эти переменные конструкторами по умолчанию
В данном случае поле tex встроенного типа в отсутствии списка инициализации инициализировано не будет (в отличии от пользовательских классов) и будет иметь неопределённое значение. По этому здесь оба случая (список инициализации или тело конструктора) полностью эквивалентны.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
19.02.2014, 16:44     Что не так с этим кодом? #11
Цитата Сообщение от programina Посмотреть сообщение
Вобщем Скот Маерс идет лесом, я отключаю его опцию -Weffc++.
Лучше почитать его книжки перед тем, как включать эту опцию
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 16:51     Что не так с этим кодом?
Еще ссылки по теме:

C++ что не так с кодом?
C++ что не так с кодом
C++ Подскажите что не так с кодом?

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

Или воспользуйтесь поиском по форуму:
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
19.02.2014, 16:51     Что не так с этим кодом? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от programina Посмотреть сообщение
Только не понятно почему от так считает.
Это результат неверного исполнения гайдлайна из Effective C++. Конкретно, это баг №16166 компилятора GCC http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16166#c3
Yandex
Объявления
19.02.2014, 16:51     Что не так с этим кодом?
Ответ Создать тему
Опции темы

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