博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++静态成员(2) - 静态数据成员
阅读量:4071 次
发布时间:2019-05-25

本文共 1744 字,大约阅读时间需要 5 分钟。

目录


1.静态成员的构造

参考下面程序输出:

#include 
class A{public: A() { std::cout << "A's Constructor Called" << std::endl; }};class B{ static A a;public: B() { std::cout << "B's Constructor Called" << std::endl; }};int main(){ B b; return 0;}

输出:

B's Constructor Called

结论:程序只调用了B的构造函数,而没有调用A的构造函数。原因很简单,静态成员仅仅在类声明的时候而声明,但是不会定义。它们必须在类的外边被显示地定义。

2.静态成员的访问

如果访问这个没有被显式定义的静态成员'a', 编译会失败。见下面例子。

#include 
using namespace std;class A{ int x;public: A() { cout << "A's constructor called " << endl; }};class B{ static A a;public: B() { cout << "B's constructor called " << endl; } static A getA() { return a; }};int main(){ B b; A a = b.getA(); return 0;}

编译失败,输出:

Compiler Error: undefined reference to `B::a' 

如果添加了对‘a’的定义后,程序可以正常运行,并调用A的构造函数。

#include 
class A{ int x;public: A() { std::cout << "A's constructor called " << std::endl; }};class B{ static A a;public: B() { std::cout << "B's constructor called " << std::endl; } static A getA() { return a; }};A B::a; // 对a进行定义int main(){ B b1, b2, b3; A a = b1.getA(); return 0;}

输出:

A's constructor called
B's constructor called
B's constructor called
B's constructor called

3.静态成员的初始化

从上面的运行结果看到:

1. A的构造函数先于B的构造函数被调用,因为它是静态成员。

2. 上述程序调用了3次B的构造函数,而只调用了1次A的构造函数。这是因为静态成员是在所有对象间共享的。这也是为何说它们都是类级别的或类作用域的。
3. 另外,静态成员可以不需要用任何对象来访问。下面例子中静态成员'a'不需要依靠任何对象进行访问。

#include 
class A{ int x;public: A() { std::cout << "A's constructor called " << std::endl; }};class B{ static A a; // a的声明public: B() { std::cout << "B's constructor called " << std::endl; } static A getA() { return a; }};A B::a; // a的定义int main(){ // 静态成员不需要依靠任何B的对象来访问。 A a = B::getA(); return 0;}

输出:

A's constructor called

 

转载地址:http://bqeji.baihongyu.com/

你可能感兴趣的文章
Android自定义View实现商品评价星星评分控件
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql中wal日志什么时候会触发归档
查看>>
Centos 6.8 上 DRBD安装和使用
查看>>
history查看历史操作记录,并显示操作时间
查看>>
postgresql修改完端口后直接psql连接数据库报错
查看>>
pl/proxy-2.5安装在postgresql9.6上无法编译
查看>>
postgresql遇到“Connection refused”和“No route to host”大概的解决方法
查看>>
postgresql上安装sysbench-0.5
查看>>
pgpool3.2.9中编译 pgpool-walrecrunning函数出错
查看>>
benchmarksql在postgresql上的安装、使用
查看>>
使用yum安装postgresql 10 dev
查看>>
postgresql减少wal日志生成量的方法
查看>>
postgresql使用RHCS套件搭建HA高可用集群
查看>>
postgresql initdb过程中大体做了什么
查看>>
linux下的mysql源码安装
查看>>
plsql连接oracle出现ORA-12154: TNS: 无法解析指定的连接标识符
查看>>
oracle 查看库中每个表所占的空间大小
查看>>