把构造函数声明为protected的理由很简单,但把构造函数声明为private的原因却很少知道.
从语法上讲,任何函数如果被声明为private,这个函数就不能从外部调用,构造函数也是函数,相反,只能成为在内部使用的构造函数,但偏偏有些场景就是要这样处理,才可以达到一定的程序设计效果:
1.屏蔽构造函数,就是不让你创建这个类的对象,就是不想让你在外面的其他函数中直接new这个类,而只能从此类内部进行构造(如下面的代码)。
2.阻止其他函数中执行此类的拷贝构造函数或赋值操作符,避免编译器自动生成默认的拷贝构造函数,不想按照默认的拷贝构造函数进行逐字段拷贝或赋值操作符,这时可以把拷贝构造函数或赋值操作符声明成private的
1 class IOCP 2 { 3 private: 4 IOCP() 5 { 6 //创建完成端口(备注:OS维护的一个队列,OS把i/o操作已经完成的事件通知放到这里)的句柄 7 if ((m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0)) == NULL) 8 ; 9 //创建工作线程,用来处理完成端口消息的 10 m_hWorkerThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, &m_workerThreadID); 11 }; 12 ~IOCP(); 13 private: 14 static IOCP* m_instance; 15 public: 16 static IOCP* Instance() 17 { 18 if( m_instance == NULL ) 19 { 20 m_instance = new IOCP(); 21 } 22 return m_instance; 23 } 24 void Wait(); 25 static DWORD __stdcall WorkThread(LPVOID Param); 26 HANDLE m_hIOCP; //完成端口的句柄 27 private: 28 HANDLE m_hWorkerThread; //工作线程句柄 29 DWORD m_workerThreadID; 30 public: 31 //将套接字绑定到完成端口 32 bool RegisterToCompletionPort( SOCKET socket , void* completionKey); 33 };
时间: 2024-10-29 00:42:38