统计概念包括哪些派生概念

SPSS(17)
SPSS——基本的统计概念
总体和样本
总体和个体
研究对象的全体成为总体,一般地把我们关心的随机变量X成为总体。组成总体的每个单元称为个体。个体也可理解为总体X的取值
简单随机抽样
为了使抽样具有充分的代表性,要求
每个个体被抽到的机会均等
每次抽取都是独立的(共抽取n次)
通常的抽样都是无放回的,当总体很大的时,可以满足独立性
总体是指考察的对象的全体, 个体是总体中的每一个考察的对象, 样本是总体中所抽取的一部分个体, 而样本容量则是指样本中个体的数目。
在总体中抽取n个个体,成为总体上的一个样本,记为(X1, X2, …, Xn),其中每次抽样Xi(i=1,2,3..,n)也都是随机变量,共n个随机变量,加上括号,表示样本是一个整体
独立同分布
在概率统计理论中,如果变量序列或者其他随机变量有相同的概率分布,并且互相独立,那么这些随机变量是独立同分布。
随机变量X1和X2独立,是指X1的取值不影响X2的取值,X2的取值也不影响X1的取值.随机变量X1和X2同分布,意味着X1和X2具有相同的分布形状和相同的分布参数,对离散随机变量具有相同的分布律,对连续随机变量具有相同的概率密度函数,有着相同的分布函数,相同的期望、方差。反之,若随机变量X1和X2是同类型分布,且分布参数完全相同,则X1和X2完全一定同分布!
如实验条件保持不变,一系列的抛硬币的正反面结果是独立同分布。
随机变量(random variable)表示随机试验各种结果的实值单值函数。
一个随机试验可能结果(称为基本事件)的全体组成一个基本空间Ω。随机变量X是定义在基本空间Ω上的取值为实数的函数,即基本空间Ω中每一个点,也就是每个基本事件都有实轴上的点与之对应。例如,随机投掷一枚硬币,可能的结果有正面朝上 ,反面朝上两种 ,若定义X为投掷一枚硬币时朝上的面 , 则X为一随机变量,当正面朝上时,X取值1;当反面朝上时,X取值0。又如,掷一颗骰子,它的所有可能结果是出现1点、2点、3点、4点、5点和6点 ,若定义X为掷一颗骰子时出现的点数,则X为一随机变量,出现1,2,3,4,5,6点时X分别取值1,2,3,4,5,6。
统计量是含有样本X1, X2, …, Xn的一个数学表达式,并且表达式中不包含未知参数,因此可以在得到样本后计算出它的数值。
在抽样之前,统计量的值无法确定,抽样测试后,可以观察到它的取值,因此统计量是随机变量,是由样本派生出来的随机变量。
均值描述的是样本集合的中间点,它告诉我们的信息是很有限的
样本标准差
标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计
我们知道,样本量越大越能反映真实的情况,而算数均值却完全忽略了这个问题,对此统计学上早有考虑,在统计学中样本的均差多是除以自由度(n-1),它是意思是样本能自由选择的程度。当选到只剩一个时,它不可能再有自由了,所以自由度是n-1。
n-1中的-1就是为了在考虑样本标准差自由度上做的一个调配系数,既定为1,,假设计算的标准差所对应的数据列只有1个数据,则1-1=0,不存在标准差,,以此证明-1为调配系数,,所及请记住一般算标准差是,,都是算样本数据的标准差,即:(n-1分之 各个数据与平均数差值的平方和)的2次方根。
方差则仅仅是标准差的平方。
即样本方差计算公式里分母为n-1的目的是为了让方差的估计是无偏的。无偏的估计(unbiased estimator)比有偏估计(biased estimator)更好是符合直觉的
协方差矩阵
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:306344次
积分:4165
积分:4165
排名:第5181名
原创:92篇
转载:48篇
译文:10篇
评论:71条
(2)(4)(10)(4)(2)(1)(7)(2)(9)(8)(1)(21)(15)(2)(1)(1)(3)(7)(4)(2)(2)(5)(3)(5)(25)(4)数学统计学及其基本概念_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
数学统计学及其基本概念
上传于||暂无简介
大小:2.07MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢派生类_百度百科
利用继承机制,新的类可以从已有的类中派生。那些用于派生的类称为这些特别派生出的类的“”。
派生类语法说明
说明:在C++中要定义的新的不仅拥有新定义的成员,而且还同时拥有旧的成员,我们称已存在的用来派生新类的类为C++基类,又称为父类。
表:基类表中存放各个基类名称
基类说明符:基类类体中类成员的访问说明符
派生类单一继承
在“单一继承”这种最普通的形式中,派生类仅有一个基类。
在类的层次设计中,可以发现一些普遍的特性,即派生类总是同基类有“kind of”关系。
另一个值得注意点是Book既是派生类(从PrintedDocument中派生),也是基类(PaperbackBook是从Book派生的)。下面的例子是这种类层次的一个轮廓性的说明。
class PrintedDocument
//Book是从PrintedDocument中派生的
class Book:public PrintedDocument
//PaperbackBook是从Book中派生
class PaperbackBook: public Book
PrintedDocument作为Book的直接基类,它同时也是PaperbackBook的非直接。直接基类和非直接基类的区别在于直接基类出现在类说明的基类表中,而非直接基类不出现在基类表中。
每个派生类的说明是在基类的说明之后说明的,因此对于基类仅只给出一个前向引用的说明是不够的,必须是完全的说明。
一个类可以作为很多特别类的基类。
在继承中,派生类含有基类的成员加上任何你新增的成员。结果派生类可以引用基类的成员(除非这些成员在派生类中重定义了)。当在派生类中重定义直接基类或间接基类的成员时,可以使用范围分辨符(::)引用这些成员。考虑下面的代码:
class Document
char * N//文档名称
void PrintNameOf(); //打印名称
//实现类Document的PrintNameOf函数
void Document::PrintNameOf()
cout && Name &&
class Book:public Document
Book(char *name,long pagecount);
long PageC
//class Book
Book::Book (char *name,long pagecount)
Name=new char [strlen(name)+1];
strcpy (Name,name);
PageCount=
注意,Book的(Book::Book)具有对数据成员Name的访问权。在程序中可以按如下方式创建Book类对象并使用之。
//创建一个Book类的新对象,这将激活构造函数Book:BookBook
Book LibraryBook (&Programming Windows,2nd Ed&,994);
//使用从Document中继承的函数PrintNameOf.
LibraryBook.PrintNameOf();如前面例子所示,类成员和继承的数据与函数以一致的方式引用。如果类Book所调用的PrintNameOf是由类Book重新定义实现的,则原来属于类Document的PrintNameOf函数只能用范围分辨符(::)才能使用:
class Book:public Document
Book(char *name,long pagecount);
void PrintNameOf();
long PageC
void Book::PrintNameOf()
cout&&&Name of Book:&;
Document::PrintNameOf();
只要有一个可访问的、无二义性的基类,派生类的指针和引用可以隐含地转换为它们基类的指针和引用。下面的例子证实了这种使用指针的概念(同样也适用于引用):
#include &&
void main()
Document * DocLib[10]; //10个文档的库
for (int i=0; i&10; ++i)
cout&&&Type of document:&
&&&P)aperback,M)agazine,H)elp File,C)BT&
char CDocT
cin &&CDocT
(tolower(CDocType))
case 'p':
DocLib=new PaperbackB
case 'm':
DocLib=new M
case 'h':
DocLib=new HelpF
case 'c':
DocLib=new ComputerBasedT
for (i=0; i&10; ++i)
DocLib-&PrintNameOf();
在前面例子的语句中,创建了不同类型的对象。这一点依赖于用户对CDocType对象所作出的说明。然而这些类型都是从类Document中派生出来的,故可以隐含地转换为Document*。结果是DocLib成为一个“相似链表”(heterogeneous list)。此链表所包含的是不同种类的对象,其中的所有对象并不是有相同的类型。
因为Document类有一个PrintNameOf函数。因此它能够打印图书馆中每本书的名称,但对于Document类型来说有一些信息会省略掉了(如:Book的总页数,HelpFile的字节数等)。
注意:强制基类去实现一个如PrintNameOf的函数,通常不是一个很好的设计,本章后面的“”中提供了一个可替换的设计方法。
派生类多重继承
C++的后期的一些版本为继承引入了“多重继承”模式。在一个多重继承的图中,派生类可以有多个直接基类。
对于一个特定的程序如果每个类的属性并不是全部要求使用,则每个类可以单独使用或者同别的类联合在一起使用。
层次 有一些类层次很庞大,但有很多东西很普遍。这些普遍的代码在基类中实现了,然而在派生类中又实现了特殊的代码。
对于基类来说重要的是建立一种机制,通过这种机制派生类能够完成大量的函数机能。
这种机制通常是用来实现的。有时,基类为这些函数提供了一个缺省的实现。
了解到所有的Identify和WhereIs的函数实现返回的是同种类型的信息,这一点很重要。在这个例子中,恰好是一种描述性字符串。
这些函数可以作为来实现,然后用指向基类的指针来调用,对于实际代码的联结将在运行时决定,以选择正确的Identify和WhereIs函数。
类协议的实现
类可以实现为要强制使用某些协议。这些类称为“”,因为不能为这种类类型创建对象。它们仅仅是为了派生别的类而存在。
当一个类中含有纯或当他们继承了某些纯却又没有为它们提供一个实现时,该类称为。纯是用纯说明符定义的虚拟函数。如下:
virtual char *Identify()=0;
基类Document把如下一些协议强加给派生类。
* 为Identify函数提供一个合适的实现
* 为WhereIs函数提供一个合适的实现
在设计Document类时,通过说明这种协议,类设计者可以确保如不提供Identify和WhereIs函数则不能实现非。因而Document类含有如下说明:
class Document
//对派生类的要求,它们必须实现下面这些函数
virtual char *Identify()=0;
virtual char *WhereIs()=0;
派生类基类
如前面讨论的,继承过程创建的新的派生类是由基类的成员加上由派生类新加的成员组成。在多重继承中,可以构造层次图,其中同一基类可以是多个派生类的一部分。图9.4显示了这种图。
如同多重继承中所描述的,一个类可以从多个基类中派生出来。在派生类由多个基类派生出来的多重继承模式中,基类是用基类表语法成份来说明的。
class CollectionOfBook:public Book,public Collection
基类的说明顺序一般没有重要的意义,除非在某些情况下要调用构造函数和析构函数的时候。在这些情况下,基类的说明顺序会对下面所列的有影响。
由引起的初始化发生的顺序。如果你的代码依赖于CollectionOfBook的Book部分要在Collection部分之前初始化,则此说明顺序将很重要。初始化是按基类表中的说明顺序进行初始化的。
激活以作清除工作的顺序。同样,当类的其它部分正在被清除时,如果某些特别部分要保留,则该顺序也很重要。的调用是按表说明顺序的反向进行调用的。
注意:基类的说明顺序会影响类的存储器分布。不要对基类成员在中的顺序作出任何编程的决定。
在你说明基类表时,不能把同一类名称说明多次。但是对于一个派生类而言,其非直接基类可以有多个相同的。
因为一个类可以多次作为一个派生类的非直接基类。C++提供了一个办法去优化这种的工作。
注意,在LunchCashierQueue对象中,有两个Queue子对象。下面的代码说明Queue为虚拟基类:
class Queue
class CashierQueue:virtual public Queue
class LunchQueue: virtual public Queue
class LunchCashierQueue:public LunchQueue,public CashierQueue
一个类对于给定的类型既可以有虚拟的组成部分,也可以有非虚拟的组成部分。
如果一个派生类重载了一个从虚拟基类中继承的,而且该派生类以指向虚拟基类的指针调用这些构造函数和析构函数时,编译器会引入一个附加的隐含的“vtordisp”域到带有虚拟基类的类中。/vd0选项禁止了这个增加的隐含vtordisp构造/析构位置成员。/vd1选项(缺省),使得在需要时可以解除禁止。只有在你确信所有类的构造函数或析构函数都虚拟地调用了,vtordisp才可以关掉。
/vd选项会影响全局编译模式。使用vtordisp编译指示可以在基于类方式上打开或禁止vtordisp域:
#pragma vtordisp(off)
class GetReal:virtual public{...};
#pragma vtordisp(on)
派生类二义性
使得从不同的路径继承成员名称成为可能。沿着这些路径的成员名称并不必然是唯一的。这些名称的冲突称为“二义性”。
任何引用类成员的必须使用一个无二义性的引用。下面的例子显示了二义性是如何发生的。//说明两个A和B
unsigned b();
unsigned a(); //注意类A也有一个成员&a&和一个成员&b&
//定义从类A和类B中派生出的类C
class C : public A,public B
按上面所给出的类说明,如下的代码就会引出二义性,因为不清楚是引用类A的b呢,还是引用类B的b:
C *pc=new C;
考虑一下上面的代码,因为名称a既是类A又是类B的成员,因而编译器并不能区分到底调用哪一个a所指明的函数。访问一个成员,如果它能代表多个函数、对象、类型或枚举则会引起二义性。
编译器通过下面的顺序执行以检测出二义性:
⒈ 如果访问的名称是有二义性的(如前述),则产生一条错误信息。
⒉ 如果重载函数是无二义性的,它们就没有什么问题了
⒊ 如果访问的名称破坏了成员访问许可,则产生一条错误信息
在一个表达式产生了一个通过继承产生的二义性时,通过用类名称限制发生问题的名称即可人工解决二义性,要使前面的代码以无二义性地正确编译,要按如下使用代码:
C *pc = new C;
pc-&B::a();
注意:在类C说明之后,在C的范围中引用B就会潜在地引起错误。但是,直到在C的范围中实际使用了一个对B的无限定性的引用,才会产生错误。
二义性和虚拟基类
如果使用了虚拟基类、函数、对象、类型以及枚举可以通过多重继承的路径到达,但因为只有一个虚拟基类的实例,因而访问这些名称时,不会引起二义性。
访问任何类A的成员,通过非虚拟基类访问则会引起二义性;因为编译器没有任何信息以解释是使用同类B联系在一起的子对象,还是使用同类C联系在一起的子对象,然而当A说明为虚拟基类时,则对于访问哪一个子对象不存在问题了。
通过继承图可能有多个名称(函数的、对象的、枚举的)可以达到。这种情况视为非虚拟基类引起的二义性。但虚拟基类也可以引起二义性,除非一个名称“支配”(dominate)了其它的名称。一个名称支配其它的名称发生在该名称定义在两个类中,其中一个是由另一个派生的,占支配地位的名称是派生类中的名称,在此名称被使用的时候,相反不会产生二义性,如下面的代码所示:
class B: public virtual A
class C: public virtual A
class D: public B,public C
D() {a();} //不会产生二义性,B::a()支配了A::a
转换的二义性
显式地或隐含地对指向类类型的或引用的转换也可引起二义性。
虚拟函数可以确保在一个对象中调用正确的函数,而不管用于调用函数的表达式。
假设一个含有一个说明为同时一个派生类定义了同名的函数。派生类中的函数是由派生类中的对象调用的,甚至它可以用指向基类的指针和引用来调用。下面的例子显示了一个提供了一个PrintBalance函数的实现:
class Account
Account(double d); //构造函数
virtual double GetBalance(); //获得平衡
virtual void PrintBalance(); //缺省实现
//Account的实现
double Account::Account(double d)
_balance=d;
//Account的GetBalance的实现
double Account::GetBalance()
//PrintBalance的缺省实现
void Account::PrintBalance()
cerr&&&Error.Balance not available for base type&.
两个派生类CheckingAccount和SavingsAccount按如下方式创建:
class CheckingAccount:public Account
public:void
PrintBalance();
//CheckingAccount的PrintBalance的实0现
void CheckingAccount::PrintBalance()
cout&&&Checking account balance:&
&& GetBalance();
class SavingsAccount:public Account
void PrintBalance();
//SavingsAccount中的PrintBalance的实
现void SavingsAccout::PrintBalance()
cout&&&Savings account balance:&
&& GetBalance();
函数PrintBalance在派生类中是虚拟的,因为在基类Account中它是说明为虚拟的,要调用如PrintBalance的,可以使用如下的代码:
//创建类型CheckingAccount和SavingsAccount的对象
SavingsAccount *pSavings=new SavingsAccount(1000.00);
//用指向Account的调用PrintBalance
Account *pAccount=pC
pAccount-&PrintBalance();
//使用指向Account的调用PrintBalance
pAccount=pS
pAccount-&PrintBalance();
在前面的代码中,除了pAccount所指的对象不同,调用PrintBalance的代码是相同的。
因为PrintBalance是虚拟的,将会调用为每个对象所定义的函数版本,在派生类CheckingAccount和SavingsAccount中的函数“覆盖”了基类中的同名函数。如果一个类的说明中没有提供一个对PrintBalance的覆盖的实现,则将采用基类Account中的缺省实现。
派生类中的函数重载基类中的,仅在它们的类型完全相同时才如此。派生类中的函数不能仅在返回值上同基类中的不同;参量表也必须不同。当指针或引用调用函数时,要遵循如下规则:
* 对虚拟函数调用的解释取决于调用它们的对象所基于的类型。
* 对非虚函数调用的解释取决于调用它们的或引用的类型。
下面例子显示了在使用指针调用虚拟或非时它们的行为:#include
//说明一个基类
class Base
virtual void NameOf(); //
void InvokingClass(); //非
//两个函数的实现
void Base::NameOf()
cout&&&Base::NameOf\n&;
void Base::InvokingClass()
cout&&&Invoked by Base\n&;
//说明一个派生类
class Derived:public Base
void NameOf(); //
void InvokingClass(); //非
//两个函数的实现
void Derived::NameOf()
cout&&&Derived::NameOf\n&;
void Derived::InvokingClass()
cout&&&Invoked by Derived\n&;
void main()
//说明一个Derived类型的对象
Derived aD
//说明两个指针,一个是Derived*型的,另一个是Base*型的,并用 //aDerived初始化它们。
Derived *pDerived=&aD
Base *pBase =&aD
//调用这个函数
pBase-&NameOf(); //调用
pBase-&InvokingClass();//调用非
pDerived-&NameOf();//调用
pDerived-&InvokingClass(); //调用非
该程序的输出是:
Derived::NameOf
Invoked by Base
Derived::NameOf
Invoked by Derived
注意,不管调用NameOf函数的指针是通过指向基类的指针还是指向派生类的指针,它调用的函数是派生类的。因为NameOf是,而且pBase和pDerived指向的对象都是派生类的,故而调用函数是派生类的。
因为只能为类类型的对象所调用,所以你不能把一个全局的或静态函数说明为虚拟的。
在派生类中说明一个重载函数时可以用virtual关键字,但是这并不是必须的,因为重载一个,此函数就必然是虚拟函数。
基类中的必须有定义,除非它们被说明为纯的。
虚拟函数调用机制可以用范围分辨符(::)明确地限定函数名称的方法来加以限制。考虑前面的代码,用下面的代码调用基类的PrintBalance。
pChecking-&Account::PrintBalance(); //明确限定
Account *pAccount=pC //调用Account::PrintBalance
pAccount-&Account::PrintBalance();//明确限定
上面例子中的两个对PrintBalance的调用都限制了的调用机制。
派生类抽象类
就像一个一段意义上的说明,通过它可以派生出特有的类。你不能为创建一个对象,但你可以用抽象类的指针或引用。
至少含有一个纯的类就是。从中派生出的类必须为纯提供实现,否则它们也是抽象类。
把一个说明为纯的,只要通过纯说明符语法,考虑一下本章早些时候在“虚拟函数”中提供的例子。类Account的意图是提供一个通常意义的函数功能,Account类型的对象太简单而没有太多用处。因此Account是作为的一个很好的候选:
派生类实例1
class Account
Account(double d); //构造函数
virtual double GetBalance();//获得平衡
virtual void PrintBalance()=0; //纯
派生类分析1
这里的说明同前一次的说明的唯一不同是PrintBalance是用纯说明符说明的。
使用的限制
不能用于如下用途:
*或成员数据
* 参量类型
* 函数的返回类型
* 明确的转换类型
另外一个限制是如果一个的调用了一个纯,无论是直接还是间接的,结果都是不确定的。但的构造函数的可以调用其它成员函数。
的纯可以有定义,但它们不能用下面语法直接调用:
名称::函数名称()
派生类实例2
在设计基类中含有纯虚拟析构函数的类层次时,这一点很有用。因为在销毁一个对象的过程中通常都要调用基类的析构函数,考虑下面的例子:#include
//说明一个带有纯虚拟的
class base
base() { }
virtual ~base()=0;
//提供一个的定义
base::~base()
class derived:public base
public: derived(){ };
~derived() { };
void main()
derived *pDerived=
派生类分析2
当一个由pDerived所指的对象销毁的时候,会调用类derived的析构函数,进而调用基类base中的析构函数。纯的空的实现保证了该函数至少存在着一些操作。注意:在前面例子中,纯base::~base是在derived::~derived中隐含调用的。当然明确地用全限定成员函数名称去调用纯是可能的。
-------------------------------------------------------------------------------
派生类继承方式
public基类的public和protected的成员被派生类继承后,保持原来的状态private基类的public和protected的成员被派生类继承后,变成派生类的private成员protected基类的public和protected的成员被派生类继承后,变成派生类的protected成员
注:无论何种继承方式,基类的private成员都不能被派生类访问。从上面的表中可以看出,声明为public的方法和属性可以被随意访问;声明为protected的方法和属性只能被类本身和其子类访问;而声明为private的方法和属性只能被当前类的对象访问。[1]
1. 友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。
2. 虚函数在重新定义时参数的个数和类型必须和基类中的虚函数完全匹配,这一点和函数重载完全不同。
3. #include &文件名&和#include &文件名&
文件包含的两种格式中,第一种格式用来包含那些由系统提供的并放在指定子目录中的头文件;而第二种格式用来包含那些由用户自己定义的放在当前目录或其他目录下的头文件或其它源文件。
4. 数组也可以作为函数的实参和形参,若数组元素作为函数的实参,则其用法与变量相同。当数组名作为函数的实参和形参时,传递的是数组的地址。当进行按值传递的时候,所进行的值传送是单向的,即只能从实参传向形参,而不能从形参传回实参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。而当用数组名作为函数参数进行传递时,由于实际上实参和形参为同一数组,因此当形参数组发生变化时,实参数组也随之发生变化。[1]
注:实参数组与形参数组类型应一致,如不一致,结果将出错;形参数组也可以不指定大小,在定义数组时数组名后面跟一个空的方括号,为了在被调用函数中处理数组元素的需要,可以另设一个参数,传递数组元素的个数。如:int sum(int array[],int n);
5. 重载、覆盖和隐藏的区别?
函数的重载是指C++允许多个同名的函数存在,但同名的各个函数的形参必须有区别:形参的个数不同,或者形参的个数相同,但参数类型有所不同。
覆盖(Override)是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体 (花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。[1]
下面我们从成员函数的角度来讲述重载和覆盖的区别。
成员函数被重载的特征有:1) 相同的范围(在同一个类中);2) 函数名字相同;3) 参数不同;4) virtual关键字可有可无。
覆盖的特征有:1) 不同的范围(分别位于派生类与基类);2) 函数名字相同;3) 参数相同;4) 基类函数必须有virtual关键字。
派生类概念描述
这一节补充一些有关类的新的概念:
* 全局名称
* 名称和限定名
* 函数的参量名称
* 构造函数初始化器
派生类二义性
名称的使用在其范围中必须是无二义性的(直到名称的重载点)。如果这个名称表示了一个函数,那么这个函数必须是关于参量的个数和类型是无二义性的。如果名称存在着二义性,则要运用成员访问规则。
派生类全局名称
一个对象、函数或枚举的名称如果在任何函数、类之外引入或前缀有全局单目范围操作符(::),并同时没有同任何下述的双目操作符连用。
* 范围分辨符(::)
* 对象和引用的成员选择符(.)
* 指针的成员选择符(-&)
派生类名称及限定名
同双目的范围分辨符(::)一起使用的名称叫“限定名”。在双目范围分辨符之后说明的名称必须是在该说明符左边所说明的类的成员或其的成员。
在成员选择符(.或-&;)后说明的名称必须是在该说明符左边所说明的类类型对象的成员或其基类的成员。在成员选择符的右边所说明的名称可以是任何类类型对象,只要该说明符的左边是一个类类型对象,而且该对象的类定义了一个重载的成员选择符(-&;),它把指针所指的对象变为特殊的类类型。
编译器按下面的顺序搜索一个名称,发现以后便停止:
⒈ 如果名称是在函数中使用,则在当前块范围中搜索,否则在全局范围中搜 索。
⒉ 向外到每一个封闭块范围中搜索,包括最外面函数范围(这将包括函数的参量)。
⒊ 如果名称在一个成员函数中使用,则在该类的范围中搜索该名称。
⒋ 在该类的基类中搜索该名称。
⒌ 在外围嵌套类范围(如果有)或其基类中搜索,这一搜索一直到最外层包裹的类的范围搜索之后。
⒍ 在全局范围中搜索。
然而你可以按如下方式改变搜索顺序:
⒎ 如果名称的前面有::,则强制搜索在全局范围之中。
⒏ 如果名称的前面有class、struct和union关键字,将强制编译器仅搜索 class,struct或union名称。
⒐ 在范围分辨符的左边的名称,只能是class,struct和union的名称。如果在一个静态成员函数中引用了一个非静态的成员名,将会产生一条错误消息。同样地,任何引用包围类中的非静态组员会产生一条错误消息,因为被包围的类没有包围类的this指针。
派生类函数参量名称
函数的参量名称在函数的定义中视为在函数的最外层块的范围中。因此,它们是局部名称并且在函数结束之后,范围就消失了。
函数的参量名称是在函数说明(原型)的局部范围中,并且在说明结束以后的范围中消失。
缺省的参量名称是在参量(它们是缺省的)范围中,如前面两段描述的,然而它们不能访问和非静态类成员。缺省参量值的确定是在函数调用的时候,但它们的给定是在函数说明的原始范围中。因此成员函数的缺省参量总是在类范围中的。
.技术论坛[引用日期]
中国电子学会(Chinese Instit...
提供资源类型:内容
企业信用信息

我要回帖

更多关于 统计学概念 的文章

 

随机推荐