创建类实例时,使用()和不使用()有什么区别

时间:2020-07-29 04:26:57

标签: c++ class object constructor initialization

我写了这样的课

#include <iostream>
using std::cout;

class Resource
{
    public:
        Resource(){ cout << "allocated\n";}
        ~Resource(){ cout << "deleted\n";}
};

然后在int main()内创建该类的2个实例

int main()
{
    Resource* p1 = new Resource();
    Resource* p2 = new Resource;
}

new Resourcenew Resource()有什么区别?

2 个答案:

答案 0 :(得分:4)

def update_task(request,pk): task =Task.objects.get(id=pk) form= TaskForm(instance= task) if request.method=='POST': form= TaskForm(request.POST,instance=task) if form.is_valid(): if 'some_field_in_task' in form.changed_data: task.some_field_in_task = form.cleaned_data['some_field_in_task'] task.save() return redirect('/') return render(request,'task/update_task.html', {'form': form}) 执行value initializationnew Resource()执行default initialization,它们在这里具有相同的效果,即对象由用户提供的默认构造函数初始化。

对于非类类型或具有非用户提供的默认构造函数的类类型,其行为是不同的;对于值初始化,对象将为zero-initialized(首先,如果类类型的默认构造函数不重要,则默认初始化)。

...

  1. 如果T是具有默认构造函数的类类型,则默认构造函数既不是 用户提供或删除的(即,可能是具有 隐式定义或默认的默认构造函数),该对象为 zero-initialized,如果它有一个{ 非平凡的默认构造函数;

...

  1. 否则,对象为default-initialized

答案 1 :(得分:4)

括号确实有所作为!正如@songyuanyao所指出的:您使用括号调用值初始化,而没有括号则进行默认初始化。对于像Resource这样的课程类型,您不会看到任何区别。在这两种情况下都将调用构造函数。

但是,如果您拥有诸如int之类的基本数据类型,则差异会更大:

int a{};
int b;

a的值将为0,因为它已被初始化(默认值为0)。但是,b将具有垃圾值,即一个单位值。因此,使用未初始化的变量被认为是不好的做法,因为这可能会导致意想不到的后果。


值得补充的是,自C ++ 11起,我们有使用括号将变量初始化的统一方法:{}。它消除了以前对基本类型,聚合和非聚合类型,数组和标准容器的区别。