NRVec<T>::NRVec() : nn(0), v(0) {}
template <class T>
NRVec<T>::NRVec(int n) : nn(n), v(new T[n]) {}
template <class T>
NRVec<T>::NRVec(const T& a, int n) : nn(n), v(new T[n])
{
for(int i=0; i<n; i++)
v[i] = a;
}
template <class T>
NRVec<T>::NRVec(const T *a, int n) : nn(n), v(new T[n])
{
for(int i=0; i<n; i++)
v[i] = *a++;
}
template <class T>
NRVec<T>::NRVec(const NRVec<T> &rhs) : nn(rhs.nn), v(new T[nn])
{
for(int i=0; i<nn; i++)
v[i] = rhs[i];
}
7 个解决方案
#1
初始化表
#2
以第一个为例:
等同于:
template <class T>
NRVec <T> ::NRVec() : nn(0), v(0) {}
等同于:
template <class T>
NRVec <T> ::NRVec()
{
nn = 0;
v = 0;
}
#3
just initialization!
#4
在C++中保证正确的初始化非常重要,当创建一个对象时,编译器确保调用了所有子对象的构造函数。如果子对象没有默认构造函数或者如果想改变构造函数的某个默认参数,这会出问题的。解决的方法很简单,对于子对象调用构造函数,C++为此提供了专门的语法,即构造函数的初始化表达式。构造函数的初始化表达式的形式模仿继承活动,对于继承,我们把基类置于冒号和这个类体的左括弧之间,而在构造函数的初始化表达式中,可以将对子对象构造函数的调用语句放在构造函数参数表和冒号之后,在函数体之前。
例子:基类:A 派生类B
如果想在构造B(int)的同时,调用A中某个带参数的构造函数A(int),那么可以写成:
B::B(int) : A(int) {//...
}
例子:基类:A 派生类B
如果想在构造B(int)的同时,调用A中某个带参数的构造函数A(int),那么可以写成:
B::B(int) : A(int) {//...
}
#5
楼主啊,你还是要准备一本C++基础书的。
#6
初始化可以写到花括号内也可以用初始化列表,但是一些特殊情况时必须用初始化列表来进行初始化。
#7
//*********************************************************
template <class T>
NRVec <T> ::NRVec(int n) : nn(n), v(new T[n]) {}
//*********************************************************
上面是正宗的C++初始化方式--初始化列表
//*************************************************
template <class T>
NRVec <T> ::NRVec(int n)
{
nn = n;
v = new T(n);
}
//*************************************************
改类型的写法,是先已经初始化了,在对成员变量赋值。但是由于这里有一个动态的数组,这样的写法会有问题。
所以,建议:C++的类最好使用初始化列表方式。
template <class T>
NRVec <T> ::NRVec(int n) : nn(n), v(new T[n]) {}
//*********************************************************
上面是正宗的C++初始化方式--初始化列表
//*************************************************
template <class T>
NRVec <T> ::NRVec(int n)
{
nn = n;
v = new T(n);
}
//*************************************************
改类型的写法,是先已经初始化了,在对成员变量赋值。但是由于这里有一个动态的数组,这样的写法会有问题。
所以,建议:C++的类最好使用初始化列表方式。
#1
初始化表
#2
以第一个为例:
等同于:
template <class T>
NRVec <T> ::NRVec() : nn(0), v(0) {}
等同于:
template <class T>
NRVec <T> ::NRVec()
{
nn = 0;
v = 0;
}
#3
just initialization!
#4
在C++中保证正确的初始化非常重要,当创建一个对象时,编译器确保调用了所有子对象的构造函数。如果子对象没有默认构造函数或者如果想改变构造函数的某个默认参数,这会出问题的。解决的方法很简单,对于子对象调用构造函数,C++为此提供了专门的语法,即构造函数的初始化表达式。构造函数的初始化表达式的形式模仿继承活动,对于继承,我们把基类置于冒号和这个类体的左括弧之间,而在构造函数的初始化表达式中,可以将对子对象构造函数的调用语句放在构造函数参数表和冒号之后,在函数体之前。
例子:基类:A 派生类B
如果想在构造B(int)的同时,调用A中某个带参数的构造函数A(int),那么可以写成:
B::B(int) : A(int) {//...
}
例子:基类:A 派生类B
如果想在构造B(int)的同时,调用A中某个带参数的构造函数A(int),那么可以写成:
B::B(int) : A(int) {//...
}
#5
楼主啊,你还是要准备一本C++基础书的。
#6
初始化可以写到花括号内也可以用初始化列表,但是一些特殊情况时必须用初始化列表来进行初始化。
#7
//*********************************************************
template <class T>
NRVec <T> ::NRVec(int n) : nn(n), v(new T[n]) {}
//*********************************************************
上面是正宗的C++初始化方式--初始化列表
//*************************************************
template <class T>
NRVec <T> ::NRVec(int n)
{
nn = n;
v = new T(n);
}
//*************************************************
改类型的写法,是先已经初始化了,在对成员变量赋值。但是由于这里有一个动态的数组,这样的写法会有问题。
所以,建议:C++的类最好使用初始化列表方式。
template <class T>
NRVec <T> ::NRVec(int n) : nn(n), v(new T[n]) {}
//*********************************************************
上面是正宗的C++初始化方式--初始化列表
//*************************************************
template <class T>
NRVec <T> ::NRVec(int n)
{
nn = n;
v = new T(n);
}
//*************************************************
改类型的写法,是先已经初始化了,在对成员变量赋值。但是由于这里有一个动态的数组,这样的写法会有问题。
所以,建议:C++的类最好使用初始化列表方式。