C++ - 对象作为参数中的变量
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();
}
生日.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() 方法。这些方法没有参数,在相应的实例上调用。
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 存储稍后要转发的变量参数
- 包括一个类来定义全局变量参数 c++ :(
- 可变参数模板类的构造函数无法接受变量参数
- 变量参数列表 后面的'const std::string&'弄乱了堆栈
- 变量参数崩溃的 C 函数
- 如何使用变量参数化类型?C++
- 使用参数包分配具有变量参数的函数指针
- 参考变量参数与本地参考变量
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- 如何基于模板变量参数多次扩展语句
- gmock一种接受变量参数的方法
- 使用变量参数列表与向量(C )的原因
- lambda 中的变量参数作为函数指针
- C 变量参数错误
- 带有变量参数列表的c++11 lambda函数
- 变量参数
- std::函数带有C变量参数,而不是模板变量参数