Thinking in C++学习随记

  •  - 异常是一个对象,它在出错的地方抛出,并且被一段用处理特定类型错误的,相应的异常处理程序(异常处理程序)所捕获。
  • - 这好像是对编译器说:“我知道你以前没有看到过这名字,但我保证它一定在某个地方,它是X类型的变量。”
  •  复杂的函数指针定义:
    void *(*(fp1)(int))[10]; 
    
    float(*(* fp2)(int,int,float))(int); 
    
    typedef double(*(*(* fp3)())[10])(); 
    fp3 a; 
    
    int(*(* fp4())[10])();
  • - 对象是一个独立的捆绑的实体,有自己的记忆和活动。
  • - 事实上,面向对象编程可以总结为一句话,“向对象发送消息”。实际上,需要做的所有事情就是创建一束对象并且给它们发送消息.-头文件是存放接口规范的地方。
  • - 头文件是存放接口规范的地方。
  • - 在任何关系中,设立相关各方都遵从的边界是很重要的。
  • - 在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。
  • - 初始化被直接赋给了聚合中的每个元素,但构造函数是通过正式的接口来强制初始化的。
  • - 只要有构造函数,无论是所有成员都是公共的结构还是一个带有私有成员的类,所有的初始化工作都必须通过构造函数来完成,即使正在对一个聚合初始化。
  • - 不能把默认参数作为一个标志去决定执行函数的哪一块,这是基本原则。在这种情况下,只要能够,就应该把函数分解成两个或者多个重载的函数。应该是一个在一般情况下放在这个位置的值。
  • - 正如任何复杂的定义一样,定义指针的技巧是在标识符的开始处读它并从里往外读。const 修饰“最接近”它的那个。
  • - volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。
  • - volatile告诉编译器不要擅自作出有关该数据的任何假定,优化期间尤其如此。
  • - 宏的实现是用预处理器而不是编译器。预处理器直接用宏代码代替宏调用,预处理器只是简单地执行字符代替。
  • - 为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,C ++引入了内联函数(内联函数)。
  • - 任何在类中定义的函数自动地变成内联函数,但也可以在非类的函数前加上inline关键词使之成为内联函数。但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待。
  • - 一般应该把内联的定义放在头文件里。在类里内联函数的最重要的使用之一是做访问函数(access function)。这是一个小函数,它容许读或修改对象状态一个或者几个内部变量)。
    //内联访问功能
    
    class Access { 
      int i; 
    上市:
      int read()const {return i; } 
      void set(int ii){i = ii; } 
    ]。
    
    int main(){ 
      AccessA; 
      A.set(100); 
      int x = A.read(); 
    }
    这里,在类的设计者控制下,将类里面的状态变量设计成私有的,类的使用者就永远不会直接和它们发生联系了。对私有数据成员的所有访问只能通过成员函数接口进行。
  • 进一步把访问函数分解为访问器(accessor)和用于修改状态信息的修改器(mutator),而且可以重载函数为访问器和修改器提供相同函数名,调用函数的方式决定了是读还是修改状态信息
  • - 对于内建数据类型使用的构造函数调用形式。
  • - 内联函数和预处理器的显着不同:预处理器不能检查类型和进行转换。
  • - 对任何函数,编译器在它的符号表里放入函数类型(即包括名字和参数类型的函数原型和函数返回类型)。另外,当编译器看到内联函数和对内联函数体进行分析没有发现错误时,就将对应于函数体的代码也放入符号表。
  • - 一般地,任何种类的循环都被认为太复杂而不拓展为内联函数。假如要显示地或隐式地取函数地址,编译器也不能执行内联。
  • - C ++语言规定,只有在类声明结束后,其中的内联函数才会计算。(向前引用)
  • - 预处理器的更多特征:
  • 字符串定义(用#指示,它容许取一个标识符并把它转化为字符数组)
  • 字符串拼接(当两个相邻的字符串没有分隔符时发生)
    //在调试代码时,这两个特征特别有用。
      #define DEBUG(x)cout << #x“=”<< x 
  • 标志粘贴(直接用“##”实现)
    #define FIELD(a)char * a ## _ string; int a ## _ size
    class Record {
     FIELD(one);
     FIELD(2);
      FIELD(3);
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值