如何理解C ++入门3中的句子

时间:2012-11-07 09:24:36

标签: c++ abstract-class information-hiding inline-functions

以下是Stanley B.LippmanJoséeLajoie撰写的<C++ primer (3rd)>第7.6章摘录。

  

指定为内联的函数在调用它的程序中的每个点处“在行”展开。例如,

     

int minVal2 = min(i,j);

     

在编译时扩展为

     

int minVal2 = i&lt; j?我:j;

     

因此删除了使min()成为函数的运行时开销。   min()通过在函数声明或定义中的函数返回类型之前指定inline关键字来声明内联:

     

inline int min(int v1,int v2){/ * ... * /}

     

但请注意,内联规范仅是对编译器的建议。编译器可以选择忽略它   推荐,因为内联声明的函数不适合在调用点扩展。递归函数,   例如rgcd(),无法在调用点完全展开(尽管它的第一次调用可以)。 1,200线   功能也很可能不会在通话点扩展。一般来说,内联机制旨在优化小型,直   线,经常被称为函数。 在抽象数据类型的设计中支持信息隐藏至关重要   例如2.3节中介绍的IntArray类及其size()内联成员函数。

有人可以解释标记为粗体的句子吗?

3 个答案:

答案 0 :(得分:1)

  • “在抽象数据类型设计中,它发挥了重要作用 支持信息隐藏“

数据类型:您可能对这个术语很熟悉。它可以是整数,字符串等,也可以是更复杂的类型,如B树,复数等。

抽象数据类型:这些是代表某些现实对象的数据类型。

e.g。

struct SCustomer
{
   string name;
   string address;
   int    id;
   enum CreditRanking { Good, Poor, Bankrupt };
   CreditRating rating;
};

CreditRating 是一种抽象数据类型, SCustomer 也是如此。

信息隐藏:通过将信息封装在抽象数据类型中,设计人员可以考虑在客户上执行的操作,而不会让SCustomer的实际实现混乱他们的思维过程。

信息并不是真正隐藏的,如果他们愿意,他们可以查看数据类型的定义,但在许多情况下,更容易专注于高(抽象)级别而不考虑小细节。

你可以这样想:

  • 考虑低级细节并构建一组对象。
  • 忽略低级细节,并将对象合并到更大的对象或应用程序中。

上面的内容过于简化了,但我希望它能给你带来味道。

这有帮助吗?

答案 1 :(得分:1)

我这里没有第3版的全文,但从你发布的背景来看,很明显他在说什么。

想象一种'矢量'类。

class Vector {
private: 
  int * data; // pointer to data

有几种方法可以提供对矢量大小的访问:

选择1:公共成员变量:

public:
  int datasize; 

选择2:具有公共访问者的私有变量

private:
  int datasize; 

public:
  int getSize(); // body can be hidden in CPP, but would be { return datasize;};

选择3:为2,但使用内联访问者

private:
  int datasize; 

public:
  inline int getSize() { return datasize; };

现在,#1的数据隐藏性很差,但性能很好。 #2具有很好的数据隐藏性,但性能很差。 #3具有良好的数据隐藏性,可能性能很好。 (记住内联只是一个提示)

在我看来,#3的数据隐藏略逊于#2,因为功能代码显示在标题中 - 即使您无法访问该成员。所以,我会按照......的方式改写他的陈述。

  

内联函数在需求之间提供了良好的折衷   数据隐藏与绩效。

我不同意它是“最重要的”,因为它只是对编译器的暗示。

答案 2 :(得分:0)

关于“内联函数”的后期出现。

调用内联函数与将代码“排成队”一样快。由于速度和大小的开销,一些程序员可能会犹豫是否将其逻辑封装在函数中,但使用内联函数可以将任何开销(通常)减少到最小量。

想想这段代码:

int customer_code = get_code(customer_name);
int product_code  = get_id(product_name);
bool credit_ok    = check_credit(customer_code);
int order_number  = create_order(customer_code, credit_ok, 
                                 product_code, quantity);
print_order(order_number, customer_code, customer_name, 
            product_code, product_name, quantity);

信息隐藏版本可能如下所示。

order ord = cust.make_order(product, quantity);
order.print();

这构成了一个更大的程序的一部分,你可以使高级代码更容易理解。有人仍然需要设计客户,订单,产品等对象,但他们只需要一次专注于一件事,然后可以在整个程序中使用这些工具。