1.C++命名空间
清楚三个用法:1.using namespace std; ------- 将C++库中的所有函数展开。
2.using std::cout; ------ 如果对cout这个函数常用的话,只展开这个函数,其他内容以及函数并不展开。
3.直接指明该内容或者数据来自哪个命名空间 std::cout; std::cin 。
2.缺省参数
缺省函数笑称为“备胎函数”。
全缺省参数:函数的每个参数都给予一个缺省值,比如int add(int a = 10,int b = 20, int c = 30),当我们在调用add函数时,如果调用时没有给add函数传参,就会使用缺省值。
半缺省参数:也就是部分值缺省。int add(int a,int b,int c = 90);
半缺省参数的注意点:需要从右往左以此缺省,不可以间隔。传参时从左往右以此传参。
3.函数重载(一词多义)
函数重载:C++允许同一个作用域可以函数名相同,但是参数必须不同(类型/个数/顺序不同),返回值没有要求。(只是单单返回值不同,不能构成重载)
重点:面试题:1.什么是函数重载?2.C++是如何支持函数重载的?为什么C语言不支持?
1.预处理 ---> 头文件展开,宏替换,条件编译,去掉注释 ---->.i 预处理成.i文件
2.编译 ---> 检查语法,生成汇编代码 ---->.s 编译成.s文件
3.汇编 ---> 汇编代码转成二进制的机器码 --->.o 汇编成.o文件
4.链接 ---> 将两个目标文件链接在一起
函数名修饰规则
gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】
C++使用函数名修饰规则后,即使你的函数名是相同的,只要参数的个数、类型、顺序不同都可以构成函数重载,函数重载时使用函数修饰规则,在实现时就会去寻找对应的地址。这也就是C语言使用的是原函数名,一旦使用同一个函数名(同名函数无法区分)就无法进行函数重载的原因。
四、extern "C"
要求C和C++程序都可以使用C++的(静态库/动态库) ----> 只需要(静态库/动态库)在声明函数前加上extern "C"
五、引用 &
首先区别一下引用和取地址:(数据类型名+&)---> 引用 (&+变量名) ---> 取地址
引用并不是新定义一个变量,而是给已存在的变量取一个别名,并不会开辟新的空间,他和他引用的变量共用同一块内存空间。
引用的注意点:1.引用必须在定义的时候初始化。2.一个变量可以有多个引用。3.一个引用一旦引用一个实体,那就不可以再引用另外的实体。
引用取别名时,变量访问的权限可以缩小,不可以放大。临时变量具有常性。
引用涉及权限问题(权限放大和缩小问题只适用于引用与指针间)
const 只能给 const,不能给非const
非const 既可以给const,也可以给非const
应用场景:
1.引用做参数
#include <iostream>
using namespace std;
//引用例子,数据交换
void swap(int& a, int& b) {
int swap = a;
a = b;
b = swap;
}
int main() {
int a1 = 2, b1 = 3;
swap(a1,b1);
cout << a1 << "," << b1 << endl;
return 0;
}
2.引用做返回值
int& add(int a, int b) {
int c = a + b;
return c;
}
int main()
{
int& result = add(1, 2);
add(3, 4);
cout << "result = " << result << endl;
return 0;
}
--------------------------------------------------------------
int& add(int a, int b) {
static int c = a + b;
return c;
}
int main()
{
int& result = add(1, 2);
add(3, 4);
cout << "result = " << result << endl;
return 0;
}
敲敲这两段代码,看看返回值情况,主要印证下面那个观点!!!
总结:如果需要使用引用做返回值,返回变量必须出了这个函数的作用域后还存在(静态变量、全局变量),这样可以使用引用作为返回值,否则并不安全。引用作为返回值的好处:少创建一个临时对象,提高程序效率的。
传值和引用的效率比较
#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void main()
{
A a;
// 以值作为函数参数
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作为函数参数
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
// 分别计算两个函数运行结束后的时间
cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}