为类创建函数时,参数是否应该使用指向类类型的指针并使用“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
}
}
答案 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;