C++ Daily 《6》---- 类静态对象与函数静态对象

本文探讨了C++中静态成员变量的行为差异:在函数内声明的静态成员仅当函数被调用时才进行构造,而在类中声明的静态成员则不论类是否被实例化都会被构造。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 的一个哲学基础是,你不应该为你没有使用的东西付出代价。

class 拥有一个 static 成员,即使从未被用到,它也会被构造和析构;

而 函数拥有一个 static 成员, 如果这个函数从未被调用,则这个对象不会被构造。


做个简单的实验:

#include 
using namespace std;

class Printer
{
  friend Printer& thePrinter();
private:
  Printer() {
    cout << "constructor called" << endl;
  }
  ~Printer() {
    cout << "destructor called" << endl;
  }
};

Printer& thePrinter()
{
  static Printer p;
  return p;
}

int main(void)
{
  return 0;
}
结果是没有调用构造函数,因为 thePrinter函数并没有被调用。


相反,类中的一个static 成员,一定会被构造,

#include 
using namespace std;

class Printer
{
  friend class PrintJob;
private:
  Printer() {
    cout << "constructor called" << endl;
  }
  ~Printer() {
    cout << "destructor called" << endl;
  }
};

class PrintJob
{
public:
  static Printer p;
};

Printer PrintJob::p;

int main(void)
{
  return 0;
}

因为类的static 成员独立于对象而存在,因此无论是否定义了这个类的对象,
static 成员都会构造出来。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值