现在考虑一个问题,假如一个类的每一个对象都是独一无二的(不是单例),那么也就是说,拷贝一个对象是非法的,那就得让类的拷贝构造函数和赋值操作函数不可被访问。见如下例子:
class example{
public:
        example();
private:
        example(const example&);                    //只有声明
        example& operator=(const example&);
};
这样,当你试图拷贝对象的时候,编译器就会报错(因为没有权限)
class example {
public:
    example() {};
    
private:
    example(const example&);
    example& operator=(const example&);
};
int main()
{
    example a;
    example b = a;
        return 0;
}
错误提示:
image.png
假如使用类内成员函数或者友元函数来进行赋值操作,由于以上代码只有声明,并没有定义,那么连接器就会报错。
class example {
public:
    example() {};
    static void fun(example& bb, const example& aa) {
        bb = aa;
        
    }
    friend void funf(example& bb, const example& aa);
private:
    example(const example&);
    example& operator=(const example&);
};
void funf(example& bb, const example& aa) {
    bb = aa;
}
int main()
{
    example a;
    example b;
    example::fun(b, a);
    funf(b, a);
        return 0;
}
使用成员函数调用赋值操作错误提示:
image.png
使用友元函数调用赋值操作错误提示:
image.png
有一种将这种连接时的错误提前到编译期的方法,就是声明一个基类,将赋值操作相关的东西设为private,然后用目标类继承这个类,这样因为继承自基类,所以子类就不会声明缺省的拷贝构造函数等,这样无论是以上哪种方式尝试赋值都是非法的(没有权限访问基类的private成员),代码如下
class base {
public:
    base() {};
    
private:
    base(const base&);
    base& operator=(const base&);
};
class example : private base {
};
int main()
{
    example a;
    example b = a;
        return 0;
}
错误提示:
image.png
boost库中也有一个 uncopyable类,也可以达到以上目的。







网友评论