this指针 静态成员 友元

来源:互联网 发布:淘宝店免费货源怎么找 编辑:程序博客网 时间:2024/05/17 21:45

一、this指针

在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配有自己独立的存储空间。如果对同一个类定义n个对象,则有n组同样大小的空间以存放对象中的数据成员。但对于成员函数来说,函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码。

那么,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员而不是其他对象的数据成员呢?。其实,在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this,注意其值不是固定的。它的值是当前被调用的成员函数所在的对象的起始地址在调用成员函数时,系统隐式地将对象的起始地址传递给成员函数,使this指针得到当前对象的地址。于是在成员函数中对数据成员的引用,就按照this的指向找到对象的数据成员,实现对数据成员的操作。也就是说, 成员函数中数据成员名的前面隐含有“this->” 的指向。  而一个对象的this指针并不是对象本身的一部分,不会影响sizeof(“对象”)的结果。

this指针 

int Box∷tiji( )  {return (h*w*l); }

int Box∷tiji( )  {return (this->h*this->w*this->l);}

假设a是box类对象,当执行a.tiji()时,this=&a 当执行时 int Box∷tiji( ) {return (a.h*a.w*a.l); }

二、静态成员 

在c++中,可以将关键字中可以将关键字static用于类的某成员,这样该成员就成为静态成员了。 

静态成员包括:静态数据成员、静态成员函数。静态数据成员被类的所有对象共享。静态成员函数可以访问静态数据成员,而不能访问非静态成员。

class Box{   public:      int tiji( );   private:      static int h;      int w;      int l;};

h为静态数据成员,它为各对象所共有。即使有多个box 对象,h在内存中只占一份空间(而不是每个对象都分配 h空间)。h的值对所有对象都是一样的,若改变h的值,则各对象h的值都同时改变了。

#include<iostream>using namespacestd;class Box{   public:      Box(int,int);      int tiji( );      static int h;      int w;      int l;};Box∷Box(int b,int c) {   w=b;   l=c;}int Box∷tiji( ){   return(h*w*l);}int Box∷h=10;int main( ){   Box a(15,20),b(20,30);   cout<<a.h<<endl;   cout<<b.h<<endl;   cout<<Box∷h<<endl;   cout<<a.tiji()<<endl;   return0;}

(1)在一个类中可以有一个或多个静态数据成员。静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间。 

(2)静态数据成员可以初始化,但只能在类体外进行初始化。

形式为:数据类型 类名∷静态数据成员名=初值; 

(3)静态数据成员既可以通过对象名引用,也可以通过类名来引用。

 (4)静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。 

#include<iostream>using namespacestd;class Objcount{   private:      staticint count; 该程序可用来统计Objcount对象的个数。   public:     Objcount()若将static去掉,就不能完成该功能。     {      count++;    }    intget()    {       returncount;    }};int Objcount::count=0;int main(){     Objcount a1,a2,a3;     cout<<”对象的数量是:”<<a1.get();     cout<<”对象的数量是:”<<a2.get();     cout<<”对象的数量是:”<<Objcount.get(); }
静态数据成员

    静态数据成员为在一个类范围的数据共享提供了技术支持,而不必使用全局变量。静态数据成员的主要用途是定义类的各个对象所公用的数据。

静态成员函数

成员函数也可以定义为静态的。与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。 静态成员函数可以访问静态数据成员,而不能访问非静态成员。 

 三、友元

友元通俗地说,就是一个类主动声明本类以外的某个函数是它的朋友,进而给它们提供访问本类成员的特许。友元函数的作用是在类之间实现数据共享,减少系统开销,提高效率。但是会破坏类的封装,所以尽量不要用友元函数。

友元包括友元函数和友元类两种:

(1) 如果在本类中用friend对本类以外的某个函数进行了声明,则该函数就成为本类的友元函数。这样,它虽然不是本类的成员函数,但它可以访问本类的所有成员,无论是公有成员还是私有成员。被声明为友元的函数可以是其他类的成员函数,也可以是普通函数。

声明为友元的函数可以是不属于任何类的普通函数,也可以是其它类的成员函数。 

(2) 如果在本类中(例如A类 对另一个类例如B 类)进行了声明,则B类就是A类的友元类。B中的所有函数就都自动成为类A的友元函数。 


四、友元函数与成员函数的区别

1、友元函数不可以被继承

2、友元函数不具有this指针

针对第二点,生出这样一个疑问,友元函数没有this指针是怎么实现对类对象的数据访问的?

这主要分两种情况:

1、如果访问的是静态数据成员,是不需要用特定的方式定位访问的数据

2、如果访问非静态数据成员,需要将对象本身、指针、引用作为参数传入函数体内部(这里要注意,类的使用要在声明之后,声明和定义可以分开)

原创粉丝点击