ClassName&作为回归类型意味着什么?

时间:2013-04-05 16:42:20

标签: c++ pointers syntax types return-type

我尝试理解以下代码(取自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&作为返回类型意味着什么?

3 个答案:

答案 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的对象。

&strstr

的地址
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是一件坏事。