gpt4 book ai didi

c++ - unique_ptr 到对象数组,构造函数有不同的行为

转载 作者:行者123 更新时间:2023-11-28 00:21:26 25 4
gpt4 key购买 nike

我在 g++ 4.4.6 上使用 --std=c++0x 编译了以下 c++ 测试:

#include <iostream>
#include <memory>
using namespace std ;

class Arrs
{
private :
int i ;
public:
Arrs(int i_=0):i(i_){ cout << "cons" << endl ; }
void setinArr(int i_){i = i_ ; }
~Arrs(){ cout << "(" << i << ")" << endl ; }
};

class MM
{
private:
int icnt ;
unique_ptr<Arrs[]> ptr ;
public:
MM(int i_):icnt(i_){ ptr.reset( new Arrs[i_] ); }
void setinMM(int i_,int j_){
//ptr[i_] = j_ ;
ptr[i_].setinArr(j_) ;
}
~MM(){}
};

int main(int argc, char ** argv) {
MM m(5) ;
for(int i=0;i<5;i++)
m.setinMM(i,50+i) ;
}

我的问题是:如果我在 setinMM 中编码:ptr[i_].setinArr(j_),输出将是:

cons
cons
cons
cons
cons
(54)
(53)
(52)
(51)
(50)

如果我改为编写 ptr[i_] = j_,输出将是:

cons
cons
cons
cons
cons
cons
(50)
cons
(51)
cons
(52)
cons
(53)
cons
(54)
(54)
(53)
(52)
(51)
(50)

我不知道发生了什么 ptr[i_] = j_ ;在 MM.setinMM 中导致此输出,有什么提示吗?!

最佳答案

由于您没有为 int 赋值重载 operator=,因此以下语句:

ptr[i_] = j_ ;

使用隐式定义的复制赋值运算符:

Arrs& Arrs::operator=(const Arrs&)

通过 copy-initializationj_ 作为参数创建 Arrs 的临时实例,并将该临时实例传递给运算符。创建临时打印件是额外打印件的来源。

通过将构造函数声明为explicit 可调用的构造函数,可以避免此类错误,方法是替换:

Arrs(int i_ = 0) : i(i_) {}

两个声明如下:

Arrs() : Arrs(0) {}  // make sure default constructor is not explicit
explicit Arrs(int i_) : i(i_) {} // make explicit this one

或(如果不支持委派构造函数):

Arrs() : i(0) {}
explicit Arrs(int i_) : i(i_) {}

关于c++ - unique_ptr 到对象数组,构造函数有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27310961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com