@@ -81,18 +81,26 @@ object, no confusion arises from this affordance.
81
81
82
82
## Constructors That Do More
83
83
84
- Implicitly calling a constructor isn’t such a good idea if its output is a
85
- different value than its input, or if it might have preconditions.
86
-
87
- Consider a ` Request ` class with a constructor ` Request(Server*, Connection*) ` .
88
- There’s no sense in which the value of the request object “is” the server and
89
- connection — it’s just that we can create a request that uses them. There could
90
- be many semantically different types that can be constructed from `{server,
91
- connection}` , such as a ` Response` . Such a constructor should be ` explicit`, so
92
- that we can’t pass ` {server, connection} ` to a function that accepts a ` Request `
93
- (or ` Response ` ) parameter. In such cases marking the constructor as ` explicit `
94
- makes the code clearer for readers by requiring the target type to be named when
95
- it’s instantiated and helps to avoid bugs caused by unintended conversions.
84
+ The constructor should be ` explicit ` when it may have preconditions or when
85
+ the new object is a different kind of thing than its inputs (that is,
86
+ when the inputs do not uniquely define the object but are used to build
87
+ a new thing that has additional semantic meaning or state beyond these
88
+ inputs).
89
+
90
+ Consider a ` Request ` class with a constructor `Request(Server* ,
91
+ Connection* )`. The server and connection are not converted into a
92
+ request object. Rather, we use this constructor to create a new object
93
+ that uses the inputs and has an implied direction of information flow.
94
+ There could be many semantically different types that can be constructed
95
+ from ` {server, connection} ` , such as a ` Response ` going in the opposite
96
+ direction from a ` Request ` .
97
+
98
+ Such a constructor should be ` explicit ` so that we can’t pass
99
+ ` {server, connection} ` to a function that accepts a ` Request ` or
100
+ ` Response ` parameter. Marking the constructor as ` explicit ` makes the
101
+ code clearer for readers by requiring the target type (and thus the
102
+ intended direction) to be named when it’s instantiated. This
103
+ explicitness helps to avoids bugs caused by unintended conversions.
96
104
97
105
<pre class =" prettyprint lang-cpp code " >
98
106
// A line is defined by two distinct points.
0 commit comments