Хотя вы можете это сделать, это может сбить с толку людей, и вам придется справиться с этим во время выполнения. Часто более желательно получить ошибку во время компиляции и просто полностью запретить «копирование».
В этом случае вы можете сделать целое число const
, что предотвратит неявный оператор копирования по умолчанию.
class A {
private:
const int i;
public:
A(int i) : i(i) {};
void doSomethingNonConst() {}
int getInt() {
return i;
}
};
class B {
public:
B() : a(5) {}
A &getA() { return a; } // still non-const here
private:
A a;
};
int main()
{
B b;
A otherA(60);
// Compile error. GCC: use of deleted function 'A& A::operator=(const A&)'
// 'A& A::operator=(const A&)' is implicitly deleted because the default definition would be ill-formed
b.getA() = otherA;
}
В противном случае вы можете явно избавиться от операторов, например, если не можете сделать переменные const по какой-то другой причине. В некоторых случаях также может быть желательно предотвратить копирование с помощью конструктора копирования , который работает аналогичным образом.
Это можно сделать, удалив операторы по умолчанию A &operator = (const A &) = delete;
.
class A {
private:
int i;
public:
A(int i) : i(i) {};
A (const A &) = delete;
A &operator = (const A &) = delete;
void doSomethingNonConst() {}
int getInt() {
return i;
}
};
int main()
{
B b;
A otherA(60);
b.getA() = otherA; // Compile error. GCC: use of deleted function 'A& A::operator=(const A&)'
}