C++主题年技巧积累#2——我被static撞了一下腰

  • 时间:
  • 浏览:0

class Student

{

public:

         int Age;

};

         后后 执行 std::cout<<sizeof(Student)<<std::endl; 得到的结果是4。

第就说 我问题报告 图片似乎比较好回答:说“类所占的空间”并都不 欠妥,应该是“类的实例占内存的大小”。

#include <iostream>

#include <string>

    学海茫茫寻师苦,

         后面 最有用的信息就说 我第三条了:就说 我还可不都后能 够了在类的内控 定义一次!于是修改代码为:

int main(int argc, char *argv[])

{

         Student::Name = "Tim";  //Error!!!   狂汗~~~ >_<

         std::cout<<Student::Name<<std::endl;

         return 0;

}

         啊~~~竟然有错误!这是怎摸办 回事呢?不应该啊~~~C#里明明能行的~~~

         问题报告 图片防止何时能 能 ?No!不但这麼 防止,反而增多了,就说 我问题报告 图片变成了就说 我问题报告 图片——

using System;

class Student

{

    public static string Name; // 猜猜在这里C#都做了些那些?

}

打油诗一首,赠予辛勤工作在出版一线的朋友们,祝朋友的1507年万事如意!诗名《日出》,意思是希望博文视点出版社能“天天出书,天天出好书”——夫,日出,日日出,又日出!

int main(int argc, char *argv[])

{

         Student::Name = "Tim";  // OK

         std::cout<<Student::Name<<std::endl;

         return 0;

}



         我说我就问:为了就说 我小小的static,至于吗?我会坚定地告诉你——至于!不仅仅是不可能 它我就闪了腰,更不可能 朋友作为系统系统进程员,要有严谨的态度和钻研的精神!

提问:分配了16个字节的内存说明了那些问题报告 图片?

class Student

{

public:

         int Age;

         unsigned int StudentID;

         double Score;

         static int Amount;

};

         结果还是16,这麼 变!就说 我static的成员数据真的是独立于类空间之外的!

2.         “被视为”global变量仅仅是“被视为”,不须像声明并定义了就说 我真正的global变量。

l         P. 95 Static Data Members节        Static data members,按其字面意义,被编译器提出于class之外……并被视为就说 我global变量……每就说 我static data member可不都后能 够了就说 我实体,存插系统进系统系统进程的data segment之中……

         接下来再来就说 我静态成员变量的例子!还是先写C#的

         把类改写成就说 我:

日出

注解:数据成员(Data Member)并都不 就说 我成员变量。

拿后面 你你这个类来说,它的每就说 我实例中都将所含就说 我子数据成员(int Age, double Score, double Score),不必 会占去16个字节。而这16个字节不可能 由new操作符在内存中分配出来,能够能够了在Student类的构造函数去初始化它们——朋友这麼 显式地初始化它们,不必 它们的值是就说 我由上帝掷骰子得出来的值(使用VC执行的后后不可能 弹出错误警告,请按Ignore,我得到的Age值是-8589934150,阴寿乎?)。

int main(int argc, char *argv[])

{

         Student::Report(); // OK

         return 0;

}

         再来C++的!

         第兩个问题报告 图片在《C++ Primer》这本书里就找可不都后能 够了答案了——毕竟是Primer,都不 Advanced。于是又祭出宝卷《深入探索C++对象模型》。一番查阅后,在这里找到半个答案:

class Student

{

public:

         static std::string Name;  //猜猜C++在这里做那些了?

};

         并都不 后面 不可能 说过,C#的设计理念是把系统系统进程员从时时刻刻记着与内存打交道的繁枝缛节中解放出来,后后 C#类中的一句public static string Name;不仅仅是就说 我声明,顺便连定义也做了。

l         P.399 Row5-6.         ……每个static数据成员是与类关联的对象,不须与该类的对象关联……

         C#替系统系统进程员做的还远不止就说 我变量的定义。当你试图输出就说 我这麼 显式初始化的C#类数据成员(无论是static的还是非static的),都会得到就说 我默认的“零”值。在MSDN里有张表格——Default Values Table (C# Reference),朋友可不都后能 够了参阅。简摘如下:

