我正在阅读this计算机图形学教程,并遇到了以下代码示例。
template<typename T>
class Vec3
{
public:
// 3 most basic ways of initializing a vector
Vec3() : x(T(0)), y(T(0)), z(T(0)) {}
Vec3(const T &xx) : x(xx), y(xx), z(xx) {}
Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
T x, y, z;
};
typedef Vec3<float> Vec3f;
Vec3<float> a;
Vec3f b;
我认识到每个构造函数都在使用成员初始化器列表。
默认构造函数将x
,y
和z
初始化为类型为0
的{{1}}
?
构造函数接受T
,x
和y
的显式性并相应地初始化成员变量。
我不确定2.试图说明什么,或者我将如何使用它。 z
到底是什么意思?我知道const T &xx
是指向类型xx
的某个变量的指针,但是T
是指向指针本身还是指向的变量?此外,用相同的变量初始化const
,x
和y
有什么意义?
答案 0 :(得分:3)
const T &xx
是对&
的引用(const T
)。
通过使用引用而不是简单地传递T xx
,可以避免潜在的昂贵副本,以防T
是复杂类型。 (在这种情况下,可能是过早的优化,因为典型的Vec3
仅会用float
或double
之类的类型实例化,但编译器仍会对其进行优化。)
通过引用 const
T
,调用者可以确定他们传入的T
不会被构造方法修改。而且,调用方将能够传递已经为const
的值,例如文字(例如Vec3<double>(1.0)
)。
带有const
的规则是:它始终指先于的事物。因此,int const *x
表示x
是指向const
int的(可变)指针,而int *const x
意味着x
是指向const
的指针(可变)int
。 int const *const x
也可以。
但是如果const
是类型中的第一个标记,那么在它之前没有任何东西怎么办?然后它“跳过一个”,因此const T &xx
与T const &xx
相同。为了保持一致,我更喜欢编写后者,但是许多人使用前者,因为它从左到右的阅读更加自然。
例如,如果要将向量设置为(1, 1, 1)
,则此构造方法将很有用。具有可疑的数学意义,但有时很有用。例如,通过将向量(x, y, z)
乘以(1, 1, 1)
,我们可以轻松计算出前一个向量的和。