首页 > 试题广场 >

有如下程序,执行后输出的结果是

[单选题]
有如下程序,执行后输出的结果是(      )
#include <iostream>
using namespace std;
class cla {
    static int n;

  public:
    cla() { n++; }
    ~cla() { n--; }
    static int get_n() { return n; }
};
int cla::n = 0;
int main() {
    cla *p = new cla;
    delete p;
    cout << "n=" << cla::get_n() << endl;
    return 0;
}
  • n=3
  • n=4
  • n=1
  • n=0
类的实例化:cla *p = new cla,p分配在栈上,p指向的对象分配在堆上。
n为静态成员变量,没有this指针,属于类域,所有对象共享。
实例化——调用构造函数,所以n++;
delete——调用析构函数,所以n--。
最后输仍旧为0。
如图:
编辑于 2016-10-17 13:13:07 回复(5)
为啥选的c语言专项练习老是来c++的题
发表于 2022-02-21 22:36:25 回复(2)
类的静态数据成员的生命期与程序生命期相同,只是在该类内可见。
发表于 2015-09-12 13:50:27 回复(0)
动态申请  p指向的对象分配在堆上    实例化与delete的调用 分别执行构造和析构函数
发表于 2017-02-23 10:56:07 回复(0)
 cla *p =newcla;会调用构造函数
 deletep;会调用析构函数
发表于 2017-06-05 10:08:28 回复(0)
new一个新对象的时候,会调用构造函数;
delete一个对象之前,会调用析构函数,进行一些清理工作
发表于 2021-05-17 10:08:26 回复(0)
D
发表于 2015-09-11 23:07:45 回复(0)
Delete会调用析构,记住了
发表于 2025-03-09 11:56:12 回复(0)
我的理解就是 new一下,这个构造函数给p指向的n++,delet一下,析构函数给n--,可以这么理解吗

发表于 2023-10-08 19:22:28 回复(0)

static

发表于 2019-11-26 12:04:34 回复(0)
   staticintget_n(){returnn;}
这是一个静态成员函数,也就是说在编译时期,就已经确定好了 n 的值,这是因为 staticintn;被初始化为0. 
因而cla::get_n() 显然这是针对静态成员函数中的变量n的值。
若类中还有其他类成员变量 int n 的定义,则它的调用也应该是  类::n 或者成员函数访问n ,(默认是private)
另一角度,类成员变量n 的存储位置是在栈中,而类静态成员函数的 变量n ,是存储在堆中,因而访问的也不是同一个 变量 n 的值。
发表于 2017-06-05 15:22:33 回复(0)
D
编辑于 2015-09-14 00:09:55 回复(0)
main函数修改如下

int main()
{
    cla * p = new cla ;
    delete p;
    cout<< "n=" << cla::get_n() << endl;
    return 0;
}

输出结果:n = 0;
发表于 2015-09-13 21:59:12 回复(1)
代码都有错……
发表于 2015-09-12 16:41:03 回复(1)
构造函数执行一次,析构函数执行一次,故n=0;
发表于 2015-09-12 10:21:58 回复(0)