随笔 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

       书接上回,话说要用库来增强C++的效率,我们在库里实现了一个struct结构体,并把函数放进结构体里,从而隐藏了函数名,力图避免明明冲突,并且讲述了.h文件的重要作用,把函数放进了结构体中,算是迈进了C++的门槛了。但是struct中的数据客户程序员还是会看到,更重要的是,客户程序员还可以随心所欲地修改他,这造成了潜在的危险。为了消除这些不稳定因素,c++的访问控制应运而生。

       目的:1. 让客户程序员远离他们不需要使用的东西,请把重点放在接口上。2. 库设计者可以随心所欲地改变内部实现。
       实现:private,public,protected

       被private修饰的变量和函数不能被外部函数存取,这就是一道屏障。但是很多情况下,外部函数需要这些变量,这就需要友元声明。友元的声明必须要在“当事者类”中。相当于必须是我承认你是我的朋友,你才能进入我家。而不是你自己说你是我的朋友你就可以进入我家。

struct X;// 不完全类型说明
struct Y{
   void f(X*);
}
struct X{
  private
    int i;
  public:
    friend void Y::f(X*);
  };

void Y::f(X*)
{
   X->i = 1;
}
      Y有一个成员函数,它将修改X类型的对象。C++的编译器要求在引用任一变量之前必须先声明,所以Y必须在他的成员Y::f(X*)被声明为X的一个友元之前声明。但该声明必须又要先声明X。这是可以先声明X,告诉编译器,这是一个结构体,然后,声明Y::f(X*),这里引用了一个X对象地址。这点很重要,因为编译器知道这个地址是4个字节,并且指向一个结构体,我可以不了解这个结构体是什么,大小多少,但是我了解这个地址,它只是四个字节,并且指向某个内存块。这些对传递一个地址足够了。如果传递一个对象的话,那必须知道该对象的大小和内存分配方式。

嵌套友元

      嵌套类并不能访问private成员的权限,获得访问私有成员的权限,必须遵守如下规则:
1. 首先声明一个嵌套类。
2. 然后声明他是全局范围使用的一个friend
3. 然后定义这个嵌套类。
class A
{
  private:
     int i;
  public:
     class B;//declare
     friend class B;//declare as friend
     class B{//definition
       private:
       A a;
       public:
        void f(){a.i = 1;}
      };
 };

句柄类--隐藏隐藏实现

      这里用了两个隐藏,原因是,如果我们给客户.h文件的话,他们还会看到类中的私有变量,并且会通过某种手段修改他们,这是因为:private和public只在编译的时候有用,但是编译完成之后,在内存中只是一块内存块,可以随意地存取。限定作用在运行时是没有用的。
      我们有两个方面的考虑:1. 让客户程序员不能轻易地访问私有实现部分。2. 避免不必要的重复编译。
      如果你在.h文件中修改了这个类的声明,那么你需要重新编译包含了这个.h文件的cpp文件,如果把私有变量放在一个结构体中,并且.h文件中只提供该结构体的指针和该类的接口,那么当你修改了私有变量之后,只需要包含那个结构体的定义文件。
  


//handle.h
#ifndef HANDLE_H
#define HANDLE_H
class Handle
{
  struct Pointer;
  Pointer* pointer;
 public:
  void initialize();
};
#endif

// handle.cpp
#include "handle.h"
struct Handle::Pointer{
 int m_i;
 int m_j;
};

void Handler::initialize()
{
   pointer->m_i = 0;
   pointer->m_j = 0;
}





代码



因为在声
posted on 2012-05-29 15:52 Dino-Tech 阅读(656) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理