成员函数的参数可以是同一类类型吗?

3
//node.h 
class node 
{
      public:
            void sort(node n);

};

我还没有尝试过这段代码。但是知道这是否是一个有效的案例以及为什么很有趣。

编辑:

这让我想到另一个问题: 我能像这样在成员函数中声明 FOO 吗?

//FOO.h
Class FOO
{
   public:
   void sort(int n) ;
   void swap(int x , int y ); 
}

//FOO.cpp

void FOO::sort (int n)
{
     FOO obj;
     obj.swap(3 , 5) ;
}

因为它在同一个类中?这对我来说看起来很奇怪。 - Ahmed
1
你是在纯粹询问如何将一个 node 作为参数按值传递,还是你也觉得传递 node*node& 很奇怪? - Troubadour
传递 node* 或 node& 是传递地址(我认为),但是按值传递 node 就像在定义此类型的类内部复制变量类型一样。 - Ahmed
5个回答

5

是的,这是完全有效的。如果您不能这样做,那么您如何编写复制构造函数呢?

类似但无效的情况是将同一类型包含为类/结构体的成员。

struct Foo
{
  Foo m_foo;
};

您不能这样做,因为这本质上是一个循环定义。如果您有以下内容:
struct Foo
{
  Foo m_foo;
  Foo m_bar;
};

然后一个Foo将变成2个Foos,这将是4个Foos,这将是8个Foos等等,这没有意义。

另一方面,您可以拥有指向同一类型的指针:

struct Foo
{
  Foo* m_foo;
};

因为指向Foo的指针并不等同于Foo本身。指针是指针,无论它指向什么,因此不存在循环定义或依赖关系。


你可以通过使用 const node& 而不是普通的 node 来编写复制构造函数。 - Philip Potter
一个复制构造函数甚至不能使用值作为参数! - UncleBens
没错,我的意思是你可以在类/结构体定义内部使用该类型 :) - Peter Alexander

4
现在我们已经确定您的问题仅涉及在成员中按值传递node(而不是传递node*或node&),答案仍然是肯定的。 如果您希望如此,甚至可以在类中定义成员的主体。
至于原因,请从编译器的角度考虑。在解析类时,它只需要知道其中有哪些数据成员和函数成员签名。 在此阶段不需要解析任何函数成员定义,因此编译器看到实际的节点作为参数并不会感到惊讶。只有在完成数据和签名的解析后,它才会返回并实际处理函数成员定义,在这一点上,它确切地知道什么是节点。
回答您的第二个问题,您可以在成员内定义类的实例(出于相同的原因)。

现在,我明白为什么这是可能的了。好答案。 - Ahmed

2

是的,你可以。这是一个有效的情况。

你可以在C++标准库中找到一些示例:

string& append( const string& str );

2
这不在C++标准库中... :S 多么可怕的函数。 - Peter Alexander
那仍然不是一个普通类型,那是一个引用。 - Philip Potter
@mohammed:它仍然没有反映出问题或来自库。更好的例子是size_t map::iterator::operator-( map::iterator ),尽管该函数没有明确指定为这样,并且很可能被实现为一个自由(非成员)函数。 - Potatoswatter

0

这种情况经常发生。拷贝构造函数就是一个很好的例子:

class Apple {  
public:  
    Apple();  
    Apple(const Apple&);  
};  

0

简短的回答是:是的:

长的回答是:

$9.2/2-“类在类说明符的闭合}处被视为完全定义的对象类型(3.9)(或完整类型)。在类成员说明中,类在函数体、默认参数和构造函数ctor-initializers(包括嵌套类中的这些内容)中被视为完整的。否则,在其自己的类成员说明中,它被视为不完整。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接