C++ Primer 笔记20

1、可以在另一个类内部定义一个类,这样的类是 嵌套类(nested class),也称为嵌套类型。 外围类和嵌套类的对象时互相独立的。 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见。 外围类对嵌套类的成员没有特殊访问权,并且嵌套类对其外围类的成员也没有特殊访问权。
2、为了在外围类的外部定义类体,必须用外围类的名字限定嵌套类的名字。 嵌套类可以直接引用外围类的静态成员、类型名和枚举成员。 实例化外围类模板的时候,不会自动实例化类模板的嵌套类。像任何成员函数一样,只有当在需要完整类类型的情况下使用嵌套类本身的时候,才会实例化嵌套类。
3、 联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但在任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。
    为union对象分配的存储的量至少与包含其最大数据成员的一样多。
4.像任何类一样,union可以指定保护标记使成员称为公有的。私有的或者受保护的。默认情况下,union表现得像struct,除非另外指定,否则union的成员都是public成员。
    union也可以定义成员函数,包括构造函数和析构函数。但是,union不能作为基类使用,所以成员函数不能为虚函数。
    union不能具有静态数据成员或引用成员,而且,union不能具有定义了构造函数、析构函数或赋值操作符的类类型的成员。
5、给union对象的某个数据成员一个值使得其他数据成员变为未定义的。使用union对象时,我们必须总是知道union对象中当前存储的是什么类型的值。
    不用于定义对象的未命名union称为 匿名联合(anonymous)。匿名union的成员的名字出现在外围作用域中。 因为匿名union不提供访问其成员的途径,所以将成员作为定义匿名union的作用域的一部分直接访问。
6、可以在函数体内部定义类,这样的类称为 局部类(local class)。一个局部类定义了一个类型,该类型只在定义它的局部作用域中可见。 局部类的所有成员(包括函数)必须完全定义在类定义体内部,因此,局部类远不如嵌套类有用。
    局部类不允许声明static数据成员,因为没有办法定义它们。
    局部类只能访问在外围作用域中定义的类型名,static变量和枚举成员,不能使用定义该类的函数中的变量。
    实际上,局部类中private成员几乎是不必要的,通常局部类的所有成员都为public成员。
7、可以声明一种特殊的类数据成员,称为 位域(bit-field),来保存特定的位数。当程序需要将二进制数据传递给另一程序或硬件设备的时候,通常使用 位域。 位域在内存中的布局是机器相关的。
   位域必须是整形数据类型,可以是signed或unsigned。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员时一个位域:
   typedef unsigned int Bit;
   class File{
     Bit mode : 2;
     Bit modified : 1;
     Bit prot_owner : 3;
     Bit prot_group : 3;
     Bit prot_world : 3;
     ...
   };
8、当可以用编译器的控制或检测之外的方式改变对象值的时候,应该将对象声明为volatile。
  
用与定义const成员函数相同的方式,类也可以将成员函数定义为volatile,volatile对象只能调用volatile成员函数。
    像用const一样,只能将volatile对象的地址赋给指向volatile的指针,或者将指向volatile类型的指针复制给指向volatile的指针。只有当引用为volatile时,我们才可以使用volatile对象对引用进行初始化。
    对待const和volatile的一个重要区别是,不能使用合成的复制和赋值操作符从volatile对象进行初始化或赋值。 如果类希望允许复制volatile对象,或者,类希望允许从volatile操作数或对volatile操作数进行赋值,它必须定义自己的复制构造函数和/或赋值操作符版本。
9、C++使用链接指示(linkage directive)指出任意非C++函数所用的语言。
   链接指示有两种形式:单个或复合的。链接指示不能出现在类定义或函数定义的内部,它必须出现在函数的第一次声明上。
   可以将多重声明形式应用于整个头文件,例如,C++的cstring头文件可以像这样:
   extern "C"{
   #include <string.h>
   }
   在C++程序中,重载C函数很常见,但是,重载集合中的其他函数必须都是C++函数。
   C函数的指针与C++函数的指针具有不同的类型,不能将C函数的指针初始化或赋值为C++函数的指针(反之亦然)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值