由微软100题“求和不用for while”引出的static类成员的知识

转自:http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html

C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员!

      谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:

  

复制代码
 1 static.h文件
2 #include <iostream>
3 #include <string>
4 using namespace std;
5 class Person
6 {
7 private:
8 string name;
9 static int age;
10 public:
11 Person(const string&nm):name(nm)
12 {}
13 void Print()
14 {
15 cout<<name<<" is "<<age<<endl;
16 }
17 };
18 int Person::age=20;
19
20 static.cpp文件
21
22 #include "stdafx.h"
23 #include "static.h"
24 #include <iostream>
25 using namespace std;
26
27 int _tmain(int argc, _TCHAR* argv[])
28 {
29 Person person("tom");
30 person.Print();
31 cout<<endl;
32 return 0;
33 }
复制代码

Person类中定义了一个static数据成员age,注意在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!注意,static数据成员不是通过类构造函数进行初始化的!如上面的代码所示:在类外定义int Person::age=20;这里前面就不要再加static了。如果类中有多个static数据成员,static数据成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了,我们可以通过作用域操作符从类直接调用static数据成员,或者通过对象,引用,或指向该类类型对象的指针间接调用(这种情况下static数据成员必须是public的访问权限,如果定义在private访问权限下是不行的)。

     说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int型的,换成const string ,double都不行的。看下面这段代码:

复制代码
static.h头文件
#include
<iostream>
#include
<string>
using namespace std;
class Person
{
private:
string name;
static const int age=20;
static string address;
public:
Person(
const string&nm):name(nm)
{}
static string Address()
{
return address;
}
void Print()
{
cout
<<name<<" is "<<age ;
}
};
string Person::address="Beijing";

static.cpp文件

#include
"stdafx.h"
#include
"static.h"
#include
<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
Person person(
"tom");
person.Print();
cout
<<" and live in "<<person.Address();
cout
<<endl;
return 0;
}
复制代码

只有age才能在类定义体内进行初始化,address是不行的。这段代码不能在VC6.0上运行的,它不支持。在vs2008上可以运行。在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。上面的代码就没有这段代码实现,其实加上去也是可以的,没有关系。还有一点,static数据成员的类型可以使该成员所属的类类型,非static数据成员被限定为其自生类对象的指针或引用。例如:类定义位如下的情况:

复制代码
class Person
{
private:
string name;
static const int age=20;
static string address;
static Person person1;
Person
*person2;
Person person3;
public:
Person(
const string&nm):name(nm)
{}
static string Address()
{
return address;
}
void Print()
{
cout
<<name<<" is "<<age ;
}
};
复制代码

如果没有定义person3,则能够顺利通过编译,但是加上了person3就不能通过编译了

      说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!在上面的代码中static  string Address()函数中如果是return name或者是return age都不行! 好吧,就说这么些吧,如果哪里有不当之处,还请各位指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCN是啥?了解一下这5个互联网热词

骗子刷量&#xff0c;黑吃黑半斤八两前几天一件事火爆了互联网圈&#xff0c;一场搞笑的骗局&#xff0c;一场蜂群传媒导演的“僵尸舞台剧”&#xff1a;一条一夜爆红的视频 流量却为0&#xff01;。一个电商商家卖产品有投放需求&#xff0c;找到了微博上一家 MCN 机构的一个女…

Matlab出现On Startup: Error using eval undefined function 'workspacefunc' for input arguments of type

按照提示 Warning: MATLAB did not appear to successfully set the search path. To recover for this session of MATLAB, type "restoredefaultpath;matlabrc". To find out how to avoid this warning the next time you start MATLAB, type "docsearch pr…

为什么我不建议你去外包公司?

前言在我离开上家公司之前&#xff0c;我的直属领导找我聊了一番。除了问候我有没有找好下家之外&#xff0c;还千叮咛万嘱咐我千万不要去外包公司&#xff0c;否则会在简历上留下无法磨灭的污点。当时的我对于外包公司的了解并不深&#xff0c;只是道听途说外包公司很坑&#…

x 的平方根

题目描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根&#xff0c;其中 x 是非负整数。 由于返回类型是整数&#xff0c;结果只保留整数的部分&#xff0c;小数部分将被舍去。 示例 1: 输入: 4 输出: 2示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由…

Caffe编译代码的时候报各种未定义未声明

自己装的CUDNN是一个版本&#xff0c;而运行别人的code时可能人家对应CUDNN的另一个版本&#xff0c;此时需要修改关键字来兼容版本&#xff0c;参考 1. https://github.com/BVLC/caffe/issues/1792 https://github.com/BVLC/caffe/pull/1739 https://github.com/BVLC/ca…

友浩达优选上新,原生态农产品,买得安心,吃得放心

大闸蟹还在热卖&#xff0c;需要的同学可以访问 各位一直支持队长的朋友们友浩达优选上新了本着为大家推荐好东西的想法商城里上架的商品都是队长亲自挑选有质量保证的口碑好商品这次&#xff0c;来看看队长又给大家带了哪些好东西本次上新全是各地优选原生态农产品食品优质、安…

