当我们可以使用普通函数修改静态数据成员时,静态成员函数的需求是什么?
What is the need of static member functions when we can modify the static data members by using normal functions?
当可以使用普通函数修改静态数据成员时,还需要静态成员函数吗?我对静态成员函数的需要感到困惑。
有两个原因:一个是技术上的,另一个是关于代码的可读性。技术方面很简单:静态方法仍然是类的方法,因此它可以访问它的私有成员。它是类的一部分,知道类的所有内部信息是可以的。
但更重要的是类是名称空间。它们构建你的代码。通过使用静态方法,您可以告诉每个人它属于类并且与类紧密相关。
静态成员函数的必要性
你需要将类的成员函数声明为静态,以便能够在不实例化对象的情况下调用它。例如,查找Singleton模式
何时可以使用普通函数修改静态数据成员?
并非总是如此!除非先实例化一个对象,否则不能从非静态成员函数修改静态数据成员。另一方面,无论是否实例化了对象,都可以从静态成员函数中实现。
static
意味着(在类的上下文中)您总是可以像调用ClassName::MethodName()
而不是ClassName instance; instance.MethodName
那样调用方法。
意味着-你可以从非静态成员函数调用静态成员函数,但不能反过来,因为静态成员函数不拥有一个或多个类的实例。
无需创建类的任何对象即可调用静态函数。
如。
假设你有一个包含房屋数量的Street类和一个静态方法addHouse(),它将房屋数量增加1。
如果您想创建一个新房子,那么只需在house的构造函数中调用addHouse()即可。如果您创建了非静态成员,那么每次为House创建对象时都必须创建Street的新对象。
class Street
{
static int numberOfHouses = 0;
public:
static void addHouse()
{
numberOfHouses ++;
}
void incrementHouse()
{
numberOfHouses++;
}
};
class House
{
public:
House()
{
Street::addHouse();
//this will not create a new object for Street
Street s;
s.incrementHouse();
// you would have to allocate memory for extra object of street class for this.
}
};
类中的静态意味着数据不属于所创建的对象,而是属于类本身。所有对象的数据都是相同的(不相等,但地址相同)。
静态方法将使编译器确保它只处理静态数据。它也使它更清晰,因为当你看到一个静态方法时,你知道它不需要任何"活动"对象数据。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 函数静态成员变量
- 隐藏模板化的辅助函数——静态成员或未命名的命名空间