第五章:C++程序的结构

主要内容:

1.作用域与可见性

2.对象的生存期

3.数据与函数

4.静态成员

5.共享数据的保护

6.友元

7.编译预处理命令

8.多文件结构和工程



作用域:函数原型作用域、块作用域、类作用域、文件作用域

函数原型作用域的变量应该是出了函数头的括弧就没有效果了????有点不明白!!!

friend 函数中可以访问private 和 protected成员。

friend function

friend classs

friend 是单向的

friend 函数 有些迷糊,需要再看看???



const 类型:

1.const 类型说明符 &引用名

2.类名 const 对象名

3.类型说明符 const 数组名[大小]...

4.const 类型说明符 *ptr  或者 类型说明符 const *ptr

5.类型说明符 * const ptr

6.类型说明符 函数名(参数表)const;



问题的提出

  我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开 销,而影响程式的运行效率。

  为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但他需要在类体内进行说 明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是他能够访问类中的私有成员。友元的作用在于提高程式的运 行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。

  友元能够是个函数,该函数被称为友元函数;友元也能够是个类,该类被称为友元类。

  友元函数

  友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,他和普通函数相同,即在定义上和调用上和普通函数相同。下面举一例子说明友元函数的应用。

  #include 
  #include

  class Point
  {
  public:
    Point(double xx, double yy) { x=xx; y=yy; }
    void Getxy();
    friend double Distance(Point &a, Point &b);
  private:
    double x, y;
  };

  void Point::Getxy()
  {
  cout<<"("<<<","<<<")"<<endl;>< FONT>
  }

  double Distance(Point &a, Point &b)
  {
  double dx = a.x - b.x;
  double dy = a.y - b.y;
  return sqrt(dx*dx+dy*dy);
  }

  void main()
  {
  Point p1(3.0, 4.0), p2(6.0, 8.0);
  p1.Getxy();
  p2.Getxy();
  double d = Distance(p1, p2);
  cout<<"Distance is"<<<endl;>< FONT>
  }

   说明:在该程式中的Point类中说明了一个友元函数Distance(),他在说明时前边加friend关键字,标识他不是成员函数,而是友元函数。 他的定义方法和普通函数定义相同,而不同于成员函数的定义,因为他无需指出所属的类。但是,他能够引用类中的私有成员,函数体中 a.x,b.x,a.y,b.y都是类的私有成员,他们是通过对象引用的。在调用友元函数时,也是同普通函数的调用相同,不要像成员函数那样调用。本例 中,p1.Getxy()和p2.Getxy()这是成员函数的调用,要用对象来表示。而Distance(p1, p2)是友元函数的调用,他直接调 用,无需对象表示,他的参数是对象。(该程式的功能是已知两点坐标,求出两点的距离。)

  友元类

  友元除了前面讲过的函数以外,友元还能够是类,即一个类能够作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的任何成员函数都是另一个类的友元函数。

---------------------------------------------------另一篇

采 用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一 些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为 友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的 私有成员。
友元函数  
      友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
      friend  类型 函数名(形式参数);

友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
      一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
      友元函数的调用与一般函数的调用方式和原理一致。

友元类  
      友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。       
      当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
      friend class 类名;
      其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

例如,以下语句说明类B是类A的友元类:
      class A
      {
             …
      public:
             friend class B;
             …
      };
      经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

