使用object参数或没有函数参数?

时间:2014-10-23 21:48:51

标签: c++

为类创建函数时,参数是否应该使用指向类类型的指针并使用“this”调用,或者创建无参数函数并正常调用它。这是一个演示:

class ExampleOne {

   ExampleOne::ExampleOne() {
      performAction(this);
   }


   void ExampleOne::performAction(ExampleOne *obj)
   {
      // Do something
   }

}


class ExampleTwo {

   ExampleTwo::ExampleTwo() {
      performAction();
   }

   void ExampleTwo::performAction()
   {
      // Do something
   }
}

在ExampleOne中,使用指向自身的指针调用类函数。在ExampleTwo中,不带参数调用函数。

我已经看到了c ++代码中使用的两种方法,并且不知道哪种方法是正确的。

同样的问题适用于使用全局实例变量,如下所示:

class ExampleThree {
   ExampleThree::ExampleThree() {
      Object *obj = new Object;

      someFunction(obj);
   }

   ExampleThree::someFunction(Object *obj) {
      // Do something
   }
}

或者我们是否使用实例变量而不是指向它的指针:

class ExampleFour {
   ExampleFour::ExampleFour() {
      Object *obj = new Object;

      someFunction();
   }

   ExampleFour::someFunction() {
      // Do something with Obj instance
   }
}

2 个答案:

答案 0 :(得分:1)

这样做的原因是代码重用,当在构造函数中完成的某些工作可以在其他函数中使用时,如果它不能,那么你不应该创建一个单独的函数。并且您不应该在需要之前制作重用函数。

C ++ 03方式

A {
  A() {
    Common(42);
  }
  A(int a) {
    Common(a);
  }
  void Common(int c) {
    ... do something really complicated with c
  }
}

C ++ 11方式

A {
  A() : A(42) {  // you can now call other constructors.
  }
  A(int a) {
    ... do something really complicated with c
  }
}

同样在C ++ 11中,移动构造函数和移动赋值函数大部分共享相同的代码(后者也有返回),可以重复使用。

首选方法是在构造函数的初始化列表中执行所有操作,这样可以使一切更安全。如果确实需要,只能在体内做些什么。

C {
  int dc;
  C(int c) : dc(c) {
  }
}

答案 1 :(得分:0)

当你写这样的东西时

MyClass myObject;
myObject.someFunction();

myObject通过引用MyClass::someFunction隐式传递,因此您可以按名称访问其属性或方法,而无需使用关键字this

使用this的常用方法是在实际需要指针或对象的引用时。例如,当您重载operator=()以使其返回对return *this;

对象的引用时,这种情况很常见