我正在阅读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
类型T
?
构造函数接受
x
,y
,和z
显式性并相应地初始化成员变量。
我不确定 2. 试图说明什么,或者我将如何使用它。 const T &xx
是什么意思?确切的意思是?我明白了xx
是指向 T
类型的某个变量的指针,但是是 const
引用指针本身还是它指向的变量?此外,初始化x
有什么意义? , y
,和z
使用相同的变量?
最佳答案
const T &xx
是对 &
的引用 ( const T
) .
通过使用引用而不是简单地传递 T xx
,可以避免潜在昂贵的拷贝,以防万一 T
是一个复杂类型。 (在这种情况下可能是过早的优化,因为典型的 Vec3
只会用 float
或 double
等类型实例化,但编译器无论如何都会优化它。)
通过使其成为对 const
的引用 T
,调用者可以确定T
它们传入的不会被构造函数修改。此外,调用者将能够传递已经是 const
的值。 ,如文字(例如 Vec3<double>(1.0)
)。
const
的规则is:它总是指它之前的事物。所以int const *x
意味着x
是一个指向 const
的(可变)指针int,而int *const x
意味着x
是 const
指向(可变)的指针 int
。 int const *const x
也是可以的。
但是如果 const
又会怎样呢?是类型中的第一个标记,所以它前面没有任何内容?然后它“跳过一个”,所以 const T &xx
与 T const &xx
相同。为了保持一致性,我更喜欢写后者,但很多人使用前者,因为从左到右读起来更自然。
如果您希望将 vector 设置为(1, 1, 1)
,则此构造函数将很有用。 , 例如。数学意义值得怀疑,但有时很有用。例如,通过乘以 vector (x, y, z)
通过(1, 1, 1)
我们可以很容易地计算出前一个 vector 的分量之和。
关于c++ - 带有 const 指针的 vector 构造函数示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936650/