【Effective C++】copy构造函数(以值传递&以引用传递)

copy构造函数通常用来“以同类型对象初始化自我对象”

对以下代码,当有新对象创建时,会调用构造函数,而无新对象创建则调用赋值函数。

class W{
public:
    W();
    W(const W& rhs);
    W& operator=(const W& rhs);
    bool hasAcceptableQuality(W w);
};

W w1;  //调用default构造函数
W w2(w1);  //调用copy构造函数
w1 = w2;  //调用赋值函数
W w3 = w2; //调用copy构造函数

W w4;
if(hasAcceptableQuality(w4)){}  //将由copy构造函数创建“ W w = w4; ”

当用户自定义对象以值传递时,会调用构造函数(包括它所继承的类的构造函数)来copy当前对象所有关系值。

且当函数定义为其基类时,会丢失继承类的特殊属性。——“切割”问题

class Window{
public:
    std::string name() const;
    virtual void display() const;
};
class WindowHigher: public Window{
public:
    virtual void display() const;
};

void printND(Window w){  //基类对象w
    std::cout << w.name();
    w.display();
}

WindowHigher ww;
printND(ww);  //在函数内被copy成基类对象而可能丢失WindowHigher的display中的某些特性

此时考虑以引用传递,传入函数printND的参数属于什么类它就会属于什么类。

void printND(const Window& w){
    std::cout << w.name();
    w.display();
}
  • 尽量以引用传递而非以值传递,除非是内置类型/STL的迭代器和函数对象

另外补充ref和out的使用:

ref和out是C#中的关键词,用于将参数传递表示为一以引用方式传递。

1. ref

  • 使用ref必须在参数声明和调用的时候都带上ref关键字;

  • 只能修饰变量,不能修饰常量;

  • 在方法中可以对ref修饰的值不改变,但是在传参前必须给参数赋值。

本身就为引用传递时,再加上ref和不加ref一样,都保持引用传递。

2. out

  • 其作用与使用方法与ref类似;
  • out在使用前不必赋初始值,但在返回的时候必须为他赋值(所以out主要侧重于输出)

猜你喜欢

转载自blog.csdn.net/PPPPluie/article/details/88838606