2012-09-27 41 views
-1

编辑:改变了我的问题更有意义适当的方式在写C构造++

如果我有一个类:

class A{ 
public: 
    int nr; 
    int *a; 

    A(); 
}; 

A::A(): nr(0), a = new int[10]{} 

这chrases,但如果我有

A::A(): nr(0) {a = new int[10];} 

它的工作原理。请向我解释这种行为。

+2

既不应该工作。 –

+0

请解释投票。 – coredump

回答

1

nr(0)是数据成员nr的初始化。

{a = new T[10]; }是一个构造体,其一个值分配给之后在初始化列表中的初始化已被执行的a数据成员。

{}是一个空的构造函数体,它意味着构造函数什么都不做(除了初始化nr,当然,因为它在初始化列表中)。

a = new int[10]在初始化程序列表和构造函数体之间是无稽之谈,该语言的语法不允许它。它不应该编译,但如果你发现一个编译器接受它,然后它崩溃,你将不得不看编译器的文档的解释。

0

也不应该编译。适当的方式将是这样:

  • 第一种情况:A::A(): nr(0), a(new int[5]){}
  • 第二种情况:A<T>::A(): nr(0), a(new T[10]){}
+0

为'a'分配多少内存? –

+0

doh坏复制和粘贴。现在修好 –

1

它应该是这个样子:

template<class T> 
class A { 
public: 
    int nr; 
    T *a; 
    A(); 
}; 

template<class T> 
A<T>::A() : nr(0), a(new T[42]) { }