[英]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.