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

Способ создания экземпляра класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сортировка массива структур http://www.cyberforum.ru/cpp-beginners/thread1103692.html
Есть массив структур, где вводятся фио, город проживания и балл. Нужно отсортировать массив структур по баллу. Используется сортировка qsort. Возникли ошибки, не могу понять как исправить. Хелп плз. #include <iostream.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h>
C++ Работа с матрицей (в матрице найти первую по очереди строку с максимальной суммой элементов) Помогите пожалуйста с задаче. С матрицы получить компоненты вектора X = (Xi). А именно : в матрице найти первую по очереди строку с максимальной суммой элементов. Вектор X получить из найденной строки циклической сдвигом его элементов на две позиции влево. Элементы матрицы заполнялись по формуле : 2.5*i+8.75*j-j-3. Вот мои наработки : #include <iostream> #include <stdio.h> using namespace... http://www.cyberforum.ru/cpp-beginners/thread1103682.html
В слове переставить буквы у обратном порядке алфавит C++
В слове "Е Л Е К Т Р О Н И К А" переставить буквы у обратном порядке алфавита.... не пойму как реализовать...
C++ Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));, то вылетает ошибка Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC. #include <iostream> #include <string.h> #include <ctime> using namespace std; int main() { char...
C++ Как дозаписать элемент в list http://www.cyberforum.ru/cpp-beginners/thread1103669.html
Имеется структура : struct InverseIndex { int NumberOfWorld;//Номер слова string Word; //само слово set <int> SetOfDocuments;//список документов, где встречалось слово }; и list этих структур:
C++ Сформировать одномерный массив. Удалить из него К элементов, начиная с заданного номера, добавить элемент с заданным ключом Сформировать одномерный массив. Удалить из него К элементов, начиная с заданного номера, добавить элемент с заданным ключом. подробнее

Показать сообщение отдельно
DrOffset
6428 / 3802 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
24.02.2014, 20:14     Способ создания экземпляра класса
В общем ситуация оказалась несколько сложнее.
Во-первых я был не прав в своей оценке поведения согласно стандарту С++03.
Итак, для начала разберемся что такое POD:
9/4
A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct,
non-POD-union (or array of such types) or reference, and has no user-defined copy assignment operator
and no user-defined destructor.
Смотрим что такое aggregate class:
8.5.1/1
An aggregate is an array or a class (clause 9) with no user-declared constructors (12.1), no private or pro-
tected non-static data members
(clause 11), no base classes (clause 10), and no virtual functions (10.3).
Эти пункты эквивалентны для стандартов С++03 и С++98. Из них следует, что класс объявленный так:
C++
1
2
3
4
class A
{
    int a;
};
НЕ является POD-классом. И это действительно так, согласно вышеупомянутых стандартов (С++11 пока не касаемся).
Tulosba предположил, что в примере:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
    int a;
    friend void f( A* a );
};
 
void f( A* a ) 
{
    std::cout << a->a << std::endl; 
}
 
int main() {
 
    A* a = new A(); 
    f( a );
}

Не будет вследствие этого выполняться инициализация поля a и я согласился с этим. Как оказалось - это не так.
В стандарте С++03 есть три типа инициализации: zero-initialization, default-initialization и value-initialization.
В рамках стандарта С++03 вышеуказанный пример приводит как раз к value-initialization. Т.к. тип не является POD и отсутствует user-defined конструктор копирования.
8.5/5
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;

— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized
Именно второй пункт подходит под наш случай. И т.к.:
8.5/7
An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
мы видим, что инициализация нулем в этом случае абсолютно правомерна. Однако, если добавить виртуальную функцию в VS2012, то инициализация нулем перестанет работать. Это и есть баг компилятора по отношению, к стандарту С++03 - т.к. с точки зрения вышеуказанных пунктов ничего не изменилось. Почему так происходит? Потому что студия продолжает в этом плане действовать в рамках стандарта С++98, в котором было только два типа инициализации: zero-initialization и default-initialization.
Параграф 8.5/5 имел другой вид (отсутствовала value-initialization, вместо нее в этом случае использовалась default-initialization):
To default-initialize an object of type T means:
if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);

— if T is an array type, each element is default-initialized;
— otherwise, the storage for the object is zero-initialized.
и условие, которое его активировало тоже 8.5/7:
An object whose initializer is an empty set of parentheses, i.e., (), shall be default-initialized.
Следовательно можно сделать вывод, что мусор в переменной a, если рассматривать стандарт С++98, должен быть в обоих случаях (с виртуальной функцией и без). Если рассматривать стандарт С++03, то мусор при наличии () должен появиться только если определен конструктор не проводящий инициализацию поля а. В GCC, к слову сказать, инициализация нулем проходит (наличие вирт. функции, приватных полей, все, кроме явно опр. конструктора), даже в режиме С++98, что тоже неверно.

Исходя и вышесказанного можно рассмотреть такой пример:
C++
1
2
3
4
5
6
// POD
struct A { int a; }; 
// не-POD, конструктор по-умолчанию сгенерирован компилятором
struct B { virtual void foo() {}; int a; }; 
// не-POD, инициализация по-умолчанию переменной а
struct C { C() : a() {}; int a; };
В С++98 это приводит:
C++
1
2
3
4
5
6
7
8
new A;   // нет инициализации, в a - мусор
new A(); // zero-initialization, в a - ноль
 
new B;   // default-initialization, a - мусор
new B(); // default-initialization, а - мусор
 
new C;   // default-initialization, а - ноль
new C(); // default-initialization, а - ноль
В С++03 немного иначе:
C++
1
2
3
4
5
6
7
8
new A;   // нет инициализации, в а - мусор
new A(); // value-initialization, которая приводит к zero-initialization, поскольку это POD
 
new B;   // default-initialization, в а - мусор
new B(); // value-initialization, которая приводит к zero-initialization в соответствии с 8.5/5, в а - ноль
 
new C;   // default-initialization, вызов конструктора, в а - ноль
new C(); // value-initialization, вызов конструктора, в а - ноль
Пункт про default-initialization в С++03 соответствует С++98.

В С++11 изменилась формулировка и класс с приватными полями так же может считаться POD-классом.
Кликните здесь для просмотра всего текста
9/10
A POD struct is a class that is both a trivial class and a standard-layout class, and has no non-static
data members of type non-POD struct, non-POD union (or array of such types).
9/7
A standard-layout class is a class that:
— has no non-static data members of type non-standard-layout class (or array of such types) or reference,
— has no virtual functions (10.3) and no virtual base classes (10.1),
— has the same access control (Clause 11) for all non-static data members,
— has no non-standard-layout base classes,
— either has no non-static data members in the most derived class and at most one base class with
non-static data members, or has no base classes with non-static data members, and
— has no base classes of the same type as the first non-static data member.
 
Текущее время: 00:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru