马尔代夫电源转换器岛上有没有充电转换器啊,插头多

C++&类中特殊的成员变量(常变量、引用、静态)的初始化方法
类成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。常见的成员变量的类型包括:
d.静态常量(整型)
e.静态常量(非整型)
常量和引用,必须通过参数列表进行初始化。
&&&&静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。
参考下面的代码以及其中注释:
class BClass
&BClass() : i(1), ci(2), ri(i){} //
对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//普通成员变量也可以放在函数体里,但是本质其实已不是初始化,而是一种普通的运算操作--&赋值运算,效率也低
i;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 普通成员变量
&const int
&&&&&&&&&&&&&&&&&&&&&&&&&&
// 常量成员变量
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 引用成员变量
&static int
&&&&&&&&&&&&&&&&&&&&&&&&&
// 静态成员变量
&//static int si2 =
100;&&&&&&&&&&&&&&&&
只有静态常量成员变量,才可以这样初始化&static
&&&&&&&&&&&&&&&&&&
// 静态常量成员变量
&static const int csi2 =
100;&&&&&&&&&&&
// 静态常量成员变量的初始化(Integral
&static const double
&&&&&&&&&&&&&&&
// 静态常量成员变量(non-Integral type)
&//static const double csd2 =
99.9;&&&&&
只有静态常量整型数据成员才可以在类中初始化};
//注意下面三行:不能再带有staticint BClass::si
= 0; // 静态成员变量的初始化(Integral type)
const int BClass::csi = 1; // 静态常量成员变量的初始化(Integral type)
const double BClass::csd = 99.9; // 静态常量成员变量的初始化(non-Integral
// 在初始化(1)中的csi2时,根据著名大师Stanley B.Lippman的说法下面这行是必须的。
// 但在VC2003中如果有下面一行将会产生错误,而在VC2005中,下面这行则可有可无,这个和编译器有关。
const int BClass::csi2;
int main()
&静态成员属于类作用域,但不属于类对象,和普通的static变量一样,程序一运行就分配内存并初始化,生命周期和程序一致。
所以,在类的构造函数里初始化static变量显然是不合理的。
静态成员其实和全局变量地位是一样的,只不过编译器把它的使用限制在类作用域内(不是类对象,它不属于类对象成员),要在类的定义外(不是类作用域外)初始化。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 4964568
博文数量: 724
博客积分: 2150
博客等级: 上尉
技术积分: 12530
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
c++中静态成员变量要在类外部再定义,否则产生link2001错误.
class testClass
& static int m_i;
// 类外部定义,若不写会产生
// error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@testClass@@2HA)
int testClass::m_i;
int main(int argc, char* argv[])
& printf("%d\n",testClass::m_i);
& printf("\n");
& return 0;
为什么要在类的外部进行定义的原因:
1. 在类中,只是声明了静态变量,并没有定义。
2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。
& &注意:如果在类里面这么写 那么是既声明了变量,也定义了变量,两者合在一起了。
3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。
& &类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。
4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?
& &静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。
& &因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。
& &这会产生两种可能的情况:
& & & A. 重复定义;
& & & B. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。
& & & & &很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。
& & & & &当然这样做,还是有可能产生线程安全的问题,但不管怎么说对象是创建好了,而这种线程安全问题,可以在编程中予以解决。
对于class的static data member,其实只是声明了一个scope(还记得class::static_data_member中的::么?),
既然是声明而已,所以还需要一个定义,
之所以需要在类的外面,因为本质来说它和global和static变量没什么区别,都是在数据段的,只是scope不一样,属于class而已。
这里反映出了C/C++里面一些稍微偏底层的复杂的细微的概念,比如scope,storage,life time。
::是指scope,是在class里面声明的,
static指storage,是和global一样,在外面定义的。
阅读(4631) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。14193人阅读
1、为什么静态成员不能在类内初始化?
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。
// 类内声明
int A::count = 0 ; // 类外初始化,不必再加static关键字
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
《c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法。 但为什么static const int就可以在类里面初始化呢?
想起C中一个函数里定义一个static变量是为了保证只初始化一次。 那么,是否可以这样理解: static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。 static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。
2、什么东西能在类内初始化
能在类中初始化的成员只有一种,那就是静态常量成员。
static int count = 0; // 静态成员不能在类内初始化
这样也不行
const int count = 0; // 常量成员也不能在类内初始化
但是这样可以
static const int count = 0; // 静态整型常量成员可以在类内初始化,但是 static const float count就不行了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2247748次
积分:17119
积分:17119
排名:第470名
原创:85篇
转载:112篇
张宴技术blog: http://zyan.cc/tech/ 云风博客:/
(1)(1)(6)(3)(1)(32)(28)(26)(16)(64)(11)(13)(1)类的非静态成员变量可以在定义的时候初始化吗?_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:280,624贴子:
类的非静态成员变量可以在定义的时候初始化吗?收藏
一般来说是不行的,但是写程序的时候发现可以,这是为何?
神牛摄影器材--为专业摄影者打造,你值得拥有!
成员的构造函数当然会被调用了。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 插头转换器 的文章

 

随机推荐