![](/img/trans.png)
[英]Can a static member of a class as the same type as the class it is member of in C++
[英]Can member function arguments be of the same class type?
//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) ;
}
是的,这完全有效。 如果你不能这样做,你怎么能写复制构造函数?
类似但无效的情况包括与类/结构的成员相同的类型。
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不同。 无论指向什么指针,指针都是指针,因此没有循环定义或依赖关系。
现在已经确定您的问题仅与在成员中按值传递node
(而不是传递node*
或node&
)有关,答案仍然是肯定的。 你甚至可以在课堂上定义成员的身体。
至于为什么,从编译器的角度思考问题。 因为它解析了类所有它真正需要知道的是它内部的数据成员以及函数成员签名是什么。 此时不需要解析任何函数成员定义,因此编译器不会因将实际node
视为参数而受到警告。 只有当它完成解析数据和签名时,它才会返回并实际处理函数成员定义,并且在那时它确切地知道node
是什么。
在回答第二个问题时,您可以在成员中定义类的实例(出于同样的原因)。
是的你可以。 这是一个有效的案例。
你可以在c ++标准库中找到一些样本:
string& append( const string& str );
这是经常做的。 复制构造函数是一个很好的例子:
class Apple {
public:
Apple();
Apple(const Apple&);
};
简短的回答是:
答案很长的答案是:
$ 9.2 / 2-“类在类别说明符的结束时被认为是一个完全定义的对象类型(3.9)(或完整类型)。在类成员规范中,该类在函数体内被认为是完整的,默认参数和构造函数ctor-initializers(包括嵌套类中的这类东西)。否则它在自己的类成员规范中被认为是不完整的。“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.