Каква е разликата между структура и клас?

+13 гласа
1,228 прегледа
попитан 2016 юни 1 в Обща дискусия от Rado.T. (1,360 точки)

В какво се различават и какъв е смисълът да ги има и двете?

3 отговори

+3 гласа
отговорени 2016 юни 2 от valeri.hristov (7,340 точки)
И двете могат да имат полета, пропъртита, методи, конструктури и тн. но в общия случай структурите служат за пазене на информация.

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

Структурите често са малки, с няколко полета в тях. Като цяло не е препоръчително да ги използваш освен ако не трябва да са immutable, размерът на отделните инстанции е по-малък от 16 байта и се очаква да живеят сравнително кратко.
0 гласа
отговорени 2016 юни 6 от code (2,480 точки)
Ако говорим съвсем конкретно за езика за програмиране C++, тогава нещата стоят така: При класовете всичко съдържано е по подразбиране със статут private. При структурите това е public.

Накратко:

struct{private: ... }...;  е същото като class{ ... }...;

class{public: ... }...;  е същото като struct{ ... }...;

На практика struct и class ги има чисто по стилови причини. Под думата структура се разибира комбинация на статични данни в един по-голям обект и нищо повече. Това, че в C++ структурите могат да имат и други функционалности - това не е добър стил. Затова е въведено и class, където вече е нормално да имаме скривания, онаследявания, коструктори/деструктори, методи и др. Т. е. вместо комбинация от данни имаме един доста по-сложен обект, който е основата на така нареченото обектното ориентирано програмиране.
коментиран 2016 юни 6 от Антон Яначков (490 точки)
Много може да се коментира на тази тема и всичко ще бъде невярно. В процеса на развитието на езиците и понятието клас непрекъснато се изменя губейки старото си значение и придобивайки ново значение. Това което е вярно за клас в един език е частично вярно или изобщо не е вярно за трети. При едни езици даден обект е от даден клас, а при други всеки обект може да стане от даден клас. Звучи объркващо, но за съжаление е вярно. Този въпрос е подобен на въпроса за кокошката и яйцето. Яйцето се снася от кокошката и носи генетиката на кокошката, но от него може да се появи пиленце, което прилича на кокошката, но вместо да е бяло то е черно. Е от кой клас е обекта пиленце. Трябва да започнете да пишете класове, за да разберете идеята. И точно когато си помислите, че всичко ви е ясно ще се изненадате. Класът може да се състои само от едно свойство. Примерно фон на обекта червен. Този клас може да се прикача към всеки обект и ако обекта има свойство фон то това свойство ще се промени, а ако няма то няма да се случи нищо. Но един клас може да е далеч по сложно нещо. В него могат да бъдат включени не само свойства, но могат да се включват и методи, тоест действия, могат да се включват цели обекти, комплект от обекти и дори цели програми. В един клас написан на съвременен език за обектно програмиране може да се включи всичко което роди въображението на програмиста. Ето защо ако някой ви каже с убеденост, че знае какво е клас то вие веднага трябва да си направите извода, че това е човек, който е чел книги, но никога не е програмирал. В общия случай програмистите нямат представа какво клас, защото той може да бъде всичко.

Ето ви пример за клас, който създава диалоговата форма за избор на файл или запис на файл. Обърнете внимание, че има свойства, има функции има цикли:
http://programirane.bivaood.com/primeri/2/2.3.htm
коментиран 2016 юни 7 от code (2,480 точки)
Добро допълнение наистина. Точно това е клас - нещо в което не само могат да са "насвяткани" много технологии, но и с времето последните да се допълват в различните езици за програмиране. Ако използваме сравнение, то класът е като един панел в строителството. Може да е обикновен бетон с арматура, но може и да е много повече, като вградена електро инсталация, хидро изолации, антиземетръсни подсилвания на определени места, антикорозионни зощити и дори може да притежава вградени прозорци.
При структурата нещата са напълно ясни. Там просто имаме . При езика C++, обаче, с ключовата дума struct можеш напълно спокойно да дефинираш клас, което не е стилово добре, но се поддържа от езика.
0 гласа
отговорени 2016 юни 10 от Warrior (1,720 точки)
редактиран 2016 юни 10 от Warrior
Друга основна разлика между двете е, че class е reference type и при инстанциране се пази в динамичната памет (heap), докато struct е value type и се пази в стека на изпъление на програмата.

Това води до някои разлики и при подаването на двата типа в метод:

- При подаване на референтен тип в метод се подава неговата референция. Това значи, че всички промени, които правиш върху обекта ги правиш върху оригиналния тип.

- При подаване на примитивен тип в метод се подава негово копие. Всички промени, които правиш върху обекта са промени върху копието му. Не засягат оригиналния обект. В случай, че искаш да подадеш самия примитивен тип и да правиш промени върху него, не върху копието му, трябва да го подадеш оказвайте ключовата дума ref, което ще индикира на компилатора, че ще работиш със самия обект.

За по-лесно ще го покажа с пример:

    public class Program
    {
        static void Main(string[] args)
        {
            var person = new Person();
            person.Name = "Martin";

            ChangeName(person);
            Console.WriteLine("Person name is {0}", person.Name); // Returns "Ivan"

            int value = 5;
            ChangeValue(value);
            Console.WriteLine("Value is {0}", value); // Returns "5"

            ChangeValueByReference(ref value);
            Console.WriteLine("Value is {0}", value); // Returns "10"

            Console.ReadLine();
        }

        public static void ChangeName(Person person)
        {
            person.Name = "Ivan";
        }

        public static void ChangeValue(int value)
        {
            value = 10;
        }

        public static void ChangeValueByReference(ref int value)
        {
            value = 10;
        }
    }

    public class Person
    {
        public string Name { get; set; }
    }
}
...