1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

Некои нејасности со функции.

Дискусија во форумот 'C // C++' започната од dimitars, 25 Јуни 2009.

  1. dimitars

    dimitars
    Gaining Experience

    1,672
    331
    8 Мај 2007
    Ако може некој да ми објасни што претставува болдираното во следниов пример преземен од learncpp.com
    Код:
    // Employee publicly inherits from Person
    class Employee: public Person
    {
    public:
    std::string m_strEmployerName;
    double m_dHourlySalary;
    long m_lEmployeeID;
    Employee(std::string strEmployerName, double dHourlySalary, long lEmployeeID)
    [B]: m_strEmployerName(strEmployerName), m_dHourlySalary(dHourlySalary),
    m_lEmployeeID(lEmployeeID)[/B]
    {
    }
    double GetHourlySalary() { return m_dHourlySalary; }
    void PrintNameAndSalary()
    {
    std::cout << m_strName << ": " << m_dHourlySalary << std::endl;
    }
    };
     
  2. Haralampie

    Haralampie
    Intern

    74
    3
    2 Јануари 2009
    Boldiranoto vrsi inicijalizacija na member varijablite. Pr. strEmployerName go prosleduvas kako parametar na konstruktorot na m_strEmployerName.
     
  3. dimitars

    dimitars
    Gaining Experience

    1,672
    331
    8 Мај 2007
    А зошто е тоа така направено а не со обично доделување параметар во функцијата x = y? Дали се добива на перформанси или?
     
  4. Haralampie

    Haralampie
    Intern

    74
    3
    2 Јануари 2009
    Dodeluvanje (operator=) ne e isto so konstruiranje objekt. Pred da pravis bilo sto so objektot, toj mora da bide konstruiran, sto znaci povikuvanje na konstruktorot na baznata klasa (dokolku takva postoi), povikuvanje na konstruktorite na member objektite i _na kraj_ povikuvanje na konstruktorot na samata klasa. Nacinot na koj se prosleduvaat parametri do konstruktorite na baznata klasa i member objektite vo C++ e so pomos na "initializer list" (ona boldiranoto :) ). Dali se dobiva na performansi zavisi od objektite koi se sodrzat vo klasata. Da receme deka imas objekt koj e "skap" za konstruiranje. Pr. treba da se alocira memorija, a za toa e potrebno pr. 100ms (sto vo real-time sistemi e cela vecnost), ili e potreben pristap do datoteki. Ako ne gi prosledis parametrite preku initializer listata, ke se povika default konstruktorot za toj member objekt. Ako sega izvrsis dodeluvanje na toj objekt, verojatno povtorno ja plakjas taa "cena" za alociranje/pristap do datoteka. (velam verojatno bidejki funkcijata operator= e nezavisna od konstruktorot). No problemot ne e samo vo performansite. Ako member objektot nema default konstruktor, kodot voopsto nema da se kompajlira se' dodeka ne gi prosledis soodvetnite parametri preku initializer listata. Vakviot nacin na inicijalizacija na objektite e dobra praksa, iako sintaksata e shashava. :D
     
  5. aleksandar juve

    aleksandar juve
    Intern

    62
    0
    5 Јануари 2009
    точно да и ова е еден од начините не иницијализација на параметрите на членовите во некоја класа.но секако не е единствениот нацин и немора на ваков начин.би можеле да ги иницијализираме објектите со директно доделување во конструкторот.секако ако е цхар променлива би требало да употребиме strcpy за да доделиме,но во овој слуцај имаме стринг и тоа не е неопходно.може со едноставно доделување
     
  6. Haralampie

    Haralampie
    Intern

    74
    3
    2 Јануари 2009
    Koga ke pocne da se izvrsuva konstruktorot, site member objekti se vekje inicijalizirani.
    Da, ke go postignes istiot efekt, no dodeluvanje != inicijalizacija. Eve primer:
    Код:
    struct BezDefault
    {
    	int m_Val;
    
    	BezDefault (int i) : m_Val (i) {}
    
    	BezDefault& operator= (int i)
    	{
    		m_Val = i;
    		return *this;
    	}
    };
    
    struct Klasa
    {
    	BezDefault m_BezDefault;
    };
    
    int main()
    {
    	Klasa klasa;
    	return 0;
    }
    Ova nema da se kompajlira bidejki Klasa treba da prati int parametar do konstruktorot na BezDefault. BezDefault go overload-uva operator=, sto znaci deka izrazot m_BezDefault = 5 e validen. Na kolku nacini moze da se inicijalizira BezDefault objektot?
     
  7. Haralampie

    Haralampie
    Intern

    74
    3
    2 Јануари 2009
    Eve poednostaven primer. :) Na kolku nacini moze da se inicijalizira m_Val referencata?
    Код:
    struct Klasa
    {
    	int& m_Val;
    
    	Klasa (int& i)
    	{
    		
    	}
    };
    
    int main()
    {
    	int i = 5;
    	Klasa k (i);
    	return 0;
    }
     
  8. burce

    burce
    Intern

    267
    38
    1 Април 2009
    Твојот пример сигурно не ја иницијализира ;-) Од надвор на ниеден.
     
  9. Haralampie

    Haralampie
    Intern

    74
    3
    2 Јануари 2009
    Da, za prethodniot primer rekov deka nema da se kompajlira. Istoto vazi i tuka. Idejata mi bese da im ostavam prostor za eksperimentiranje. :)
     
  10. Garfield

    Garfield
    Intern

    277
    4
    9 Декември 2007
    Има разлика во иницијализација(initialization) и доделување(assignment)

    Код:
    class Test_I
    {
    public:
        Test_I(int n) : i(n) {}    //initialization
    private:
        int i;
    }
    
    class Test_A
    {
        Test_A(int n)
        {
            i = n;    //assignment
        }
    private:
        int i; 
    }
    
    //ili po prost primer
    
    int n;
    n = 3;    //assignment
    
    int n = 3;    //initialization
    
    
    За во класите по стандард е препорачано иницијализација, а исто така и во другите случаи подобро е иницијализација. Подобро е затоа што се подобруваат перформансите (помалку инструкции), и по сигурно бидеќи променливата секогаш ќе ни има проверена вредност. Во пракса тоа е вака:

    Инивијализација: Кога ја дефинираме променливата n веднаш се резервира меморија и во неа се сместува 3.

    Доделување: Кога ја дефинираме променливата n, прво се резервира меморија, и променливата постои со некоја Random вредност(тоа што имало случајно во резервираната меморија) па пота се сместува во неја 3.
     
Слични теми
  1. AMD_fan
    Одговори:
    19
    Прегледи:
    2,301
  2. goodboy
    Одговори:
    8
    Прегледи:
    1,460
  3. goodboy
    Одговори:
    3
    Прегледи:
    3,226
  4. Xenor
    Одговори:
    6
    Прегледи:
    1,274
  5. &YL
    Одговори:
    11
    Прегледи:
    1,042
Вчитување...

Сподели

Вчитување...