C++中的函数重载,隐藏
函数重载:
在C中函数不能重名,但是在C++中则可以函数重名,用法是根据函数的名字,参数个数,参数数量在构建函数时进行函数重命名,例如:
int a(int b) { return b; } int a(char b) { return b; }
这两个函数在C++中可以调用,不会出现函数重名问题,具体调用编译器会根据数据类型进行辨别,如果数据类型都不符合,那么会自动调用比较合适的那个。
函数隐藏:
函数隐藏可以认为是函数作用域的先后级问题,在同一个cpp文件中的两个函数子作域中的标识符会屏蔽上层作用域中的同名标识符,所以在不同作用域下的同名函数也不会产生重名问题,例如:
int a(int b) { return b; } class a; { int x; public:int a(int b) { return b*b; } a(x); }
以上a(x)函数返回的是x*x,而不是x,这就是函数隐藏。
默认形参
1、什么是默认形参
C++中的函数可以给参数设置一个默认值,当函数被调用时,如果调用者提供了实参则使用实参,如果没有提供实参则使用默认值。
2、默认形参的约束
1、如果只有一部分形参设置了默认参数,则这些参数要全部靠右边。
2、如果函数的声明和定义分开了,只需要在声明时设置默认参数即可。
3、设置的默认参数必须是常量、常量表达式或全局变量。
4、默认形参可能会引起重载函数的歧义。
引用:
引用在C++中是一种取名机制,是为了跨函数使用变量,可以认为是指针,但是和指针不同:指针有4或8字节大小,而引用不占空间,而且引用比指针安全,不可能出现空引用,不可能越界,极少数情况下会产生野引用,但是引用必须初始化,然后和const一起调用例如:
int num = 10; const int& number = num;
这里的number完全等价于num;连地址都是一样的。
this指针
成员函数是如何区别调用它的对象?
1、对象所占用内存中没人存储成员函数指针,只存储了它的成员变量。
2、成员函数有个隐藏的参数叫this,就是该类型的指针,当在成员函数中访问成员变量时,隐藏的加了this指针。
常对象与常函数:
1、被 const 修饰过的对象,不能调用普通的成员函数,因为 const 对象获取到的this指针同样具有const属性,而普通的成员函数的this不具备const属性,所以无法调用。
2、成员函数的格式末尾添加 const 该成员函数的this指针就具备了 const 属性,这种成员函数也叫作常函数。
返回值 函数名(参数列表) const
{
}
普通对象和常对象都可以调用常函数,但常对象只能调用常函数。
普通成员函数和常函数都可以调用常函数,但常函数只能调用常函数。
常函数与普通成员函数(格式一模一样),可以形成重载。
空类的对象要占用1字节内存。