Methd类包含相同的类对象

时间:2017-05-18 09:56:40

标签: c++

func1func2合法吗? Methd类包含相同的类对象。

示例:

class Foo
{
public:
    void func1() {
        //...
        Foo foo; // Is it legal?
        //...
    }

    // Is it legal in paramete?
    void func2(Foo object) {
        //...
    }

    // It is legal using reference
    // http://stackoverflow.com/questions/6921185/why-do-objects-of-the-same-class-have-access-to-each-others-private-data
    void func3(Foo& object) {
        //
    }
};

5 个答案:

答案 0 :(得分:4)

  

合法吗?

  

为什么?

class Foo
{
public:
    void func1() {
        //...
        Foo foo; // Is it legal?
        //...
    }
};

在考虑整个类定义之后编译类成员函数的主体。

因此,整个类可用于方法的实现,包括在当前方法之后声明的方法和成员。

[class.mem]

中有这个内容
  

在类成员规范中,该类在函数体,默认参数,引用继承构造函数,异常规范和非静态数据成员的括号或等于初始值的引用中被视为完整(包括嵌套类中的这类东西。)

答案 1 :(得分:2)

是的,在所有情况下都是合法的。

但它在复制的构造函数中是非法的:

// here should be 'const Foo&'
Foo(const Foo object);

答案 2 :(得分:1)

松散地说,自由函数和成员函数之间的唯一区别是成员函数得到this作为第一个参数传递(你没有明确地看到它但它就在那里)。这不完全正确,但足以理解没有理由不在Foo的成员函数中使用Foo

你不能做的是这样的事情:

struct Bar {
    Bar x;
};

这不仅是一个非常奇怪的构造("它的乌龟一直向下",以防你知道引用),而且你的编译器会清楚地告诉你它不能工作。

答案 3 :(得分:0)

是的,在所有这三种情况下都是合法的。

答案 4 :(得分:0)

当然它是100%合法的,这是许多运营商需要作为参数,许多其他功能使用......

看一下这个取自String类的例子:

var a = [];
var sm = grid.getSelectionModel();
var cm = grid.getColumnModel();
Ext.each(sm.getSelections(), function (item, index) {
  var s = 'test';

  a.push(s); //it works, a is accessible
  var colHeader = cm.getColumnHeader(index); //Uncaught ReferenceError: cm is not defined
});

所以字符串类有一个函数将另一个字符串作为参数...