C函数重载
在C++中函数重载是指同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,提高了程序的可读性void pprint(int i) { std::cout << "print i :" << i << std::endl; } void pprint(std::string str) { std::cout << "print str :" << str << std::endl; } int main(int argc, const char * argv[]) { pprint(100); pprint("一百"); return 0; }
C++为什么可以实现函数重载?
在同一作用域内,函数重载这些方法在代码中都有相同的名字,参数列表不同。如果仅仅将方法名作为符号,那么链接器将不能识别。之所以能使用重载是因为它们的编译器将方法名和参数列表组合编码作为这个方法的符号。这种编码过程称为重整(mangling)。重载后的方法因为参数列表不同,编码后得到的符号也不相同
OC为什么不支持函数(方法)重载?
OC的消息发送本质上是调用objc_msgSend((id)self,sel_registerName("方法名"))这个函数,两者的sel都是pprint。对象的方法在类对象的方法列表中。objc_msgSend函数根据sel从方法列表中获取imp(指向函数实现的指针)。如果上述两个方法的sel存在重复,msgSend函数不能找到对应的imp。所以在OC中不存在方法重载
Swift为什么支持函数重载?
Swift支持函数重载,而且Swift不仅支持函数名相同,参数列表不同的函数重载,同时也支持函数名相同,参数列表相同,返回值不同的函数重载。而C++的函数重载只与参数列表有关系override func viewDidLoad() { super.viewDidLoad() let sum1 = sum(v1: 1, v2: 2, v3: 3) print(sum1) let sum2 = sum(v1: 1, v2: 2) print(sum2) let sum3 = sum(v1: 1.0, v2: 2) print(sum3) } func sum(v1: Int, v2: Int) ->Int { v1 + v2 } func sum(v1: Int, v2: Int, v3: Int) -> Int { v1 + v2 + v3 } func sum(v1: Double, v2: Int) -> Double { v1 + Double(v2) }