具有const指针的向量构造函数示例

时间:2018-08-20 18:32:41

标签: c++

我正在阅读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; 

我认识到每个构造函数都在使用成员初始化器列表。

  1. 默认构造函数将xyz初始化为类型为0的{​​{1}}

  2. 构造函数接受Txy的显式性并相应地初始化成员变量。

我不确定2.试图说明什么,或者我将如何使用它。 z到底是什么意思?我知道const T &xx是指向类型xx的某个变量的指针,但是T是指向指针本身还是指向的变量?此外,用相同的变量初始化constxy有什么意义?

1 个答案:

答案 0 :(得分:3)

const T &xx是对&的引用(const T)。

通过使用引用而不是简单地传递T xx,可以避免潜在的昂贵副本,以防T是复杂类型。 (在这种情况下,可能是过早的优化,因为典型的Vec3仅会用floatdouble之类的类型实例化,但编译器仍会对其进行优化。)

通过引用 const T,调用者可以确定他们传入的T不会被构造方法修改。而且,调用方将能够传递已经为const的值,例如文字(例如Vec3<double>(1.0))。

带有const的规则是:它始终指先于的事物。因此,int const *x表示x是指向const int的(可变)指针,而int *const x意味着x是指向const的指针(可变)intint const *const x也可以。

但是如果const是类型中的第一个标记,那么在它之前没有任何东西怎么办?然后它“跳过一个”,因此const T &xxT const &xx相同。为了保持一致,我更喜欢编写后者,但是许多人使用前者,因为它从左到右的阅读更加自然。

例如,如果要将向量设置为(1, 1, 1),则此构造方法将很有用。具有可疑的数学意义,但有时很有用。例如,通过将向量(x, y, z)乘以(1, 1, 1),我们可以轻松计算出前一个向量的和。