C++中静态成员变量和静态成员函数

C++中静态成员变量和静态成员函数


静态成员变量:

0.静态变量的作用为:同类的多个对象之间实现数据共享(important)
1. 静态成员变量是属于类的,并不是属于某个实例化的对象。
2. 静态成员变量的初始化需要放在类体外进行。
3.静态成员变量的引用可以通过实例化的对象引用,也可以通过类名引用。

静态成员函数:

1.静态成员函数是专门用来操作静态成员变量的,尽管静态成员函数也可以通过传参数的形式访问非静态的成员变量,但为了程序的清晰,最好不要这样操作。

例子:
basenode.h文件内容为(头文件包含略):
<p>class BaseNode</p>{
public:
	static const char *LLVM_NODE_NAME;
}
basenode.cpp文件内容为(头文件包含略):
 const char *LLVM_NODE_NAME="BaseNode";
joinnode.h文件内容为(头文件包含略):
class JoinNode: public BaseNode
{
public:
	static const char *LLVM_NODE_NAME;
}
joinnode.cpp文件内容为(头文件包含略):
 const char *LLVM_NODE_NAME="JoinNode";
main.cpp文件内容为(头文件包含略):

int main()
{
	cout<<BaseNode::LLVM_NODE_NAME<<endl;
	cout<<JoinNode::LLVM_NODE_NAME<<endl;
}

现象:

打印输出的结果为:

BaseNode

JoinNode
如果将joinnode中关于LLVM_NODE_NAME 的声明和定义都注释掉,打印出的结果为:

BaseNode

BaseNode

如果在joinnode中不定义LLVM_NODE_NAME,直接对其进行复制(因为从父类中继承过来),这会出现编译错误。

分析:

通过以上现象可以得出,类在继承的过程中将静态变量也继承过来了,可以以JoinNode::LLVM_NODE_NAME的形式打印出 “BaseNode” 来。

但是如果子类中定义了同名的静态成员变量则会将其覆盖掉。(子类中不赋值,直接打印会是神马情况?猜测应该是空,明天验证下):编译错误,必须初始化

另外(如果是非const 的静态成员变量,在子类JoinNode中不重新定义,而是直接赋值,情况又是怎样的呢?猜测这次应该不会有编译错误,应该输出两个JoinNode吧?明天验证下)是的,确实是两个“JoinNode” ,但是注意不能直接赋值,直接赋值的结果是编译错误,需要定义静态函数对其进行赋值。

结论:

1. static const char * LLVM    这种定义方式在类体中声明后必须在类体外赋值,否则编译错误。
2.static const  int  w=5            这种定义方式可以直接在声明处赋值(基本类型都可以。eg:int 、long)。
3.静态成员变量在类体内声明后,必须在类体外定义,赋值与否无所谓。
4.父类的静态变量也是被继承过来的,并可以重新赋值。但是注意不能直接赋值,直接赋值的结果是编译错误,需要定义静态函数对其进行赋值。
5. 在类体中用static声明的成员变量和成员函数,在类体外定义时不可 以再写上static,否则编译出错!
6. 



static成员变量、const 成员变量、static const 成员变量
其实考虑的就是这三个概念,其实就是static成员变量和const成员变量 这两个概念。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值