我写了这样的课
#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 Resource
和new Resource()
有什么区别?
答案 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 initialization,new Resource()
执行default initialization,它们在这里具有相同的效果,即对象由用户提供的默认构造函数初始化。
对于非类类型或具有非用户提供的默认构造函数的类类型,其行为是不同的;对于值初始化,对象将为zero-initialized(首先,如果类类型的默认构造函数不重要,则默认初始化)。
...
- 如果T是具有默认构造函数的类类型,则默认构造函数既不是 用户提供或删除的(即,可能是具有 隐式定义或默认的默认构造函数),该对象为 zero-initialized,如果它有一个{ 非平凡的默认构造函数;
...
- 否则,对象为default-initialized。
答案 1 :(得分:4)
括号确实有所作为!正如@songyuanyao所指出的:您使用括号调用值初始化,而没有括号则进行默认初始化。对于像Resource
这样的课程类型,您不会看到任何区别。在这两种情况下都将调用构造函数。
但是,如果您拥有诸如int
之类的基本数据类型,则差异会更大:
int a{};
int b;
a
的值将为0,因为它已被初始化(默认值为0)。但是,b
将具有垃圾值,即一个单位值。因此,使用未初始化的变量被认为是不好的做法,因为这可能会导致意想不到的后果。
值得补充的是,自C ++ 11起,我们有使用括号将变量初始化的统一方法:{}
。它消除了以前对基本类型,聚合和非聚合类型,数组和标准容器的区别。