[英]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) { }
這里有一些注釋:
屬性被初始化(name,dateOfBirth)(這涉及每個屬性的附加復制構造函數)。
Ob.printInfo();
最后,調用Ob實例的printInfo()方法......然后調用Ob的屬性dateOfBirth的prinData()方法。 這些方法沒有參數,並在相應的實例上調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.