= удалить для пользовательских функций-членов, кроме конструктора, оператора присваивания c ++ 11 - PullRequest
0 голосов
/ 28 апреля 2018

В C ++ 11 мы используем "= delete", чтобы не позволить неявным образом вызывать конструкторы и перегруженные оператором функции-члены при выполнении некоторых операций (изменение типа данных / назначение объектов).

class color{
 public:    
 color(){cout<<"color constructed called"<<endl;}
 color(int a){};
 color(float)=delete;
 color& operator = (color &a) = delete;
 virtual void paint() = delete;  //What is the use of delete in this function
 //void paint() = delete; The above virtual is not mandatory, just a generic scenario.
 virtual void paints () final {};
};

Я использовал delete для определенной пользователем функции-члена в приведенном выше примере. Он говорит, что мы можем определить функцию paint (), поэтому никакая другая функция не может вызвать ее.

Хотите знать, есть ли какие-либо сценарии, в которых этот тип объявления функции (рисование) был бы полезен / рекомендован.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018
  • Обеспечить более строгие проверки входных аргументов:

 void foo(void *){}

 void foo(int) = delete;

 foo(0); // error
  • Пометить методы как «явно не реализованные», это может быть полезно, когда семейство классов имеет определенную функцию, но этот конкретный класс не предоставляет ее для производительности или по другим причинам:

class my_list
{
    // you should use other container if you need constant time size
    public: size_t size(void) = delete;     
};
  • В качестве последнего шага устаревания функции. Некоторые даже используют специальный макрос.
0 голосов
/ 29 апреля 2018

Так что от этой перегрузки ничто не выиграет.

#include <iostream>

struct Nyan {
    int omg(int x) { return x + 2; }
};

struct Meow {
    int omg(int x) { return x + 2; }
    int omg(double) = delete;
};

int main() {
    Nyan n;
    Meow m;
    std::cout << n.omg(40) << std::endl;
    std::cout << m.omg(40) << std::endl;
    std::cout << n.omg(40.5) << std::endl;
    // std::cout << m.omg(40.5) << std::endl; // commented out for a reason
}
...