Effective C++ .06 阻止编译器自动生成函数以及被他人调用

这节讲了下如何防止对象拷贝(隐藏并不能被其他人调用)

两种方法:

1. 将拷贝构造函数声明为private 并且声明函数但不进行定义

#include <iostream>

#include <cstdlib>



class Dummy {

public:

    Dummy(int d = 0) : data(d) {}

    Dummy* getCopy() {

        Dummy* x = new Dummy(*this);

        return x;

    }

private:

    int data;

    Dummy(const Dummy& org);

};



int main() {



    Dummy d(1);



    // will case link error

    d.getCopy();



    // will case compile error

    Dummy d2(d);

    

    return 0;

}

不进行定义是防止被内部的函数调用,这样就会在链接的时候报错。

 

2. 继承一个拷贝构造函数和copy assignment函数为private的类,如05所述,默认的拷贝函数会调用父类和成员的对应拷贝函数,如果这个函数不能执行那么函数就无法被生成了

class Uncopyable {

public:

    Uncopyable(){};

private:

    Uncopyable(const Uncopyable&);

    Uncopyable& operator=(const Uncopyable&);



};



class Fake: public Uncopyable {

private:

    int data;

public:

    Fake(int d): data(d){};

};



    Fake f(1);

    Fake f2(f);

[Note] 'Fake::Fake(const Fake&)' is implicitly deleted because the default definition would be ill-formed:

[Error] 'Uncopyable::Uncopyable(const Uncopyable&)' is private

这里也只能阻止默认拷贝

你可能感兴趣的:(effective)