首页 > 代码库 > 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝
【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝
地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子
class HomeFoeSale { ......}
但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作不应该正确!
HomeForSale h; HomeForSale h1(h); //调用复制构造函数 HomeForSale h2 = h; //调用赋值操作符
阻止这两个操作(复制、赋值)可以不声明它们,but自己不声明,编译器会自动生成,并且访问权限还是public。没办法只好声明出来,但是如何组织这两个操作呢,好吧,把他们的访问权限声明为private,因为阻止这两个操作,因此只声明,不定义。例如:
#include <iostream> #include <vector> using namespace std; class base { public: base() {}; private: base(const base&); base& operator=(const base&); }; int main() { base b; base b1(b); }
结果
?
1 2 3 | del 5 .cc: 在函数‘int main()’中: del 5 .cc: 10: 3: 错误: ‘base::base(const base&)’是私有的 del 5 .cc: 18: 11: 错误: 在此上下文中 |
但是问题又来了:如果类中的成员函数或类的友元函数访问咋整,例如:
#include <iostream> #include <vector> using namespace std; class base { public: base() {}; void hello() { base b; base m(b); base n = b; } private: base(const base&); base& operator=(const base&); }; int main() { base b; }
可以利用继承来解决例如
#include <iostream> #include <vector> using namespace std; class base { protected: base() {}; ~base() {}; private: base(const base&); base& operator=(const base&); }; class HomeForSale : public base { public: HomeForSale() : base() {} }; int main() { HomeForSale d; }
这样,HoemForSale的朋友或成员函数也无力回天了(毕竟父类的函数是private的).
反思
c++ 中的流对象就是采用这样的原理.
#include <iostream> #include <fstream> #include <vector> using namespace std; int main() { ifstream i; ifstream i2(i); }
错误提示
?
1 | /usr/include/c++/ 4.6 /bits/ios_base.h: 788: 5: 错误: ‘std::ios_base::ios_base(const std::ios_base&)’是私有的 |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。