LINUX.ORG.RU

И вызвать метод класса не создав объект не получится.

Статический метод — легко.

При использовании union его поля будут ссылаться на один адрес в памяти, а общая длина будет, соответственно, не суммой длин всех полей, а максимальной длиной поля. Может быть полезно, если одна и та же переменная может иметь разные типы, например, но на практике я не использовал.

struct существует, чтобы определить структуру хранения набора значений в памяти (включая имена полей и типы), потому в нём нет и не должно быть непосредственно логики, в отличие от классов.

namespace разграничивает области видимости для различных модулей.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 3)

namespace нужно, если в программе используются классы с одинаковыми названиями. К крестам давно не прикасался. А в union'е все данные собраны в одну кучку в памяти.

Meyer ★★★★★
()

C и кресты - это разные языки, по странному капризу разработчика один из них совместим в компайлтайм где то на 90% с другим и на 100% в рантайм.

По остальным вопросам - почитай книжку, там лучше расскажут и с деталями. В кратце struct и class - одно и тоже, но с разными квалификаторами видимости по умолчанию. namespace и union отличаются от них и друг от друга тем, что это разные вещи, для разных целей.

pon4ik ★★★★★
()

struct - поля паблик по дефолту, class - private. В остальном они эквивалентны

union - тип, имеющий единовременно только одно из перечисленных в определении полей.

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

Midael ★★★★★
()
Последнее исправление: Midael (всего исправлений: 1)
Ответ на: комментарий от pon4ik

В кратце struct и class - одно и тоже, но с разными квалификаторами видимости по умолчанию.

Но-но. Там главное отличие в том, что если в struct только базовые типы, то она считается POD типом и компилятор не генерит методы (конструкторы, оператор присваивания и тд) по умолчанию.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Sadler

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

но может быть, т.к. по факту, struct X{}; это

class X
{ public:
};
next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)

struct и class — почти одно и то же, но в одном по-дефолту всё public, а в другом private. (на самом деле всё чуть сложнее, выше пояснили)

namespace — объединение сущностей, дабы не возникало конфликтов имён. В отличие от struct и class, объект неймспейса ты не создашь.

union — грубо говоря, это переменная, которая может быть разных типов. То есть, если у тебя в каком-то, например, классе в зависимости от какого-то условия может быть либо одно поле, либо другое, то эти поля можно засунуть в union. И по какому-нибудь флагу понимать, какой именно вариант лежит в union.

devsdc ★★
()
Последнее исправление: devsdc (всего исправлений: 1)
Ответ на: комментарий от pon4ik

Нет, ЕМНИП, это только для структур. Надо стандарт глянуть.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Meyer

Блин, а я думал почему-то что классы это как namespace, только для методов класса. Т.е. допустим есть два метода с одинаковыми именами, но которые принадлежат двум разным классам. Я могу вызвать эти методы в main() указав просто область видимости класса.

w1nner ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Стандарт, который был под рукой (11ый), говорит, что ты не прав.

pon4ik ★★★★★
()
Ответ на: комментарий от w1nner

Это просто похожий синтаксис. У классов и неймспейсов нет ничего общего. Просто для уточнения имени используется одинаковый синтаксис.

Xellos ★★★★★
()

Блин, JB, ну зачем? Тут же не такой большой поток юзверей, тут эту тему никто и не увидит, а следовательно и не ответит на мой пост.

w1nner ★★★★★
() автор топика

class это штука с методами и переменными, экземпляры которой можно создавать, определяет тип. struct - то же, что и класс, но если в классе все члены по-умолчанию private, то в стракт - паблик. namespace - штука чтобы другие штуки использовались с префиксом namespacename::foo

hlebushek ★★
()
Ответ на: комментарий от devsdc

(на самом деле всё чуть сложнее, выше пояснили)

Вот насчёт чуть посложнее, можно пруф? Или ты просто увидел, что звёздный дядька так написал и поверил на слово?

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Увидел, что звёздный дядька так написал и вспомнил, что с POD-структурами и правда какие-то похожие нетривиальности были.

Сейчас полез на http://en.cppreference.com/w/cpp/concept/PODType и увидел, что таки неправ. Теперь мне интересно, что же в моей голове отложилось на тему нетривиальности POD-структур.

devsdc ★★
()
Ответ на: комментарий от DELIRIUM

Там главное отличие в том, что если в struct только базовые типы, то она считается POD типом и компилятор не генерит методы (конструкторы, оператор присваивания и тд) по умолчанию.

Это не так:

class C
{
	int i;
	double d;
};

std::is_pod<C>::value // true

Ну и в последних стандартах понятие «POD» немного расширили.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DELIRIUM