判别学习与生成学习的区别

参照http://blog.csdn.net/daijiguo/article/details/52218207 比如二类分类问题&#xff0c;不管是感知器算法还是逻辑斯蒂回归算法&#xff0c;都是在解空间中寻找一条直线从而把两种类别的样例分开&#xff0c;对于新的样例只要判断在直线的哪一侧即可&#xff1b;这种直接对…

树莓派4上跑 .NET Core 3.0,这次,真·64位!

导语前不久我写了一篇《Gentoo由于 Windows 10 IoT Core &#xff08;以及上面的UWP们&#xff09;暴尸荒野而苟且偷生使用 Linux 的我&#xff0c;已经彻底开荤了。最近我发现有个叫 Gentoo 的 Linux 系统&#xff0c;支持树莓派4的64位CPU。项目地址&#xff1a;https://gith…

微软100题第20题

http://blog.csdn.net/zwb8848happy/article/details/7340634 输入一个表示整数的字符串&#xff0c;把该字符串转换成整数并输出 //Analysis: //1. Whether it is a negative number //2. Whether there exist other characters that do not represent numbers //#includ…

asp.net core 使用 AccessControlHelper 控制访问权限

asp.net core 使用 AccessControlHelper 控制访问权限Intro由于项目需要&#xff0c;需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制&#xff0c;于是才有了这个权限控制组件&#xff0c;最初只是支持 netframework&#xff0c;后来 dotnetcore 2.0 发布了之后添加了对…

Caffe 增加自定义 Layer 及其 ProtoBuffer 参数

转载自&#xff1a;http://blog.csdn.net/kkk584520/article/details/52721838 http://blog.csdn.net/kkk584520 博客内容基于新书《深度学习&#xff1a;21 天实战 Caffe》&#xff0c;书中课后习题答案欢迎读者留言讨论。以下进入正文。 在使用 Caffe 过程中经常会有这样的…

.NET Core 3.0愈加成熟,微软将不再把.NET Framework API移植给它

目前 .NET Core 3.0 拥有的 API 总数约为 .NET Framework API 的 80%&#xff0c;剩下尚未从 .NET Framework 移植到 .NET Core 的 API&#xff0c;微软考虑以开源的形式发布。微软方面表示&#xff0c;通过 .NET Core 3.0&#xff0c;他们现在已具备轻松移植现代 workload 所需…

开发问题记录

1、MySQL死锁问题解决 Waiting for table metadata lock &#xff1a; Alter table qimao.qimao_content_distribute drop index idx_content_id,add UNIQUE ind直接执行 kill id&#xff0c;杀掉死锁进程即可 2、Mybatis 自动生成 使用MyBatis Generator自动生成实体、…

参加 JSConf China 2019 是怎样的体验?VS Code 和 TypeScript 都很火

JSConf China 2019 于 10 月 19-20 日于上海尚浦中心举行。很高兴作为讲师参加这次的 JSConf。Day 1在 Day 1 给大家聊了聊 The Beauty of TypeScript。简单总结下我讲的 TypeScript 的 session。千言万语&#xff0c;汇聚成下面两页的 PPT。TypeScript 的使用场景&#xff08;…

记一次应用配置的数据库连接被打满问题

线上应用&#xff0c;配置的数据库连接数为50&#xff0c;正常情况是已经够用了&#xff0c;但是有天发现50个连接全部被占满&#xff0c;并且长时间无法恢复&#xff0c;重启服务后会好一段时间。 1、问题现象 Druid获取MySQL数据库连接超时&#xff0c;超时时间设置的为60s…

Caffe阅读代码并修改

这个教程是最好理解的了 http://city.shaform.com/blog/2016/02/26/caffe.html 主要分成四個部份來講。首先是整個 Caffe 的大架構&#xff0c;以及一些重要的元件。 其次&#xff0c;我也研究了如何自己新增一個 layer。 接下來&#xff0c;再重新回到 Caffe 做更深入的解析…

ABP v1.0正式发布

经过长时间的开发终于发布了ABP v1.0&#xff01;感谢为该项目做出了贡献的你~https://github.com/abpframework/abp/releases

JVM解惑:消失的异常堆栈,log中打印异常堆栈为空

最近线上发现很多异常没有堆栈信息&#xff0c;只有一句描述&#xff0c;如下&#xff1a; java.lang.NullPointerException: null排查问题时受到了一些阻碍。然后发现无论是在本地环境还是测试环境&#xff0c;堆栈信息都可以正常打印&#xff0c;使用的是同一份日志配置文件…

Caffe自己修改训练方法

作者&#xff1a;Gein Chen链接&#xff1a;https://www.zhihu.com/question/27982282/answer/80242005&#xff11;&#xff0e;学习程序的第一步&#xff0c;先让程序跑起来&#xff0c;看看结果&#xff0c;这样就会有直观的感受。Caffe的官网上Caffe | Deep Learning Frame…