从C++中返回函数
我最近看到一个关于堆栈溢出的问题,如何从函数中获取派生对象, 有人建议创建本地对象并从函数返回副本。从函数返回这个怎么样 我只是想知道,这是好的编码实践吗 谢谢你的帮助和时间 下面是我的示例代码从C++中返回函数,c++,polymorphism,C++,Polymorphism,我最近看到一个关于堆栈溢出的问题,如何从函数中获取派生对象, 有人建议创建本地对象并从函数返回副本。从函数返回这个怎么样 我只是想知道,这是好的编码实践吗 谢谢你的帮助和时间 下面是我的示例代码 class Base { public: virtual ~Base() {} }; class Derived: public Base { private: int i; pu
class Base {
public:
virtual ~Base() {}
};
class Derived: public Base
{
private:
int i;
public:
Derived* func(int e) {
i = e;
return this;
}
int getI() { return i; }
};
您可以像这样使用代码
Derived d;
Derived* d_ptr = d.func(123);
假设有一个合适的构造函数,写这个似乎更容易
Derived x(123);
Derived* x_ptr = &x;
但可能您正在考虑其他问题。您可以像这样使用代码
Derived d;
Derived* d_ptr = d.func(123);
Derived d;
Derived* d_ptr = d.func(123);
假设有一个合适的构造函数,写这个似乎更容易
Derived x(123);
Derived* x_ptr = &x;
但也许你在想别的事情
Derived d;
Derived* d_ptr = d.func(123);
为什么d_ptr=&d;
whey d.func返回此值?使用d.func时,用户的指针为d。不用再回来了。可能需要在链中使用,如d.func(1)->func2->func3
为什么d_ptr=&d;
whey d.func返回此值?使用d.func时,用户的指针为d。不用再回来了。可能需要在类似于d.func(1)->func2->func3的链中使用几个用于返回自引用但不返回指针的运算符: 复制/移动作业 预增量/减量 运算符+=,运算符-=。。。 主要是模仿内置行为 允许连锁经营:a=b=c=42;而不是c=42;b=c;a=b 滥用链接并没有必要更具可读性,而拆分成几个语句可能更清晰 专业链接也适用于setter:
rectangle.set_height(42).set_width(21).set_position(x, y);
关于指针和引用,返回指针通常意味着nullptr是可能的值,否则引用更好
可能返回指针的运算符是运算符&的地址和箭头运算符->
default&的行为已经返回了这个值,所以不需要重载它来返回这个值
运算符->应在末尾返回指针;根据包装器类的不同,这可能是一个有效的选择。几个用于返回自引用但不返回指针的运算符: 复制/移动作业 预增量/减量 运算符+=,运算符-=。。。 主要是模仿内置行为 允许连锁经营:a=b=c=42;而不是c=42;b=c;a=b 滥用链接并没有必要更具可读性,而拆分成几个语句可能更清晰 专业链接也适用于setter:
rectangle.set_height(42).set_width(21).set_position(x, y);
关于指针和引用,返回指针通常意味着nullptr是可能的值,否则引用更好
可能返回指针的运算符是运算符&的地址和箭头运算符->
default&的行为已经返回了这个值,所以不需要重载它来返回这个值
运算符->应在末尾返回指针;这可能是一个有效的选择,具体取决于包装类。这将返回指向现有派生类的指针。这就是你想要的吗?事实上,我想知道这是一个很好的实践,还是我们这样做会有任何副作用?没有副作用,但你有一个问题,你总是与指针有关,那就是确保被指向的对象至少和指针一样长。换言之,你并没有结束一个悬空指针。在某些情况下,这是用于“流畅”类接口,但是在C++中有使流畅界面更可读的引用。使用指针返回可以编写obj.Derived->getI',但是如果返回类型是派生的&',而返回是return*this;,然后您可以编写obj.Derived。getI@DNT我理解,我们可以从函数中返回它,我看到了你们所说的区别,谢谢。这将返回一个指向现有派生函数的指针。这就是你想要的吗?事实上,我想知道这是一个很好的实践,还是我们这样做会有任何副作用?没有副作用,但你有一个问题,你总是与指针有关,那就是确保被指向的对象至少和指针一样长。换言之,你并没有结束一个悬空指针。在某些情况下,这是用于“流畅”类接口,但是在C++中有使流畅界面更可读的引用。使用指针返回可以编写obj.Derived->getI',但是如果返回类型是派生的&',而返回是return*this;,然后您可以编写obj.Derived。getI@DNT我理解,我们可以从函数返回这个,我看到了区别,谢谢。我指的是关于堆栈溢出的问题,was create object而不使用新运算符只要对象的副本构造函数不是私有的或受保护的,就可以返回该对象的副本:派生函数{…返回派生;}。如果没有定义复制或移动构造函数,或者没有定义适当的构造函数,那么编译器很可能会将其优化为移动。@DNT感谢您的帮助。你怎么能接受你所有的答案helpful@VenkataCharyPadala通过声明变量创建对象,
或者使用构造函数创建DNT建议的临时对象。我所指的问题是在堆栈溢出时提出的,即不使用新运算符创建对象只要对象的副本构造函数不是私有的或受保护的,就可以返回对象的副本:派生函数{…返回派生;}。如果没有定义复制或移动构造函数,或者没有定义适当的构造函数,那么编译器很可能会将其优化为移动。@DNT感谢您的帮助。你怎么能接受你所有的答案helpful@VenkataCharyPadala您可以通过声明变量来创建对象,或者使用构造函数来创建DNT建议的临时对象。