если в struct только базовые типы, то [...] компилятор не генерит методы (конструкторы, оператор присваивания и тд) по умолчанию

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

:-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от devsdc

Скачай драфт 11ого он дофига где в пабликах валяется, там в 9ой главе в самом начале, определения даны. В том числе и для POD.

Правда, я не уверен насчёт 03его. Но учитывая что врят ли кто то стал бы ломать совместимость, то если понятие и поменялось, то расширилось.

pon4ik ★★★★★
()

struct И class одно и тоже тока умолчания к доступу полей разное.

union это ответвление от struct - когда комитет решил что не дело обращаться к любому указетелю как указателю на любую структуру с произвольным смещением(определяемым одним пространсвом имён полей структур) - и как следствие если есть две структуры у которых первое поле разного размера/семантики получаем легальное.

это запретили в районе 1984(?) назвав union

namespace - полезняшка что бы уж совсем #include не породили мозг рака.

к методам класса можно без объекта обращаться

qulinxao ★★☆
()

http://v6.cuzuco.com/

вот тут в сырцах есть красивые строки типо:

/* приблизительная цитата */

struct {int asint}; struct {double asdouble};

. . . . . . *p;

. . . . p->asint

p->asdouble

так было до появления union

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от qulinxao

Историческая справка, обьясняет только кейс без имени. Хотя может остальное и потом прикрутили, не силён в античности сишечки.

Мне кстати больше нравиться вот такое вот кодоплётсво:

union { int aa; char* p; } obj, *ptr = &obj; 

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

А что с наследованием?

Оно тоже по умолчанию разное - public или private.

DarkEld3r ★★★★★
()

class - это как я понял, struct с классами

Ты все неправильно понял. struct в терминах C++ - это класс, у которого все поля и методы публичные.

/thread

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Ты все неправильно понял. struct в терминах C++ - это класс, у которого все поля и методы публичные.
/thread

thread

Марш читать про POD.

anonymous
()
Ответ на: комментарий от anonymous

Типа class не может быть POD чтоль?

anonymous
()
Ответ на: комментарий от w1nner

Затем, что постить надо в подходящий по теме раздел форума, а не валить все без разбора в Talks

JB ★★★★★
()
Ответ на: комментарий от qulinxao

struct ведь наследовательны. не?

Ну да, речь о разном public/private наследовании по умолчанию:

struct A {};
struct B : A {}; // B is A

class C {};
class D : C {}; // D is not C

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Чё ты несешь?

#include <iostream>
using std::cout;

struct A { A() { cout << "A\n"; } };
struct B : A { B() { cout << "B\n"; } };

class C { public: C() { cout << "C\n"; } };
class D : C { public: D() { cout << "D\n"; } };

int main() {
    B b;
    D d;
    return 0;
}

$ g++ tst.cpp 
$ ./a.out 
A
B
C
D
fluorite ★★★★★
()
Ответ на: комментарий от DELIRIUM

Та я не прогона для, я просто думал, может это я смотрю в книгу, вижу фигу :)

Ждал пруфа прост.

pon4ik ★★★★★
()
Ответ на: комментарий от fluorite

Чё ты несешь?

Ну если тупишь, то мог бы более адекватно переспросить. Ок, разжевываю:

struct A {};
struct B : A {};
 
class C {};
class D1 : C {};
class D2 : public C {};
 
void test_A(A&) {}
void test_C(C&) {}
 
B b;
test_A(b); // OK.
 
D1 d1;
D2 d2;
 
//test_C(d1); // FAIL: inaccessible base.
test_C(d2); // OK. 

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ну ок, Ваше высказывание

D is not C

не совсем корректно, поскольку отсутствие доступа к защищенным и приватным членам и методам родителя в производном классе не означает, что производный класс не является наследником базового.

fluorite ★★★★★
()
Ответ на: комментарий от mittorn

Зачем кстати наследование без public?

В смысле, другие виды наследования или возможность писать не указывая вид наследования? Насчёт второго не знаю, тем более public-наследование самый используемый вариант.

А приватное наследование - некий аналог агрегации. Но такое использование, как правило, не поощряется.

DarkEld3r ★★★★★
()
Ответ на: комментарий от fluorite

не совсем корректно, поскольку отсутствие доступа к защищенным и приватным членам и методам родителя в производном классе не означает, что производный класс не является наследником базового.

Ну да, наверное, не слишком корректно высказался. Но подразумевал не то, что он не является наследником, а то, что его нельзя использовать вместо базового, что работает с обычным наследованием. Ну и в С# «is» используется как раз для проверки возможности приведения.

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.