通过函数初始化指针

IAE*_*IAE 6 c++ pointers

当我偶然发现这个时,我正在浏览我老师的代码:

Order* order1 = NULL;

然后

order1 = order(customer1, product2);

哪个叫

Order* order(Customer* customer, Product* product)
{
    return new Order(customer, product);
}
Run Code Online (Sandbox Code Playgroud)

这看起来像愚蠢的代码.我不知道为什么,但老师将所有指针初始化为NULL而不是立即声明它们(看完代码它完全可能,但他选择不这样做).

我的问题是:这是好的还是可接受的代码?函数调用是否比明确调用构造函数有任何好处?在这种情况下,新工作如何?我能想象代码现在有点像:

order1 = new Order(customer, product);

pet*_*hen 8

初始化为NULL

[编辑]因为有一个有效的讨论,我已经改变了选项的顺序,以强调推荐的选项.

变量应声明为本地和尽可能晚,并立即初始化.因此,最常见的模式是:

Order * order1 = order(...);
Run Code Online (Sandbox Code Playgroud)

就在此之前order1.
如果有任何理由将声明order1与实例化分开,如下所示:

Order * order1;  // Oh no! not initialized!
// ... some code
order1 = order(...);
Run Code Online (Sandbox Code Playgroud)

order1应该初始化为NULL,以防止未初始化的变量发生的常见错误,很容易引入// some code changes.

工厂方法
同样,这里还有一些更改的静态:实例化的要求Order可能会发生变化.我可以想到两种情况:

(1)Order的构造函数无法完成的验证.Order可能来自第三方库并且无法更改,或者实例化需要添加不在以下范围内的验证Order:

Order* order(Customer* customer, Product* product)             
{      
    // Order can't validate these, since it doesn't "know" the database       
    database.ValidateCustomer(customer); // throws on error
    database.ValidateProduct(product); // throws on error

    return new Order(customer, product);             
}   
Run Code Online (Sandbox Code Playgroud)

(2)您可能需要一个行为不同的订单.

class DemoOrder : public Order  { ... }

Order* order(Customer* customer, Product* product)             
{             
    if (demoMode)
      return new DemoOrder(customer, product); // doesn't write to web service
    else
      return new Order(customer, product);             
}   
Run Code Online (Sandbox Code Playgroud)

但是,我不会盲目地将其作为一般模式.

  • -1不!在`// ..some code`之前_not_初始化`order`为NULL.要么代码需要订单,在这种情况下你应该创建一个,或者(很可能)它不需要.在这种情况下,请尽早_not_声明`order`.将声明下移到实际需要"订单"的位置.此时,不再需要将指针初始化为NULL; 只需创建一个Order对象. (6认同)