第七章

1.重载函数名,无论是同一作用域还是不同作用域,编译器会用不同的内部名来区分重载函数。
2.不同的编译器可能会产生不同的内部名。
3.即使你可以看到,该函数是实际上的f(int) ,编译器不知道这一点,因为有人告知-通过明确的声明——该函数为 f(char)。因此,编译成功。在 C,链接器也将是成功的,但 在C + +中没有。因为编译器会修饰这些名字,定义函数为 f_int之类的名字,而调用函数是 f_char。当链接器会尝试解析引用f_char,它只能找到f_int,它给你一个错误消息。这是类型安全连接。这就是利用c++编译器查找c语言程序中很隐蔽的错误的一个例子
4.
union U {
private: // Access control too!
  int i;
  float f;
public:  
  U(int a);//union也可以包括函数
  U(float b);
  ~U();
  int read_int();
  float read_float();
};
你可能会想从上面的代码中,唯一的区别是union与class的唯一不同之处是数据存储(即,int和float覆盖在同一块存储)。然而,union不能用作基类继承,从面向对象设计角度看这是相当限制的(你将了解继承在第14章)。
5.一个更安全的union可以封装在一个类中
6.
class SuperVar {
  enum {
    character,
    integer,
    floating_point
  } vartype;  // Define one
  union {  // Anonymous union
    char c;
    int i;
    float f;
  };//枚举和union均没有标识名,仅供类使用
7.union没有类型名和标识符,这叫做匿名联合,为这个union创建空间,但并不需要用标识符的方式和以点操作符“.”方式访问这个union的元素
int main() {
  union { 
    int i; 
    float f; 
  };
  // Access members without using qualifiers:
  i = 12;
  f = 1.22;
} ///:~
8.
  Stash(int size); // Zero quantity
 Stash(int size, int initQuantity);
用一个函数声明来代替
  Stash(int size, int initQuantity = 0);
默认参数只能放在函数声明中,通常在一个头文件中
9.声明的参数列表中可不带标识符
void f(int x, int = 0, float = 1.1);
10.
class MyString {
  Mem* buf;///用MyString类来操作Men类
public:/// buf = new Mem(strlen(str) + 1);
  MyString();
  MyString(char* str);
  ~MyString();
  void concat(char* str);
  void print(ostream& os);
};
11.默认参数的一个重要应用情况是在开始定义函数时用了一组参数,而使用了一段时间后发现要增加一些参数。通过把这些新增参数都作为默认的参数,就可以保证所有使用这一函数的客户代码不会受到影响

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值