簡體   English   中英

C ++ - Object作為參數中的變量

[英]C++ - Object as a variable in parameters

我正在通過TheNewBostons教程學習C ++,其中一個程序我無法弄清楚它是如何工作的。 我會在問題面前告訴你這個密碼。

Main.cpp:

#include <iostream>
#include "People.h"
#include "Birthday.h"


using namespace std;

int main()
{
    Birthday birthObject(12,28,1986);

    People Ob("Vidar", birthObject);
    Ob.printInfo();
}

Birthday.h:

#ifndef BIRTHDAY_H
#define BIRTHDAY_H


class Birthday
{
    public:
        Birthday(int m,int d,int y);
        void prinDate();
    private:
        int month, day, year;
};

#endif

Birthday.cpp:

#include <iostream>
#include "Birthday.h"

using namespace std;

Birthday::Birthday(int m,int d,int y)
{
    month = m;
    day = d;
    year = y;
}

void Birthday::prinDate()
{
    cout << day << "/" << month << "-" << year << endl;
}

People.h:

#ifndef PEOPLE_H
#define PEOPLE_H

#include <string>
#include "Birthday.h"
using namespace std;

class People
{
    public:
        People(string x, Birthday bo);
        void printInfo();
    private:
        string name;
        Birthday dateOfBirth;
};

#endif

People.cpp:

#include "People.h"
#include "Birthday.h"

#include <iostream>
#include <string>
using namespace std;

People::People(string x, Birthday bo)
: name(x), dateOfBirth(bo)
{

}

void People::printInfo()
{
    cout << name << " was born on ";
    dateOfBirth.prinDate();
}

我無法弄清楚的是對象如何用作變量和參數,以及如何在不調用構造函數的情況下創建對象(在People.h中)。

這個表達式(mem初始化程序)

dateOfBirth(bo)

在構造函數定義中

People::People(string x, Birthday bo)
: name(x), dateOfBirth(bo)
{

}

表示調用類Birthday的復制構造函數來從對象bo構造對象dateOfBirth。

例如,如果您要按以下方式為類Birthday添加顯式定義的復制構造函數

class Birthday
{
    public:
        Birthday(int m,int d,int y);
        Birthday( const Birthday &rhs )
        {
            std::cout << "Birthday::Birthday( const Birthday & ) is called" << std::endl;
            month = rhs.month; day = rhs.day; year = rhs.year;
        } 
        void prinDate();
    private:
        int month, day, year;
};

然后當這個陳述被執行時

People Ob("Vidar", birthObject);

你會得到消息

Birthday::Birthday( const Birthday & ) is called

如果未明確定義復制構造函數,則編譯器會隱式定義它。

一個合理的問題。

這里發生的是它正在調用復制構造函數。

每當你聲明一個類時,都有幾個為你聲明的函數,除非你明確地覆蓋它們。

  • 默認構造函數(如果沒有顯式聲明其他構造函數)
  • 如果沒有顯式聲明移動構造函數或移動賦值運算符,則復制構造函數。 如果聲明了析構函數,則不推薦生成復制構造函數。
  • 如果沒有顯式聲明復制構造函數,移動賦值運算符或析構函數,則移動構造函數。
  • 如果未顯式聲明移動構造函數或移動賦值運算符,則復制賦值運算符。 如果聲明析構函數,則不推薦生成復制賦值運算符。
  • 如果未顯式聲明復制構造函數,復制賦值運算符或析構函數,則移動賦值運算符。
  • 析構函數

看看這里: http//en.wikipedia.org/wiki/Special_member_functions

在這種情況下,將調用復制構造函數。

讓我們一步一步:

Birthday birthObject(12,28,1986);

在這里,您將創建一個類型為Birthday類的新局部變量birthObject ,作為參數傳遞(12,289,1986)。 這將調用Birthday類的三參數構造函數

People Ob("Vidar", birthObject);

在這里,您將創建一個類型為People的局部變量Ob (注意常見約定的類名以大寫開頭,變量以小寫開頭)並作為參數傳遞(“Vidar”和birthObject)。

這將調用People的雙參數構造函數。 這被定義為:

People::People(string x, Birthday bo): name(x), dateOfBirth(bo) { }

這里有一些注釋:

  • 兩個參數都按值傳遞。 這意味着將為每個復制構造函數調用復制構造函數(隱式,因為您尚未定義任何函數)。 (注意,正如在其他答案中已經注意到的,最好使用const而不是)。
  • 屬性被初始化(name,dateOfBirth)(這涉及每個屬性的附加復制構造函數)。

    Ob.printInfo();

最后,調用Ob實例的printInfo()方法......然后調用Ob的屬性dateOfBirth的prinData()方法。 這些方法沒有參數,並在相應的實例上調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM