Loading...
Jovanna avatar Jovanna 186 Точки

обекти с едно поле отъждествяват ли се с него

Здравейте,

oбекти с едно поле, отъждествяват ли се с него? А като обем заемана памет еднакви ли са: примерно един set<int> с 5 елемента, същия обем памет ли ще заема като един обект със същите 5 елемента, от клас MyClass, който има само едно поле: set<int> и няколко метода, примерно?

set<int> mySet {1, 2, 3, 4, 5};     <->     myClass setClass {1, 2, 3, 4, 5};  

struct myClass {

   set<int> oneFieldOnly;

public:

//some methods & operators

};

**

Връщам първата част от въпроса за да е ясно на колегите, които четат темата. Жоро, много благодаря че си отговорил (в последствие ми се стори незначителен въпроса ми и го "съкратих", но виждам се оказва важно от поведението и възможностите на езика. Благодаря!)

Тема: създаване на обект с оператор =

каква е разликата в  записите, защо работи следния синтаксис за създаване на обект : NoteName note = 'C';    //тук би следвало да се копира 'C' върху обекта; A ако класът е с няколко полета? a синтаксиса: NoteName note = NoteName (myChar);  или NoteName note {myChar}; ?

***

class NoteName {
    char englishName;
public:
    NoteName(char englishName) : englishName(englishName) {}

    operator char() const {
        return this->englishName;
    }
};

Тагове:
0
C++ Programming 14/10/2018 20:05:03
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Не точно, но се случва нещо подобно в примера, който даваш.

Според стандарта, C++ има право, когато се опитва да подаде стойност на оператор или функция (в случая operator=), да направи до 1 на брой имплицитно конвертиране на стойности (примерно да обърне int в long или string в char* и т.н.).

Когато един клас декларира конструктор, приемащ един параметър, за C++ това е имплицитно конвертиране - създателят на класа е заявил, че от типа на параметъра на конструктора може да се създаде обект от класа, като се извика този конструктор.

Тоест ако C++ види функция void f(X x), която се извиква така: Y yObject; ... f(yObject), ще провери дали има конструктор X::X(Y y) - ако има, ще го извика него и ще подаде резултата на фукнцията. Тоест викането на функцията ще се промени от f(yObject) на f( X(yObject)).

Затова NoteName от упражненията можем директно да му присвоим символ - това присвояване на символ просто вика консруктора с един char параметър и всъщност присвоява резултата от този конструктор. Не е важен броят полета на класа, важен е конструкторът получаващ един параметър.

Иначе размерите в паметта на обекти следват по-сложни правила, но накратко казано - не, обект с едно поле не е гарантирано да заема място, колкото полето, ако има методи, но много често така ще се получава. Най-добре тествай със sizeof.

Поздрави,

Жоро

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.