C++operatorのできない使い方

1886 ワード

C++に詳しいと思っていたら、突然変なコードが見えました(ネットでダウンロードしたコードSocketsを見ています):
class SocketAddress

{

public:

	virtual ~SocketAddress() {}



	/** Get a pointer to the address struct. */

	virtual operator struct sockaddr *() = 0;



	/** Get length of address struct. */

	virtual operator socklen_t() = 0;



	/** Compare two addresses. */

	virtual bool operator==(SocketAddress&) = 0;



	/** Set port number.

		\param port Port number in host byte order */

	virtual void SetPort(port_t port) = 0;



	/** Get port number.

		\return Port number in host byte order. */

	virtual port_t GetPort() = 0;



	/** Set socket address.

		\param sa Pointer to either 'struct sockaddr_in' or 'struct sockaddr_in6'. */

	virtual void SetAddress(struct sockaddr *sa) = 0;



	/** Convert address to text. */

	virtual std::string Convert(bool include_port) = 0;



	/** Reverse lookup of address. */

	virtual std::string Reverse() = 0;



	/** Get address family. */

	virtual int GetFamily() = 0;



	/** Address structure is valid. */

	virtual bool IsValid() = 0;



	/** Get a copy of this SocketAddress object. */

	virtual std::auto_ptr<SocketAddress> GetCopy() = 0;

};


奇妙なコード:
/** Get a pointer to the address struct. */

	virtual operator struct sockaddr *() = 0;



	/** Get length of address struct. */

	virtual operator socklen_t() = 0;


最後に検索してみると、タイプ変換への重荷だとわかりました!
socklen_tはintタイプである.
宣言:operator XX();戻り値がなく、XXはあるタイプです.
用法:XX a=(XX)obj;上のSocketAddressがabstractクラスではないと仮定します.たとえば、SocketAddress sa;int a = (socklen_t)sa; つまり、元のメンバー関数operator XX()が呼び出されます.普通はXXタイプの値を返して、タイプの変換の重荷に理解することができます!
また、カスタムクラスのコンストラクション関数がステルスなタイプ変換として使用できることを知りませんでした.たとえば、Class A{A(int i){val=i}などです. private int val;} , A a = 5; 解:5まず、コンストラクション関数A(int)によってAタイプにステルスに変換し、デフォルトのoperator=付与関数を呼び出してaに付与する.