繁体   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