C++中类构造函数使用引用形参传递的注意点

C++ primer中刚学面向对象语言的封装的时候有对sale_items卖书的例子进行试验,定义一个类,里面有类的函数,类的函数我们直接使用构造函数去定义。

#include
#include 

using namespace std;

class Sales_item{
public:
    Sales_item(string &in, unsigned units, double rev):isbn(in),units_sold(units),revenue(rev){//相当于这里就是构造函数

    }
    double avg_price() const{
        if(units_sold)
            return revenue/units_sold;
        else
            return 0;
    }
    bool same_isbn(const Sales_item &rhs) const{
        return isbn == rhs.isbn;
    }

    void add(const Sales_item &rhs)
    {
        units_sold += rhs.units_sold;
        revenue += rhs.revenue;
    }

private:
    string isbn; //书号
    unsigned units_sold;
    double revenue;
};

class Person{
public:
    Person(const string &nm, const string &addr):name(nm),address(addr){//这里初始化私有成员列表要比内部初始化要好
//        name = nm;
//        address = addr;
    }
    string getName(){
    return name;
    }
    string getAddress(){
        return address;
    }
private:
    string name;
    string address;

};

// 命令行选项
int main() {
    Person a("bill", "street");


    a.getName();
    a.getAddress();
//    string s = "dwffwfwfwf";
    Sales_item x("dwdwfwfw",2,20.0);
    cout << x.avg_price() <<endl;
    return 0;
}

出现以下错误:
C++中类构造函数使用引用形参传递的注意点_第1张图片
我们发现类函数定义的时候string后面是加了引用形参的对吧,就是&in,出现了错误。

public:
    Sales_item(string &in, unsigned units, double rev):isbn(in),units_sold(units),revenue(rev){//相当于这里就是构造函数

但是当把引用形参中的&去掉时,就正确了。说明类函数在实际调用的时候,不能在定义构造函数的时候使用引用形参。

想要使用引用形参的时候应该这样写:

#include
#include 

using namespace std;

class Sales_item{
public:
    Sales_item(string &in, unsigned units, double rev):isbn(in),units_sold(units),revenue(rev){//相当于这里就是构造函数

    }
    double avg_price() const{
        if(units_sold)
            return revenue/units_sold;
        else
            return 0;
    }
    bool same_isbn(const Sales_item &rhs) const{
        return isbn == rhs.isbn;
    }

    void add(const Sales_item &rhs)
    {
        units_sold += rhs.units_sold;
        revenue += rhs.revenue;
    }

private:
    string isbn; //书号
    unsigned units_sold;
    double revenue;
};

class Person{
public:
    Person(const string &nm, const string &addr):name(nm),address(addr){//这里初始化私有成员列表要比内部初始化要好
//        name = nm;
//        address = addr;
    }
    string getName(){
    return name;
    }
    string getAddress(){
        return address;
    }
private:
    string name;
    string address;

};

// 命令行选项
int main() {
    Person a("bill", "street");


    a.getName();
    a.getAddress();
    string s = "dwffwfwfwf";
    Sales_item x(s,2,20.0);
    cout << x.avg_price() <<endl;
    return 0;
}

所以总结:

这里是这样的,不能给引用形式传递临时变量

你必须先定义一个 string 变量,然后才能传给 引用 形式的参数

类的构造函数可以有引用形式的参数,但需要事先定义一个变量

你可能感兴趣的:(C/C++)