使用友元类时注意:
            (1) 友元关系不能被继承。 
            (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
            (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

注意事项:

1.友元可以访问类的私有成员。

2.只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。

3.友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。

4.类必须将重载函数集中每一个希望设为友元的函数都声明为友元。

5.友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。



友元:

1.变量权限有关:private / protected 他们的访问方式

2.友元的声明、定义、调用跟普通函数雷同

时间: 2024-10-01 07:58:59

第五章:C++程序的结构的相关文章

Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/usergu

《算法》第五章部分程序 part 4

? 书中第五章部分程序,包括在加上自己补充的代码,Trie 树类,Trie 集合,三值搜索树(Ternary Search Trie) ● Trie 树类 1 package package01; 2 3 import edu.princeton.cs.algs4.StdIn; 4 import edu.princeton.cs.algs4.StdOut; 5 import edu.princeton.cs.algs4.Queue; 6 7 public class class01<Value>

《算法》第五章部分程序 part 2

? 书中第五章部分程序,包括在加上自己补充的代码,字符串高位优先排序(计数 + 插排),(原地排序),(三路快排,与前面的三路归并排序相同) ● 计数 + 插排 1 package package01; 2 3 import edu.princeton.cs.algs4.StdIn; 4 import edu.princeton.cs.algs4.StdOut; 5 6 public class class01 7 { 8 private static final int BITS_PER_BY

《算法》第五章部分程序 part 1

? 书中第五章部分程序,包括在加上自己补充的代码,字母表类,字符串低位优先排序(桶排) ● 字母表类 1 package package01; 2 3 import edu.princeton.cs.algs4.StdOut; 4 5 public class class01 6 { 7 public static final class01 BINARY = new class01("01"); 8 9 public static final class01 OCTAL = new

《算法》第五章部分程序 part 3

? 书中第五章部分程序,包括在加上自己补充的代码,字符串高位优先排序(美国国旗排序) ● 美国国旗排序 1 package package01; 2 3 import edu.princeton.cs.algs4.StdIn; 4 import edu.princeton.cs.algs4.StdOut; 5 import edu.princeton.cs.algs4.Stack; 6 7 public class class01 8 { 9 private static final int B

第五章 C程序结构

一.数值类型 1.实数常量的表示:3.5(双精度),3.5f(单精度),3.5L(长双精度) 2.整数常量:char字符常量('a','b','0')当做一个整型常量参加运算 3.数字字符与英文字母字符的编号(Ascll码)都是顺序连接的 二.控制语句 1.while和do while的区别:当while条件不成立时,while()循环不执行循环语句,而do while会循环执行一次循环语句再判断 2.流程控制语句:continue(中断本次循环)    break(跳出整个循环) 3.开关语句

Python基础知识进阶(五---2)----程序基本结构、简单分支、异常处理、三大实例分析、基本循环结构、通用循环构造方法、死循环\嵌套循环、布尔表达式

上一篇随笔写的内容有点多了,决定分成两节,不然自己看的时候也头疼. 三者最大实例: 分支结构可以改变程序的控制流,算法不再是单调的一步步顺序执行. 假设:以找出三个数字中最大者的程序设计为例. 输入:三个数值. 处理:三者最大算法 输出:打印最大值 计算机怎么能确定哪个是计算机输入的最大值呢? 策略1:通盘比较 将每个值与其他所有值比较以确定最大值. if x1>=x2 and x1>=x3: max = x1 elif x2>=x1 and x2>= x3: max = x2 e

【Head First Java 读书笔记】(五)编写程序

第五章 编写程序 伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法 测试码:测试用的程序代码 真实码:实际代码 伪码 伪码是介于真正的java程序与正常英语之间的一种语言.伪码大致包括3部分:实例变量的声明.方法的声明.和方法的逻辑.伪码最重要的部分是方法的逻辑. 测试码 测试代码写在编写方法之前.先编写测试用程序代码的概念来自于极限编程(XP). 极限编程(XP):一种新型的软件开发方法论.XP规则 关于for循环 基本for循环 for(int i = 0;i<100;i++){} 第一段:

程序设计基础 第五章 选择结构的程序设计(知识点)

第五章  选择结构的程序设计 第一部分: 总结 1根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构 2C语言的选择语句包括if 和switch语句 3使用break语句,可以中断switch语句的执行. 4使用goto 语句,可以将程序执行流程无条件专项. 第二部分: 分别简述 5.1用if语句设计选择结构程序 5.1.1  简单的if语句 使用条件:满足条件就执行,不满足就不执行. 格式: If(表达式){语句1} 5.1.2    if_else语句 格式: If(表达

第五章 程序结构

返回值 系统自动生成返回值的副本,该副本可以在程序中的返回点获得 函数原型声明 除非函数的定义在相同源文件的前面,否则必须使用函数原型声明(通常在#include和using之后): #include <iostream> using namespace std; double power(double x,int y);  //函数原型声明,形参可以和函数实现不同甚至只写double,int int main() { x=power(y,z); } double power(double x