我尝试理解以下代码(取自here):
template <class T> class auto_ptr
{
T* ptr;
public:
explicit auto_ptr(T* p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
T& operator*() {return *ptr;} // <----- The problematic row.
T* operator->() {return ptr;}
// ...
};
当我们使用T&
作为函数的返回类型时,我无法理解我们的意思。如果T
是指向整数(或任何其他类型)的指针,那么我会将T&
解释为整数(或任何其他相应的类型)。但是在上面给出的代码中T
不是指针。 T
是一个类,其成员之一(ptr
)是指向此类对象的指针,但T
不是指针类。那么,T&
作为返回类型意味着什么?
答案 0 :(得分:3)
它与函数返回类型的上下文之外的含义相同,即T&
是引用到T
。在这种情况下,该函数返回对类型T
的对象的引用,调用者可以使用该对象来观察(并且如果T
不是const
,则还可以更改引用的对象)
答案 1 :(得分:0)
T&
只是输入T
的引用。该函数返回对类T
的对象的引用。
答案 2 :(得分:0)
T是一个类,其成员之一(ptr)是指向此类对象的指针,但T不是指针类。
ptr
不是班级T
的成员。它是班级auto_ptr<T>
的成员。
ptr
是指向T
的指针。但T
不是“指针类”的事实
(无论这意味着什么)不会阻止某些东西成为T
的指针。
std::string
是一个字符串类,而不是指针。
std::string str;
是类std::string
的对象。
&str
是str
std::string * ps = &str;
是指向std::string
的指针。
从顶部开始:
template <class T> class auto_ptr
是一个唯一的类模板
模板参数为class T
。您通过指定实例化模板
T
的一些实际类,并声明结果类型的某个对象:
auto_ptr<std::string> aps;
这给你另一个实际的类,“自动指向字符串”,这是 完全像:
class auto_ptr_to_string
{
std::string * ptr;
public:
explicit auto_ptr(std::string * p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
std::string & operator*() {return *ptr;}
std::string * operator->() {return ptr;}
// ...
};
aps
是一个像这样定义的对象。
该类有一个数据成员ptr
,它是指向std::string
的指针。
该课程还有一个操作员:
std::string & operator*() {return *ptr;}
此运算符定义由此产生的行为
将'*' - 前缀应用于auto_ptr<std::string>
类型的对象,
e.g。*aps
。
运算符的定义告诉您它返回一个引用
std::string
,此引用所引用的std::string
为。{1}}
*ptr
,表示“数据成员ptr
引用的那个”。
所以:
auto_ptr<std::string> aps(new std::string("Get it?"));
构造一个名为auto_ptr<std::string>
的{{1}}和构造函数
使用指向动态的指针初始化数据成员aps
分配aps.ptr
包含“Get it?”。
和
std::string
根据std::string s = *aps;
的定义,
声明auto_ptr<std::string>::operator*()
std::string
并使用s
对其进行初始化
由std::string
引用,即包含“Get it?”的那个
最后,模板参数的aps.ptr
语法实际上并不存在
将它们的值限制为类:class T
,例如,很好,
虽然auto_ptr<int>
不是类类型。我重申Mike Seymour的评论
关于int
是一件坏事。