目录
个人格言:悟已往之不谏,知来者犹可追
克心守己,律己则安!
• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)
• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
• 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
• 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。
1、参数类型不同构成重载
- //1.参数类型不同构成重载
- int Add(int a, int b)
- {
- return a + b;
- }
-
- double Add(double a, double b)
- {
- return a + b;
- }
2、参数个数不同构成重载
- //2.参数个数不同构成重载
- void func()
- {
- cout << "func()" << endl;
- }
-
- void func(int a)
- {
- cout << "func(int a)" << endl;
- }
3、参数顺序不同构成重载
- //3.参数顺序不同构成重载
- double Add(int a, double b)
- {
- return a + b;
- }
-
- double Add(double a, int b)
- {
- return a + b;
- }
注意:返回值不同不能作为重载条件,因为调⽤时也⽆法区分
4、调用时存在歧义的重载函数
- void func3()
- {
- cout << "func3()" << endl;
- }
-
- void func3(int a=10)//给上缺省值
- {
- cout << "func3(int a=10)" << endl;
- }
这两个函数构成重载,但是func3()调⽤时,会报错,存在歧义,编译器不知道调⽤谁 !
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";林冲,外号豹⼦头;
引用的定义:类型& 别名=引用对象
- //引用的定义
- int a = 0;
- // 引⽤:b和c是a的别名
- int& b = a;
- int& c = a;
- // 也可以给别名b取别名,d相当于还是a的别名
- int& d = b;
- ++d;
- // 这⾥取地址我们看到是⼀样的
- cout << &a << endl;
- cout << &b << endl;
- cout << &c << endl;
- cout << &d << endl;
• 引⽤在定义时必须初始化
• ⼀个变量可以有多个引⽤(就比如一个人可以有多个别名)
• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体(相当与一个别名只能一个人独有的,它不能再是其他人的别名)
• 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。
- //引用传参
- void swap(int& a, int& b)
- {
- int tmp = a;
- a = b;
- b = tmp;
- }
-
- int main()
- {
- int a = 10;
- int b = 20;
- cout << "交换之前" << endl;
- cout << "a=" <<a<<" b= "<<b << endl;
- swap(a, b);
- cout << "交换之后" << endl;
- cout << "a=" << a << " b=" << b << endl;
- return 0;
- }
注意:至于为什么会减少拷⻉提⾼效率 ,是因为,C++规定,在函数传值传参或传值返回时,会先调用拷贝构造函数,生成临时变量,再进行传参(所以有拷贝消耗)。这点在后面类和对象内容部分会详细讲解!
• 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
• 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解。
• 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。
• 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。
- //常变量必须用常量引用
- const int a = 10;
- const int& b = a;//权限平移
- //int& b = a;//权限变大,编译报错
-
- //普通变量既可以用普通引用
- int c = 10;
- int& d = c;//权限平移
-
- //也可以用const引用
- const int& e = c;//权限缩小
• 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。
• 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。
C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功 能有重叠性,但是各有⾃⼰的特点,互相不可替代。
• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)
• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
好了,这期的分享到这里就结束了~
如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~
如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~
我们下期不见不散~~