首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数与默认构造函数

构造函数与默认构造函数
EN

Stack Overflow用户
提问于 2022-01-09 17:52:04
回答 3查看 147关注 0票数 -3

我是一个有抱负的软件工程师和全职的CS学生。在假期休息期间,我一直在做练习,以便更好地掌握我的手艺(C++)。有些话题我只是需要澄清一下。我在研究目标心率计算器。

我花了几个小时,几天时间,试图理解构造函数和默认构造函数的概念。我知道每个创建的对象都需要构造函数。

在继续之前,我想测试我的代码,它会提示用户输入他们的名字,然后返回它。一次又一次,对于那些包括我在内的学习缓慢的学生,谁能用莱曼的话来解释一下这个问题吗?

下面是我的密码。我收到一个错误:

调用“

::HeartRates()”的无匹配函数

main.cpp

代码语言:javascript
复制
int main() {

    HeartRates patient;

    cout << "First name: ";
    string firstName;
    cin >> firstName;
    patient.setFirstName(firstName);
    patient.getFirstName();

    return 0;

HeartRate.h

代码语言:javascript
复制
// create a class called HeartRates
class HeartRates {
    public:
    // constructor receiving data
    HeartRates(string personFirstName, string personLastName, int month, int day, int year) {
        firstName = personFirstName;
        lastName = personLastName;
        birthMonth = month;
        birthDay = day;
        birthYear = year;    
    }
    void setFirstName(string personFirstName) {
        firstName = personFirstName;
    }
    string getFirstName() {
        return firstName;
    }
    private:
    // attributes
    string firstName, lastName;
    int birthMonth, birthDay, birthYear;
};

谢谢大家!谢什!我的书增加了所有不必要的额外单词,使阅读变得困难。它所要说的就是:

如果要创建一个对象以接收用户的信息,请确保构造函数为空()。如果要手动输入数据,则通过构造函数的参数传递该数据。

我希望这是你解释的幌子。我爱这个社区-太感谢你了!你们都不知道我的背景--基本上从15年的营销/广告生涯过渡到了软件工程师。你们都非常欢迎,这证实了我做出了一个很好的改变。✊。

以下是我更新的代码:

main.cpp

代码语言:javascript
复制
int main() {

    HeartRates patient;

    cout << "First name: ";
    string firstName;
    cin >> firstName;
    patient.setFirstName(firstName);
    cout << patient.getFirstName();

    return 0;
}

HeartRates.h

代码语言:javascript
复制
// create a class called HeartRates
class HeartRates {
    public:
    // constructor receiving data - THANKS STACKOVERFLOW COMMUNITY
    HeartRates() {
        firstName;
        lastName;
        birthMonth;
        birthDay;
        birthYear;    
    }
    void setFirstName(string personFirstName) {
        firstName = personFirstName;
    }
    string getFirstName() {
        return firstName;
    }
    private:
    // attributes
    string firstName, lastName;
    int birthMonth, birthDay, birthYear;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-09 17:58:21

如果不定义任何构造函数,则会得到不带参数的构造函数。

一旦你定义了一个有参数的构造函数,你的非args构造函数就会退出北极。

所以现在你必须写HeartRate("first", "last", 1, 1, 2001)

如果不想这样写,请从构造函数中删除参数列表,只需为初始值设置所需的任何内容。

票数 2
EN

Stack Overflow用户

发布于 2022-01-09 18:02:04

默认构造函数是可以在没有参数的情况下调用的任何构造函数。

  • MyClass() - default
  • MyClass(int x) -非default
  • MyClass(int x = 42) -默认

如果不为类定义任何构造函数,编译器将自动生成默认构造函数。它看起来或多或少像MyClass() {}

HeartRates patient;试图调用默认构造函数,因为您没有提供任何参数(即HeartRates patient(...);)。

票数 2
EN

Stack Overflow用户

发布于 2022-01-09 18:09:51

默认构造函数和“正常”构造函数之间的区别可能比它看起来的要简单。只要您没有在类中指定构造函数,在创建类的对象时,它总是会调用默认构造函数,如果您没有实现默认构造函数,它只会创建一个没有初始化的特定类的对象。如果您现在已经用一些参数实现了自己的构造函数,那么构造该类对象的唯一方法将要求您调用已实现的构造函数。然后覆盖默认构造函数。

你可以想象它是一个你只定义的函数。就像这样:

(在本例中,函数foo作为构造函数)

总有一个

void foo();

函数

每当您调用foo()时,它都会调用这个特定的函数,什么也不做。并给出了foo()函数。如果您现在声明第二个foo函数,如下所示:

代码语言:javascript
复制
void foo(std::string name)
{
   std::cout << "This is the name " << name << std::endl;
}

然后调用foo函数,然后调用您实现的新foo函数。

长话短说,如果您只创建了一个没有自定义构造函数的类,则始终有一个在创建对象时调用的默认构造函数,而不是真正初始化某个对象。每当您编写自己的自定义构造函数时,它都会覆盖默认构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70644005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档