网站建设招标合同要求,聊城市网站建设公司,爆款采集推广引流软件,网站怎样设计网址大全1. 函数重载
C⽀持在同⼀作⽤域中出现同名函数#xff0c;但是要求这些同名函数的形参不同#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为#xff0c;使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。
#includeiostream
u…1. 函数重载
C⽀持在同⼀作⽤域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。
#includeiostream
using namespace std;// 1、参数类型不同int Add(int left, int right)
{
cout int Add(int left, int right) endl;
return left right;
}double Add(double left, double right)
{
cout double Add(double left, double right) endl;
return left right;
}// 2、参数个数不同void f()
{
cout f() endl;
}void f(int a)
{
cout f(int a) endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{
cout f(int a,char b) endl;
}
void f(char b, int a)
{
cout f(char b, int a) endl;
} // 返回值不同不能作为重载条件因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下⾯两个函数构成重载
// f()但是调⽤时会报错存在歧义编译器不知道调⽤谁
2. 引⽤ 引⽤不是新定义⼀个变量⽽是给已存在变量取了⼀个别名编译器不会为引⽤变量开辟内存空间 它和它引⽤的变量共⽤同⼀块内存空间。⽐如⽔壶传中李逵宋江叫铁⽜江湖上⼈称⿊旋 ⻛林冲外号豹⼦头 类型 引⽤别名 引⽤对象; #includeiostream
using namespace std;
int main()
{
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;
return 0;
} 2.1引⽤的使⽤ • 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。 • 引⽤传参跟指针传参功能是类似的引⽤传参相对更⽅便⼀些。 • 引⽤返回值的场景相对⽐较复杂我们在这⾥简单讲了⼀下场景还有⼀些内容后续类和对象章节 中会继续深⼊讲解。 • ⼀些主要⽤C代码实现版本数据结构教材中使⽤C引⽤替代指针传参⽬的是简化程序避开 复杂的指针但是很多同学没学过引⽤导致⼀头雾⽔。 • 引⽤必须在定义的时候初始化 •引用一旦定义时初始化指定就不能再修改指针可以改变指向 typedef struct ListNode
{
int val;
struct ListNode* next;
}LTNode, *PNode;// 指针变量也可以取别名这⾥LTNode* phead就是给指针变量取别名
// 这样就不需要⽤⼆级指针了相对⽽⾔简化了程序
//void ListPushBack(LTNode** phead, int x)
//void ListPushBack(LTNode* phead, int x)void ListPushBack(PNode phead, int x)
{
PNode newnode (PNode)malloc(sizeof(LTNode));
newnode-val x;
newnode-next NULL;
if (phead NULL)
{
phead newnode;
}
else
{
//...
}
}2.2权限放大与缩小
• 可以引⽤⼀个const对象但是必须⽤const引⽤。const引⽤也可以引⽤普通对象因为对象的访 问权限在引⽤过程中可以缩⼩但是不能放⼤。
int main()
{
const int a 10;
//int ra a;
// 编译报错error C2440: “初始化”: ⽆法从“const int”转换为“int ”
// 这⾥的引⽤是对a访问权限的放⼤a的值不可变但ra可以变
// 这样才可以
const int ra a; //ra也不可变//ra;
// 编译报错error C3892: “ra”: 不能给常量赋值ra也不可变// 这⾥的引⽤是对b访问权限的缩⼩b可变但rb不可变
int b 20;
const int rb b;//rb;
// 编译报错error C3892: “rb”: 不能给常量赋值2.3 传值返回和传引用返回 1. 传值返回并不是直接返回n而是用临时变量存储再返回因为出作用域后n就销毁了 2.传引用返回相当于直接返回n的别名可能是1也可能是随机值因为n已经销毁了 总结 如果要使用引用返回必须保证返回值出了作用域还存在 2.4 const 需要注意的是类似 int rb a*3; double d 12.34; int rd d; 这样⼀些场 景下a*3的和结果保存在⼀个临时对象中 int rd d 也是类似在类型转换中会产⽣临时对 象存储中间值也就是时rb和rd引⽤的都是临时对象⽽C规定临时对象具有常性可理解为const类型所以这⾥ 就触发了权限放⼤必须要⽤常引⽤才可以。 只有const引用可以引用常量权限不变也可以引用变量此时权限缩小。 非const引用不可以引用常量防止权限放大。非const引用可以引用变量此时权限不变。 #includeiostream
using namespace std;
int main()
{
int a 10;
const int ra 30;
// 编译报错: “初始化”: ⽆法从“int”转换为“int ”
// int rb a * 3; // a*3存储在临时变量中而临时变量有常性视为常量不可更改const int)使用intrb 存储是权限的放大const int rb a*3;
double d 12.34;// 编译报错“初始化”: ⽆法从“double”转换为“int ”
// int rd d;const int rd d;
return 0;
} 3. inline • ⽤inline修饰的函数叫做内联函数编译时C编译器会在调⽤的地⽅展开内联函数这样调⽤内联 函数就需要建⽴栈帧了就可以提⾼效率。 • inline对于编译器⽽⾔只是⼀个建议也就是说你加了inline编译器也可以选择在调⽤的地⽅不展 开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。 • C语⾔实现宏函数也会在预处理时替换展开但是宏函数实现很复杂很容易出错的且不⽅便调 试C设计了inline⽬的就是替代C的宏函数。 • vs编译器 debug版本下⾯默认是不展开inline的这样⽅便调试debug版本想展开需要设置⼀下 以下两个地⽅。 • inline不建议声明和定义分离到两个⽂件分离会导致链接错误。因为inline被展开就没有函数地 址链接时会出现报错。 #includeiostream
using namespace std;
inline int Add(int x, int y)
{
int ret x y;
ret 1;
ret 1;
ret 1;
return ret;
}
int main()
{
// 可以通过汇编观察程序是否展开
// 有call Add语句就是没有展开没有就是展开了
int ret Add(1, 2);
cout Add(1, 2) * 5 endl;
return 0;
}