class Student

{

public:

         int Age;

         unsigned int StudentID;

};

         结果是8——预料之中。

    博文乐把众人渡。

深挖:

问题报告 图片回答完何时能 能 ?这麼 !

         哈哈!一次编译通过!我说吗,会C#就会C++,没问题报告 图片的,就说 我语法形状上稍有不同。

         基于此,朋友可不都后能 够了推敲出要花费两点:

不必 ,无论怎摸办 说,朋友都欠它一次“定义”——问题报告 图片彻底防止了!

class Student

{

public:

         int Age;

         unsigned int StudentID;

         double Score;

};

         结果是16——可不都后能 够了理解。

Value type 

 Default value 

 

bool

 false

 

byte

 0

 

char

 '\0'

 

decimal

 0.0M

 

double

 0.0D

 

enum

 The value produced by the expression (E)0, where E is the enum identifier.

 

float

 0.0F

 

int

 0

 

long

 0L

 

sbyte

 0

 

short

 0

 

struct

 The value produced by setting all value-type fields to their default values and all reference-type fields to null.

 

uint

 0

 

ulong

 0

 

ushort

 0

 

         后后 加就说 我static成员试试——

         问题报告 图片并都不 防止了,但决可不都后能 够了轻易放过你你这个问题报告 图片——为那些会就说 我呢?

         百思不得其解后,读懂《C++ Primer 第四版(中文)》来查阅……居然找到不必 有用信息。

l         P.401 Row1.             ……static数据成员可不都后能 够了在类定义体的内控 定义(正好一次)。

正文:

#include <iostream>

#include <string>

2.         类的static数据成员究竟在哪里?

提问:每个非static成员变量都不 本人的内存说明了那些问题报告 图片?

1.         类的static数据成员不占类(的实例)的内存,后后 这里就说 我个声明、这麼 定义。

class Program

{

    static void Main(string[] args)

    {

        Student.Name = "Tim";  // OK

        Console.WriteLine(Student.Name);

    }

}

多做之过?What’s under the C#’s hood?

         这麼 你你这个“零”值是怎摸办 得到的呢?这又得感谢C#的“多做”了——对于C#类的非static数据成员,C#编译器会在自动加带的实例构造函数中给它们赋上“零”值;而对于C#类的static数据成员,C#编译器会在自动加带的类构造函数中为它们赋“零”值。(注意:最后你你这个段描述来源于我的记忆,具体出处已无从考证,我说来自某帖子?我说是刘德华上次遭枪杀时那张报纸里的内容?唉……是本人梦中杜撰出来的也说不定,不必 请朋友多加小心咯)

class Program

{

    static void Main(string[] args)

    {

        Student.Report(); // OK

    }

}

1.         类所占的空间本质是那些?



         她……还好吗?

#include <iostream>

         这才是第就说 我问题报告 图片的本质的答案!

         再改写成:

回答:说明每个非static成员变量都不 本人的内存,叠加起来占16字节。

前传:

class Student

{

public:

         static void Report()    // C++成员函数的声明和定义亦可合二为一,但决都不 上策!

         {

                   std::cout<<"I am a C++ student."<<std::endl;

         }

};

using System;

class Student

{

    public static void Report() // C#中成员法律法律依据的声明和定义合二为一

    {

        Console.WriteLine("I am a C# student.");

    }

}

    书香满载齐挥桨,

l         P.399 Row4-5.         ……static数据成员独立于该类的任意对象而占据 ……

