本节书摘来自异步社区出版社《c和c++代码精粹》一书中的第1章,第1.4节,作者: 【美】chuck allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
c和c++代码精粹
在c++中,函数原型不是可选的。事实上,在ansi c委员会采用原型机制以前,它是为c++发明的。在你第一次使用函数前必须声明或定义每个函数,编译器将检查每个函数调用时正确的参数数目和参数类型。此外,在其应用时将执行自动转换。下列程序揭示一个在c中不使用原型时出现的普通错误。
/ convert2.c /
void dprint(double); /原型/
main()
{
}
void dprint(double d)
/* 输出:
123.000000
*/<code>`</code>
除类型安全外,在c++中关键的新特征是类(class),它将结构(struct)机制扩展到除了数据成员之外,还允许函数成员。与结构标记同名的一个成员函数称为构造函数,并且当声明一个对象时,它负责初始化该对象。由于c++允许定义具有与系统预定义类型一样性能的数据类型,因此,对于用户自定义类型也允许隐式转换。下面的程序定义了一个新类型a,它包含了一个double型的数据成员和一个带有一个double型参数的构造函数。
//不能隐式地既做a的转换又做b的转换
f(a(b(double(3))) //非法<code>`</code>
表达式f(b(3))是允许的,因为它显式地请求转换b(double(3)),因此编译器仅提供剩余的转换到a。
通过单一参数的构造函数的隐式转换对于混合模式表达式是很方便的。例如,标准的字符串类允许将字符串和字符数组混合,如:
// convert4.cpp
struct b;
struct a
};
void f(const a& a)
struct b
a::a(const b& b) : x(b.y)
// f(3); //将不编译
//输出:
b::b(double)
a::a(const b&)
f: 1
f: 2
f: 3
f: 4