C++ - 对象作为参数中的变量

C++ - Object as a variable in parameters

本文关键字:变量 参数 对象 C++      更新时间:2023-10-16

我正在通过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();
}

生日.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

生日.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;
}

人民:

#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

人.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 中)。

一个合理的问题。

这里发生的事情是它正在调用复制构造函数。

每当您声明一个类时,都会为您声明几个函数,除非您显式覆盖它们。

    默认构造函数
  • (如果没有显式声明其他构造函数)
  • 如果没有移动构造函数
  • 或移动赋值运算符,则复制构造函数明确声明。如果析构函数声明生成复制构造函数已弃用。
  • 如果没有副本,则移动构造函数构造函数、移动赋值运算符或析构函数是显式的宣布。
  • 复制赋值运算符(如果没有移动构造函数或移动)显式声明赋值运算符。如果析构函数是不推荐使用已声明的复制赋值运算符生成。
  • 移动赋值运算符(如果没有复制构造函数),则复制赋值运算符或显式声明析构函数。
  • 破坏者

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

在这种情况下,将调用复制构造函数。

此表达式(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

如果未显式定义复制构造函数,则编译器会隐式定义它。

让我们一步一步来:

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&代替)。
  • 属性被初始化(名称,出生日期)(这涉及每个属性的附加复制构造函数)。

    Ob.printInfo();

最后,调用 Ob 实例的 printInfo() 方法...这反过来又调用了 Ob 属性 dateOfBirth 的 prinData() 方法。这些方法没有参数,在相应的实例上调用。