- - 异常是一个对象,它在出错的地方抛出,并且被一段用处理特定类型错误的,相应的异常处理程序(异常处理程序)所捕获。
- - 这好像是对编译器说:“我知道你以前没有看到过这名字,但我保证它一定在某个地方,它是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); };
Thinking in C++学习随记
最新推荐文章于 2024-07-03 14:58:53 发布