C++阻止拷贝

来源:互联网 发布:mac彩妆价格表 编辑:程序博客网 时间:2024/05/24 01:37
#include<iostream>using namespace std;class Base{public:Base(){}private://将拷贝控制成员声明为私有成员(防止用户代码调用,但友元仍可调用它们)并且不定义它们(防止友元调用),可以阻止拷贝Base(const Base&);Base& operator=(const Base&);friend void friendfun();};void func(Base b){}void friendfun(){Base v1,v2;v1=v2;}int main(){Base b1;Base b2;b2=b1;//用户代码调用私有成员,编译期errorfunc(b1);//用户代码调用私有成员,编译期errorfriendfun();//访问未定义成员,链接error}

有时需要防止拷贝,可以采用如上做法。

运行结果如下,防止了用户代码和友元对拷贝控制成员的调用

1>d:\documents\visual studio 2010\projects\test\test\main.cpp(82): error C2248: “Base::operator =”: 无法访问 private 成员(在“Base”类中声明)

1>d:\documents\visual studio 2010\projects\test\test\main.cpp(83): error C2248: “Base::Base”: 无法访问 private 成员(在“Base”类中声明)
1>main.obj : error LNK2019: 无法解析的外部符号 "private: class Base & __thiscall Base::operator=(class Base const &)" (??4Base@@AAEAAV0@ABV0@@Z),该符号在函数 "void __cdecl friendfun(void)" (?friendfun@@YAXXZ) 中被引用

1>d:\documents\visual studio 2010\Projects\test\Debug\test.exe : fatal error LNK1120: 1 个无法解析的外部命令

另外,在C++11中,可以在函数的参数列表后加上=delete来防止拷贝。

#include<iostream>using namespace std;class Base{public:Base(){}private:Base(Base&)=delete;Base& operator=(Base&)=delete;friend void friendfunc();};void friendfunc(){Base v1,v2;v1=v2;}void func(Base){}int main(){Base d1,d2;d1=d2;//errorfunc(d1);//errorfriendfunc();//error}


0 0
原创粉丝点击