C ++初始化const

时间:2018-06-28 21:08:45

标签: c++ constructor copy const

我需要能够在构造函数中初始化const成员,每次创建新对象时,该成员都会计数。在学校给我看了它应该如何工作,但是我一直都在犯错误。这与复制构造函数有关。

这是代码和编译器错误:

class kunde {
public:
    kunde(string name, int alter);
    kunde(const kunde& orig);
    ~kunde();
    int GetAlter() const;
    string GetName() const;
    const int GetKnr() const;

private:
    string name;
    int alter;

    const int knr;

    static int cnt;
    static int MaxKnr;
};

int kunde::cnt = 0;
int kunde::MaxKnr = 1000;

kunde::kunde(string name, int alter):knr(MaxKnr++) {
    this->name = name;
    this->alter = alter;
}

kunde::kunde(const kunde& orig):knr(MaxKnr++){
    this->name = orig.name;
    this->alter = orig.alter;
}

kunde::~kunde() {
}

int kunde::GetAlter() const {
    return alter;
}

string kunde::GetName() const {
    return name;
}

const int kunde::GetKnr() const {
    return knr;
}
        main.cpp: In function 'int main(int, char**)':
    main.cpp:35:15: error: use of deleted function 'kunde& kunde::operator=(const kunde&)'
          v[0] = v[1];
               ^
    In file included from main.cpp:17:0:
    kunde.h:19:7: note: 'kunde& kunde::operator=(const kunde&)' is implicitly  deleted because the default definition would be ill-formed:
     class kunde {
           ^~~~~
    kunde.h:19:7: error: non-static const member 'const int kunde::knr', can't use default assignment operator

1 个答案:

答案 0 :(得分:0)

  假设

knr是一个帐号。每次创建对象时,它都会创建一个新的const帐号,该帐号一直存在。

如注释中所述,由于knrconst,因此编译器无法为该类生成默认的副本分配operator=,这恰恰是编译器抱怨的。 v[0] = v[1];语句:

  

注意:“ kunde&kunde :: operator =(const kunde&)”被隐式删除,因为默认定义格式不正确

const成员一旦初始化就无法重新分配,因此无法复制。

vector中的元素必须为CopyAssignableCopyConstructible(至少在C ++ 11之前),但是您的课程没有可行的复制分配{{1} },因此它不是operator=(在C ++ 11中也不是MoveAssignable,因为也无法生成可行的移动分配CopyAssignable)。

解决方案是实现忽略operator=的副本分配operator=(以及可选的移动分配operator=),例如:

knr

class kunde {
public:
    kunde(string name, int alter);
    kunde(const kunde& orig);
    kunde(kunde&& orig);
    ...
    kunde& operator=(const kunde& rhs);
    kunde& operator=(kunde&& rhs);
    ...

private:
    string name;
    int alter;
    const int knr;
    ...
};