我了解到,我们可以为构造函数提供默认参数,以便如果未在代码中明确提供,则构造函数可以初始化值,但是当我尝试创建类的对象时,它将无法正常工作。如果未提供,则不采用这些默认值,并且给我一个错误,指出:
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
答案 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。在您的示例中,name
和age
将被默认初始化(甚至在执行构造函数主体之前)并分配给您,而您也可以立即使用正确的值对其进行初始化。