当前位置: 首页 > news >正文

买到域名网站怎么做小程序免费制作平台登录

买到域名网站怎么做,小程序免费制作平台登录,安徽网站开发与维护专业,wordpress generator目录 五. 函数重载 1、参数类型不同 2、参数个数不同 3、参数类型顺序不同 C支持函数重载的原理--名字修饰(name Mangling#xff09; 为什么C支持函数重载#xff0c;而C语言不支持函数重载呢#xff1f; 六. 引用 6.1 概念 6.2 引用特性 6.3 常引用 6.4 使用场景 …目录 五. 函数重载 1、参数类型不同 2、参数个数不同 3、参数类型顺序不同 C支持函数重载的原理--名字修饰(name Mangling 为什么C支持函数重载而C语言不支持函数重载呢 六. 引用 6.1 概念 6.2 引用特性 6.3 常引用 6.4 使用场景 1. 做参数 2. 做返回值 3.下面代码输出什么结果为什么 6.5. 传值、传引用效率比较 6.6 引用和指针的区别具体查看汇编底层 七. 内联函数 7.1 概念 7.2 特性 八. auto关键字(C11) 8.1 类型别名思考 8.2 auto简介 8.3 auto的使用细则 1. auto与指针和引用结合起来使用 2. 在同一行定义多个变量 8.3 auto不能推导的场景 1. auto不能作为函数的参数 2. auto不能直接用来声明数组 3. 为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法 4. auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有 lambda表达式等进行配合使用。 九. 基于范围的for循环(C11) 9.1 范围for的语法 9.2 范围for的使用条件 1. for循环迭代的范围必须是确定的 2. 迭代的对象要实现和的操作。 十. 指针空值---nullptr(C11) 五. 函数重载 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型 不同的问题。 1、参数类型不同 #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、参数个数不同 #includeiostream using namespace std;// 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; } int main() {Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0; } C支持函数重载的原理--名字修饰(name Mangling 为什么C支持函数重载而C语言不支持函数重载呢        ok了老铁请看vcr链接可以打开 比特对c与c支持与不支持函数重载的解释 六. 引用 6.1 概念 引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间。 比如尚家辉在家叫帅辉学校里人称尚欧巴。 类型 引用变量名(对象名) 引用实体 void TestRef() {int a 10;int ra a;//定义引用类型printf(%p\n, a);printf(%p\n, ra); } 注意引用类型必须和引用实体是同种类型的 6.2 引用特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体再不能引用其他实体 void TestRef() {int a 10;// int ra; // 该条语句编译时会出错int ra a;int rra a;printf(%p %p %p\n, a, ra, rra); }6.3 常引用 void TestConstRef() {const int a 10;//int ra a; // 该语句编译时会出错a为常量const int ra a;// int b 10; // 该语句编译时会出错b为常量const int b 10;double d 12.34;//int rd d; // 该语句编译时会出错类型不同const int rd d; }6.4 使用场景 1. 做参数 void Swap(int left, int right) {int temp left;left right;right temp; }2. 做返回值 int Count() {static int n 0;n;// ...return n; } 3.下面代码输出什么结果为什么 注意 如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用 引用返回如果已经还给系统了则必须使用传值返回。 int Add(int a, int b) {int c a b;return c; } int main() {int ret Add(1, 2);Add(3, 4);cout Add(1, 2) is : ret endl;return 0; }6.5. 传值、传引用效率比较 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直 接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效 率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 通过下述代码的比较发现传值和指针在作为传参以及返回值类型上效率相差很大。 值和引用的作为函数参数类型的性能比较 #include time.h struct A{ int a[10000]; }; void TestFunc1(A a){} void TestFunc2(A a){} void TestRefAndValue() {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; } 值和引用的作为返回值类型的性能比较 #include time.h struct A{ int a[10000]; }; A a; // 值返回 A TestFunc1() { return a;} // 引用返回 A TestFunc2(){ return a;} void TestReturnByRefOrValue() {// 以值作为函数的返回值类型size_t begin1 clock();for (size_t i 0; i 100000; i)TestFunc1();size_t end1 clock();// 以引用作为函数的返回值类型size_t begin2 clock();for (size_t i 0; i 100000; i)TestFunc2();size_t end2 clock();// 计算两个函数运算完成之后的时间cout TestFunc1 time: end1 - begin1 endl;cout TestFunc2 time: end2 - begin2 endl; } 6.6 引用和指针的区别具体查看汇编底层 在语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。 int main() { int a 10; int ra a; couta aendl; coutra raendl; return 0; } 在底层实现上实际是有空间的因为引用是按照指针方式来实现的。 int main() { int a 10; int ra a; ra 20; int* pa a; *pa 20; return 0; } 我们来看下引用和指针的汇编代码对比 引用和指针的不同点: 1. 引用概念上定义一个变量的别名指针存储一个变量地址。 2. 引用在定义时必须初始化指针没有要求 3. 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体 4. 没有NULL引用但有NULL指针 5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 6. 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小 7. 有多级指针但是没有多级引用 8. 访问实体方式不同指针需要显式解引用引用编译器自己处理 9. 引用比指针使用起来相对更安全 七. 内联函数 7.1 概念 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的 调用。 查看方式 1. 在release模式下查看编译器生成的汇编代码中是否存在call Add 2. 在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不 会对代码进行优化以下给出vs2013的设置方式) 7.2 特性 1. inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。 2. inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。 3. inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到不仅符号表 不进行链接 下图为 《Cprime》第五版关于inline的建议 ps3 // F.h #include iostream using namespace std; inline void f(int i); // F.cpp #include F.h void f(int i) {cout i endl; } // main.cpp #include F.h int main() {f(10);return 0; } // 链接错误main.obj : error LNK2019: 无法解析的外部符号 void __cdecl f(int) (?fYAXHZ)该符号在函数 _main 中被引用 八. auto关键字(C11) 8.1 类型别名思考 随着程序越来越复杂程序中用到的类型也越来越复杂经常体现在 1. 类型难于拼写 2. 含义不明确导致容易出错 #include string #include map int main() {std::mapstd::string, std::string m{ { apple, 苹果 }, { orange, 橙子 }, {pear,梨} };std::mapstd::string, std::string::iterator it m.begin();while (it ! m.end()){//....}return 0; } std::mapstd::stringstd::string::iterator 是一个类型但是该类型太长了特别容 易写错。聪明的同学可能已经想到可以通过typedef给类型取别名比如 #include string #include map typedef std::mapstd::string, std::string Map; int main() {Map m{ { apple, 苹果 },{ orange, 橙子 }, {pear,梨} };Map::iterator it m.begin();while (it ! m.end()){//....}return 0; } 使用typedef给类型取别名确实可以简化代码但是typedef有会遇到新的难题 typedef char* pstring; int main() {const pstring p1; // 编译成功还是失败const pstring* p2; // 编译成功还是失败return 0; }  其中p1必须先初始化必须初始化常量对象现在会编译不通过    原因  const pstring* p2中const修饰的*p 是指针指向的内容  而const pstring p1有点类似你char* const p1 const修饰的指针是必须要被初始化的 在编程时常常需要把表达式的值赋值给变量这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易因此C11给auto赋予了新的含义。 8.2 auto简介 在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但遗憾的 是一直没有人去使用它大家可思考下为什么 C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一 个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。 int TestAuto() { return 10; } int main() { int a 10; auto b a; auto c a; auto d TestAuto(); cout typeid(b).name() endl; cout typeid(c).name() endl; cout typeid(d).name() endl; //auto e; 无法通过编译使用auto定义变量时必须对其进行初始化 return 0; } 【注意】 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编 译期会将auto替换为变量实际的类型。 8.3 auto的使用细则 1. auto与指针和引用结合起来使用 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加 int main() {int x 10;auto a x;auto* b x;auto c x;cout typeid(a).name() endl;cout typeid(b).name() endl;cout typeid(c).name() endl;*a 20;*b 30;c 40;return 0; } 2. 在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 void TestAuto() {auto a 1, b 2; auto c 3, d 4.0; // 该行代码会编译失败因为c和d的初始化表达式类型不同 } 8.3 auto不能推导的场景 1. auto不能作为函数的参数 // 此处代码编译失败auto不能作为形参类型因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {}2. auto不能直接用来声明数组 void TestAuto() {int a[] {1,2,3};auto b[] {456}; } 3. 为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法 4. auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有 lambda表达式等进行配合使用。 九. 基于范围的for循环(C11) 9.1 范围for的语法 在C98中如果要遍历一个数组可以按照以下方式进行 void TestFor() { int array[] { 1, 2, 3, 4, 5 }; for (int i 0; i sizeof(array) / sizeof(array[0]); i)array[i] * 2; for (int* p array; p array sizeof(array)/ sizeof(array[0]); p)cout *p endl; } 对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因 此C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范 围内用于迭代的变量第二部分则表示被迭代的范围。 void TestFor() { int array[] { 1, 2, 3, 4, 5 }; for(auto e : array)e * 2; for(auto e : array)cout e ; return 0; } 注意 与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环。 9.2 范围for的使用条件 1. for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供 begin和end的方法begin和end就是for循环迭代的范围。 注意以下代码就有问题因为for的范围不确定 void TestFor(int array[]) {for(auto e : array)cout e endl; } 2. 迭代的对象要实现和的操作。 (关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了) 十. 指针空值---nullptr(C11) 声明一个变量时最好给该变量一个合适的初始值否则可能会出现 不可预料的错误比如未初始化的指针。 如果一个指针没有合法的指向我们基本都是按照如下 方式对其进行初始化 void TestPtr() { int* p1 NULL; int* p2 0; // …… }NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。不论采取何 种定义在使用空值的指针时都不可避免的会遇到一些麻烦比如 void f(int) {coutf(int)endl; } void f(int*) {coutf(int*)endl; } int main() {f(0);f(NULL);f((int*)NULL);return 0; } 程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的 初衷相悖。 在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器 默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void *)0。                                            注意 1. 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入 的。 2. 在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 3. 为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。
http://www.zqtcl.cn/news/497910/

相关文章:

  • 响应式网站制作流程全国城建培训中心官网查询证书
  • 北京工程建设信息网站中国市场网
  • xml做网站源码免费网站是
  • 中国工商建设标准化协会网站织梦app网站模板
  • 怎么做好网络销售文大侠seo博客
  • wish网站应该怎么做网站建设前规划
  • 网站建设目的是什么建筑机械人才培训网官网
  • 建筑建设行业网站大型购物网站开发
  • 手机网站开发用什么设计之家网
  • 网站开发平台有哪些什么是网络开发
  • 学校网站前置审批网站做哪些比较有意思
  • 怎么给企业做网站学计算机网站建设
  • 网站关键词优化排名技巧aiyuan wordpress
  • 建设工程资质证书二维码扫描网站自己做的网站如何让qq登录
  • 网站域名有效期wordpress 特别慢
  • 建立个人网站服务器如何用dedecms做网站
  • php网站开发实市场推广策略 包括哪些
  • 合众商道网站开发可以投稿的写作网站
  • 北京贸易公司网站制作免费的查企业的网站
  • 网站建设报价表模板下载小程序怎么找出来
  • 网站制作简单协议wordpress快速建站教程视频教程
  • 杭州做网站价格北京企业响应式网站建设
  • 30个成功的电子商务网站设计中企动力 网站报价
  • php 网站开发 视频百度seo排名查询
  • 网站开发代码wordpress提示安装
  • 网站推广的策略高端网球拍
  • 广东知名网站建设wordpress 用户量
  • asp源代码网站网络架构图是什么
  • 专业做淘宝网站公司吗苏州网站制作开发
  • 电商网站模板html安阳历史