2010/11/9
关键字:函数
零散知识点
1. 主函数main的返回值是有一定意义的,返回0代表正常运行,其他大部分返回值则表示失败.返回码的意义跟机器有关,cstdlib头文件中定义了两个预处理变量,分别表示程序运行成功和失败:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
2. 如果main函数没有显式返回值,则编译器会隐式的插入返回0的语句.
3. 函数返回值用于初始化在调用函数处创建的临时对象(temporary object),在求解表达式时,如果需要一个地方存储其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
int AddInt(int i, int j)
{
return i + j; //返回临时变量假设为temp(初始化为i+j的值)
//return i; //返回临时变量假设为temp(初始化为i的值)
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0, j = 1;
i = AddInt(i , j); //temp的值复制给i
return EXIT_SUCCESS;
}
4. 千万不要返回局部变量的引用。同样也不要返回局部变量的指针.
5. 主函数main不能调用自身.
6. 只有当定义它的函数被调用时才存在的对象称为自动对象(automatic object).与之对比的是static局部变量.
内联函数
正常函数调用要比内联函数多做很多工作:
调用前保存寄存器,并在返回时恢复
复制实参
程序转向一个新位置执行
简单的内联函数如:
inline int AddInt(int i, int j)
{
return i + j;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0, j = 1;
i = AddInt(i , j); //两者等价,编译时展开
i = (i + j); //两者等价
内联函数标识inline对于编译器来说只是一个建议,编译器可以选择忽略。
内联函数应该放在头文件中
类的成员函数
1. 成员函数有额外的、隐含的形参
class A
{
public:
void Func(int param);
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.Func(0); //编译器会编译成A::Func(&a, 0);
2. 常量成员函数
class A
{
public:
void Func(int param) const{}//等价于void Func(const A *this指针, int param)
};
const的作用是将this指针指定为const类型
const对象只能调用const函数,因为const属性只能增强,不可放松限制.所以非const对象可以调用非const和const函数,但是const对象不能调用非const成员函数.
3. 没有形参的构造函数即为默认构造函数,无论是由编译器定义的还是程序员定义的。其中由编译器创建的默认构造函数通常称为合成的默认构造函数(synthesized default constructor)。
合成的默认构造函数一般适用于仅包含类类型成员的类。只会生成代码调用类类型成员的默认构造函数,内置类型变量不做任何处理。所以当类中包含内置类型的成员变量时,需要显示定义默认构造函数。
但是一旦显示定义了任何形式的构造函数(包含拷贝构造函数)编译器就不会生成合成的构造函数。相反,如果没有定义任何形式的构造函数,编译器也不一定会“合成“合成的默认构造函数。
有4种情况下会合成,详见《深度探索C++对象模型》。无需深入。