c++定义成员函数

1.定义和声明成员函数的方式和普通函数差不多。成员函数的声明必须在类的内部,他的定义则即可以在类的内部也可以在类的外部。非成员函数的定义和声明都在类的外部。

struct Sales_data{
    std::string isbn() const { return bookNo; }
    double avg_price() const;
    
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

2.成员函数通过名为this的额外的隐式参数来访问调用它的那个对象。

当我们调用一个成员函数时,用请求该函数的对象地址初始化this。

在成员函数内,我们可以直接使用调用该函数的对象的成员,无需通过成员访问运算符。因为this就相当于调用成员函数的那个对象。任何对类成员的直接访问都被看作this的隐式引用。

std::string isbn() const { return bookNo; }//成员函数的定义
total.isbn();//调用成员函数
//调用成员函数,实际上是在替某个对象调用它。isbn反回bookNo时,实际上它隐式反回total.bookNo。
/*
total.isbn()在编译时,编译器负责把total的地址传给isbn的隐式形参this
伪代码:Sales_data::isbn(&total)
this形参是隐式定义的,任何自定义名为this的参数或变量的行为都是违法的。
我们可以在成员函数体内部使用this。
std::string isbn() const {return this->bookNo;}
this总指向这个对象,所以this是个常量指针,不允许改变this中保存的地址。
*/

3.使用const修改隐式this指针的类型:

默认情况下,this的类型是指向类类型非常量版本的常量指针。在Sales_data成员函数中,this的类型是Sales_data *const。这就意味着,默认情况下,我们不能在一个常量对象上调用普通的成员函数(请参考参数传递)。与此同时由于在isbn()函数体内不会改变this所指对象,所以我们完全可以把this设置为指向常量的指针。有助于提高函数灵活性。

std::string isbn() const { return bookNo; }//紧跟参数列表后面的const表示this是一个指向常量的指针,这样使用const的成员函数被称作常量成员函数。


//下面是伪代码,说明this指针是如何使用的,下面代码是非法的,因为我们不能显示定义this指针。这里的this是一个指向常量的指针,因为isbn是一个常量成员。
std::string Sales_data::isbn(const Sales_data *const this)
{return this->isbn;}

4.类的成员函数的定义嵌套在类的作用域之内。在类的外部定义成员函数时,要加上作用域运算符,表示该函数剩余代码是位于类的作用域内的。

struct Sales_data{
    std::string isbn() const { return bookNo; }
    double avg_price() const;
    
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
double Sales_data::avg_price() const{
    if(units_sold)
        return revenue/units_sold;//隐式使用Sales_data成员
    else
        return 0;
}

5.定义一个反回this对象的函数:

combine类似一个符合赋值运算符+=,total.combine(trans);trans相当于+=右侧运算对象,total相当于左侧运算对象。调用total.combine(trans)时,total的地址绑定到隐式的this参数上,rhs绑定到了trans上。

我们定义函数类似于某个内置运算赋时,应该尽量模仿这个运算符,内置的赋值运算符把他左侧运算对象当成左值返回,因此为了保持一致,combine函数必须返回引用类型。所以返回类型是Sales_data&

struct Sales_data{
    std::string isbn() const { return bookNo; }
    double avg_price() const;
    Sales_data& combine(const Sales_data&);
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;//rhs成员加到this对象的成员上。
    revenue += rhs.revenue;
    return *this;//返回调用该函数的对象
}
发布了218 篇原创文章 · 获赞 131 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/104206854