【问题标题】:defining a private member function outside class definition and use of static data在类定义和静态数据使用之外定义私有成员函数
【发布时间】:2019-09-12 10:07:36
【问题描述】:

对于给定的类 Rectangle,我有两个问题。

class Rectangle{
private:
int l;
int w;
static int count;
};

1) 如何在类定义之外定义不同的私有、公有和受保护函数?还有我怎样才能使它们成为静态函数?

2) 不能在类定义之外访问私有变量,但可以直接使用类名调用静态数据,而无需创建任何对象。我可以直接在 main() 函数中访问私有静态数据计数,例如 Rectangle.count=1 吗?如果不是,我应该总是将静态数据声明为公开的吗?

我知道我们使用范围运算符定义成员函数。但我不知道如何将它们设为私有或公开。

int Rectangle::area()
{
return l*w;
}

【问题讨论】:

  • “在类定义之外定义不同的私有、公共和保护函数”是什么意思?你能试着详细说明一下吗?你的两个问题的答案都应该是good book
  • @Ayush Gupta 这是一个过于宽泛的问题。读一本关于 C++ 的书。
  • 我尝试查找答案,但找不到。我在问,这个 area() 函数是公开的还是私有的?如果它是公共功能,我怎样才能将其设为私有或受保护?
  • 那是真正的基本 C++,即使是很烂的书也应该教你如何在类中声明一个成员函数,然后define (实施)它在外面。

标签: c++ class oop static


【解决方案1】:
  1. 类定义之外的类成员函数的定义:

    class Rectangle {
    public:
        int area() const;         // member function declaration
    private:
        int l;
        int w;
        static int count;
    };
    
    int Rectangle::count = 0;     // initialization of the static variable 
    
    int Rectangle::area() const { // member function definition
        return l * w;
    }
    
  2. 我可以直接在main() 函数中访问私有静态数据计数,例如Rectangle.count=1 吗?如果不是,我应该总是将静态数据声明为公开的吗?

    没有,也没有。使其从类外部可访问与将其设置为全局变量没有什么不同,如果这是您想要的,请将其设置为全局变量。否则,只让Rectangle对象、静态成员函数或friends访问静态数据。例如,您可以main() 成为该类的朋友,以使其获得对数据的原始访问(在Rectangle 对象和static 数据中):

    class Rectangle {
    private:
        friend int main();
    };
    

    但如果可以的话,应该避免这种情况。通常最好创建用于访问原始数据的成员函数 - 否则您会突然让 main() 更改 count 值,我猜在这种情况下这将是一个糟糕的主意。

我知道我们使用范围运算符定义成员函数。但我不知道如何将它们设为私有或公开。

它们就是您在类定义中声明的内容。如果它们被声明为public,它们将是公开的等等。


实例计数器示例:

class Rectangle {
public:
    Rectangle(int L, int W);
    Rectangle();
    ~Rectangle();

    int area() const;

    static unsigned get_count();

private:
    int l;
    int w;
    static unsigned count;
};
unsigned Rectangle::count = 0;

unsigned Rectangle::get_count() {
    return count;
}

Rectangle::Rectangle(int L, int W) : l(L), w(W) {
    ++count;
}

Rectangle::Rectangle() :
    Rectangle(0, 0) // delegate
{}

Rectangle::~Rectangle() {
    --count;
}

int Rectangle::area() const {
    return l * w;
}
#include <iostream>

int main() {
    {
        Rectangle r;
        std::cout << Rectangle::get_count() << "\n";
    }
    std::cout << Rectangle::get_count() << "\n";
}

输出:

1
0

【讨论】:

  • 一个friend也可以访问一个类的private数据,不管static与否。
  • @Peter True。我不确定如何在不复杂化的情况下将其融入问题。
  • 可以把响应第2点的最后一句改成“否则只让Rectangle对象、静态成员函数访问,或者好友访问静态数据。”
  • @Peter 好的,我试了一下。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
相关资源
最近更新 更多