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.默认参数的一个重要应用情况是在开始定义函数时用了一组参数,而使用了一段时间后发现要增加一些参数。通过把这些新增参数都作为默认的参数,就可以保证所有使用这一函数的客户代码不会受到影响
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.默认参数的一个重要应用情况是在开始定义函数时用了一组参数,而使用了一段时间后发现要增加一些参数。通过把这些新增参数都作为默认的参数,就可以保证所有使用这一函数的客户代码不会受到影响