C++ 在c++;
我有下面的课程要考C++ 在c++;,c++,class,c++11,constructor,C++,Class,C++11,Constructor,我有下面的课程要考 class ArrayClass { private: int isize; double* p ; public: ArrayClass(int num_ =1):isize(num_),p(new double[num_]) { cout << "constructor with num!!" << endl ; for(int idx=0;idx<num_;idx++)
class ArrayClass
{
private:
int isize;
double* p ;
public:
ArrayClass(int num_ =1):isize(num_),p(new double[num_])
{
cout << "constructor with num!!" << endl ;
for(int idx=0;idx<num_;idx++)
{
p[idx] = 0.0 ;
}
}
ArrayClass(const ArrayClass& m) //copy constructor
{
cout << "copy constructor!!" << endl ;
isize = m.getsize() ;
p = new double[isize] ;
std::copy(m.getaddr(), m.getaddr() + m.getsize(), p);
}
ArrayClass& operator=(const ArrayClass& m) //copy assignment
{
cout << "copy assignment!!" << endl ;
if(this != &m)
{
int msize = m.getsize() ;
if(isize != msize )
{
delete []p ;
p = 0x00 ;
p = msize ? new double[msize] : 0x00 ;
isize = msize ;
}
std::copy(m.getaddr(), m.getaddr() + msize, p);
}
return *this ;
}
ArrayClass& operator=(ArrayClass&& m)
{
cout << "Move assignment!!" << endl ;
isize = m.getsize() ;
p = m.getaddr() ;
m.initialize() ;
return *this ;
}
ArrayClass(ArrayClass&& m)
{
cout << "Move Constructor!!" << endl ;
isize = m.getsize() ;
p = m.getaddr() ;
m.initialize() ;
}
~ArrayClass()
{
cout << "desctrutor!!" << endl ;
delete []p ;
}
void initialize(){ isize=0; p=0x00; }
int getsize() const { return isize; }
double* getaddr() const { return p; }
double& operator[](int i)
{
if( i >= isize)
throw "the bound is wrong!!" ;
return p[i] ;
}
const double& operator[](int i) const
{
if( i >= isize)
throw "the bound is wrong!!" ;
return p[i] ;
}
void Print(void)
{
for(int idx=0;idx<isize;idx++)
cout << p[idx] << " " ;
cout << endl ;
}
} ;
ArrayClass func()
{
ArrayClass m(10) ;
for(int idx=0;idx<10;idx++)
m[idx] = idx * idx + 1 ;
return m ;
}
输出:
constructor with num!!
Move Constructor!!
desctrutor!!
1 2 5 10 17 26 37 50 65 82
desctrutor!!
constructor with num!!
1 2 5 10 17 26 37 50 65 82
desctrutor!!
但以下不是我所期望的:
ArrayClass m2(std::move(func())) ;
m2.Print() ;
ArrayClass m2(func()) ;
m2.Print() ;
输出:
constructor with num!!
Move Constructor!!
desctrutor!!
1 2 5 10 17 26 37 50 65 82
desctrutor!!
constructor with num!!
1 2 5 10 17 26 37 50 65 82
desctrutor!!
我希望应该有“复制构造函数!!”,我很好奇,在这个测试中没有调用复制构造函数,也没有调用移动构造函数,为什么m2.Print()的答案是正确的 这称为复制省略(尽管这里基本上省略了移动操作)。如果语义保持不变,您可以就地构造对象。每天有多少个复制/移动省略问题?并且在传递prvalue时,您应该期望移动构造。如果使用GCC选项编译
-fno elide构造函数会发生什么情况?这应该会给你答案。在你明白问题是什么之后,要带回家的教训是不要帮助编译器。让它发挥它的魔力吧,当编译器可以很好地省略整个操作时,不要强行移动@David,谢谢,复制elision对我来说真的很有帮助!从技术上讲,它仍然被称为复制省略,即使省略的操作是一个动作。12.8/31[…]这种对复制/移动操作的省略,称为复制省略[…]这个网页真的解释了很多复制省略!!干得好!!