构造函数中的默认参数会给出编译时错误

时间:2018-12-11 14:05:41

标签: c++ constructor parameterized-constructor

我了解到,我们可以为构造函数提供默认参数,以便如果未在代码中明确提供,则构造函数可以初始化值,但是当我尝试创建类的对象时,它将无法正常工作。如果未提供,则不采用这些默认值,并且给我一个错误,指出: error: no matching function for call to ‘Person::Person(const char [6], int)

Person::Person( string aName = "ANY", int age = 18 ) {
cout << "Constructor called!" << endl;
this->name = aName;
this->age = age;
}

现在,当我在主界面中调用此名称时:

Person p( "Steve" );

它给了我上面提到的错误,age在默认情况下未初始化为18。

我在C / C ++ IDE中使用eclipse

2 个答案:

答案 0 :(得分:4)

参数的默认值应放在声明中,而不是定义中:

public async Task SendNotifications()
{
    await _backgroundJobManager.EnqueueAsync<NotificationJob,
        UserIdentifier>(new UserIdentifier(_session.TenantId, _session.UserId.Value), delay: TimeSpan.FromSeconds(3));
}

public override void Execute(UserIdentifier args)
{
    var notifications = _userNotificationManager.GetUserNotifications(args);    
    Abp.Threading.AsyncHelper.RunSync(() => _realTimeNotifier.SendNotificationsAsync(notifications.ToArray()));
}

答案 1 :(得分:0)

正如Evg已经提到的:

  

参数的默认值应该放在声明中,而不是   定义

我还要指出,通常首选在构造函数中使用“初始化列表”(不要与std :: initializer_list混淆),它看起来像这样:

#include <string>
#include <iostream>
class Person
{
public:
    Person(std::string aName = "ANY", int age = 18) : name(aName), age(age)
    {
        std::cout << "Constructor called!" << std::endl;
    }

    std::string name;
    int age;
};

int main()
{
    Person p1("Test123");
    std::cout << p1.name << ' ' << p1.age << std::endl;
    Person p2("Test456", 21);
    std::cout << p2.name << ' ' << p2.age << std::endl;

    return 0;
}

这样,您的变量将被初始化一次,并且更加干净。参见https://en.cppreference.com/w/cpp/language/initializer_list。在您的示例中,nameage将被默认初始化(甚至在执行构造函数主体之前)并分配给您,而您也可以立即使用正确的值对其进行初始化。