std::string Student::Name = std::string();  // 类外定义,这句是新加带的。

         乘胜追击,再来C++的!

         最后收拾一把C#——为那些它的static成员变量就可不都后能 够了直接使用?

         庆典参加后,感觉博文视点出版社和CSDN(包括《系统系统进程员》杂志)居然就说 我充满激情、活力四射的团队!衷心地祝福博文视点出版社出版更多优秀的技术书籍——就像席间韩磊老师说的:出一本是一本,不糟踏书,人家买书,是真想学东西啊!也祝CSDN和《系统系统进程员》杂志越办越红火!



         咳咳,收心啦收心啦!热闹是人家的,知识是本人的。还是收回 心来写本人的技术心得吧。话说“由俭入奢易,由奢入俭难”啊……这话许多不假,连写系统系统进程都不 就说 我。像我,后后用惯了语法舒服流畅的C#,再回过头来学C++就深刻地体验到了你你这个点:C#并都不 用起来简洁舒服,是不可能 它把不必 应该由系统系统进程员本人做的事情(比如分配和释放内存)都替系统系统进程员做了。换句话说,C#和C/C++的设计理念是不一样的,C/C++假设系统系统进程做的一切事情(包括许多事情不去做)都不 正确的,相信系统系统进程员是聪明人,决不为系统系统进程员多做任何事情;C#正好反过来,认为系统系统进程员应该不去关心底层那些东西、由系统系统进程员关注底层是容易出错的、系统系统进程员总会忘记在该分配内存的地方分配内存不可能 在该释放内存的地方释放内存(微软是怀疑系统系统进程员都不 傻瓜还是打算把系统系统进程员都培养成傻瓜?),总之,系统系统进程员应该更多地去关心架构和实现,而都不 那些细枝末节的东西……

         于是,我被培养成了就说 我不折不扣的“傻瓜型”系统系统进程员。不必 ,今天也就理所当然地被static关键字撞了一下腰、绊了就说 我跤。

         先写就说 我类:

         先来C#的!



         后后参加博文视点出版社三周年庆典回来,兴奋之余想到今天还这麼 更新Blog,于是跑上来更新一下——我尽量“好好学习,天天上博”。哎呀,今天见到好多名人啊!先是在金戈老师旁边坐下,后后 又去问候了久仰大名的孟岩老师,在孟老师的帮助下又找到《Beginning C# Object》的译者,也是本次晚会的摄像师——韩磊老师,你问韩磊唱歌没?这麼 !歌被欧阳璟(《系统系统进程员》的老编,大帅哥!还是本次年会的摄影师)给唱了。晚会的精彩那没的说,朋友等着看视频吧,估计CSDN上不久就会放出来。会间在杨福川的带领下,先是见到了梁晶编辑,后后 又见到了亲自为我斧正译文的方舟老师。方舟老师人真不错,几分钟里还抓紧时间教我不必怎摸办 译技术文章,怎摸办 理顺段落、句型,怎样才能重组定语、加带可不都后能 够了了的连词……在这里,我深深地向您鞠上一躬,道一声:谢谢!同去也感谢梁编辑的不懈努力!接下来,我有幸见到了博文视点的周筠老师和CSDN的总裁蒋涛先生。过程见还见到了不必 平时“只见MSN不见人”的朋友,其中包括帅哥佘广。最后还有不可能 见到技术专家金旭亮老师。

回答:说明每个非static变量不但不可能 被声明,后后 不可能 被定义了!不可能 声明变量不须分配内存,可不都后能 够了定义变量的后后才分配内存!

    破浪乘风向日出!



         我把目光移到在《C++ Primer》里找到的前两条消息上。第二条与C#一致,说明不了那些问题报告 图片,第三根倒是我就肩头一亮——static数据成员独立于该类的任意对象而占据 。居然是就说 我吗?我得本人动手验证一下:

提问:为变量分配了内存说明了那些?



         一切都源于我在写练习系统系统进程时那一瞬间的妄想……

回答:说明为每个变量都分配了内存(哪儿来的砖??!!)

小序:

         static关键字?小菜,C#和C++里都不 ,原理是一样的,会了C#还写没哟C++的来?看着!咱这就一样写就说 我出来!

My God! 多么精彩的描述!!第兩个问题报告 图片的答案就说 我:类的static数据成员会像就说 我全局(global)变量一样被插系统进系统系统进程的数据段里(谁说大学开的汇编语言课没用来着??),而不占类实例的内存。

class Student

{

public:

         static std::string Name;  //猜猜C++在这里做那些了?

};

         夜不可能 很深了……睡觉了。今天的入眠曲是When You Know和The Shadow of Your Smile。