在c ++中返回对象的最佳方法?

ans*_*art 13 c++

当涉及到c ++时,我很吵,返回对象的更好方法是什么?我来自脚本世界,其中对象总是引用,并且我试图实现相同的概念......我基于何时通过引用传递以及何时通过C++中的指针传递?,一个用户说:"一个好的经验法则:"当你需要时使用引用,当你需要时使用指针"."

// basic layer class
class Layer { private: Channel channel; // NEVER NULL };

// return object by pointer
Channel *Layer::getChannel() {
    return &channel;
};

// return by reference
Channel& Layer::getChannel() {
    return channel;
};
Run Code Online (Sandbox Code Playgroud)

第二个版本的问题是编译器将接受这一行:

Channel channel = layer.getChannel();  // creates a copy BAD
Run Code Online (Sandbox Code Playgroud)

应该是什么时候:

Channel &channel = layer.getChannel();  // reference good
Run Code Online (Sandbox Code Playgroud)

有没有办法强制第二个选项的调用者强制它不创建新的通道,或者是第一个选择更好,即使它永远不会是NULL?

jal*_*alf 11

您需要调整Channel类本身,使其不可复制.如果它是可复制的,则用户可以复制它,而您所做的任何事情都无法阻止它.

如果复制不是一个有意义的操作,那么你可以"禁用"它.只需将复制构造函数(Channel(const Channel&))和赋值运算符(Channel& operator=(const Channel&))定义为私有.然后,任何复制该类的尝试都将导致编译错误.

另外,正如其他人所提到的,C++并不是您熟悉的脚本语言.一切都不是一个参考,你只是通过假装来为自己创造一个痛苦的世界.在C++中,通常在堆栈上分配对象,并按值传递对象,而不是传递引用和指针.