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

郑州整站网站推广工具怎么做网站数据库备份

郑州整站网站推广工具,怎么做网站数据库备份,seo查询系统源码,做30个精品网站函数重载 函数重载#xff1a;是函数的一种特殊情况#xff0c;C允许在同一作用域中声明几个功能类似的同名函数#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…函数重载 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x, int y) {cout int add(int x ,int y) endl;return x y; }double add(double x, double y) {cout double add(double x,double y) endl;return x y; }//参数个数不同void func() {cout func() endl;} void func(int x) {cout func(int x) endl; }//参数顺序不同void f(int x, char y) {cout f(int x,char y) endl; }void f(char y, int x) {cout f(char y,int x) endl; } int main() {add(1, 2);add(1.1, 1.2);func();func(2);f(1, 1.2);f(1.2, 1);return 0; } 函数运行结果 值得注意的是函数重载的定义是在同一个定义域里面的如果在不同的作用域里面的话就不算是函数的重载,下面的就不算是函数的重载 namespace LH {int add(int x, int y){ cout int add(int x ,int y) endl;return x y;} }double add(double x, double y) {cout double add(double x,double y) endl;return x y; } 函数重载的一些注意事项 1.不同作用域里面的函数可以一样 namespace LH1 {void add(){cout LH1::add() endl;} } namespace LH2 {void add(){cout LH2::add() endl;} }//using namespace LH1 //using namespace LH2 //加上这两句话在调用函数的时候虽然会冲突但是依然不影响他们是重载的关系 int main() {LH1::add();LH2::add();return 0; } 当函数是缺省参数的时候 //这两个函数虽然是重载函数但是在调用的时候也会冲突 void f() {cout f() endl; }void f(int a 10) {cout f(int a) endl; } C支持重载C语言不支持 在C语言当中是不支持重载的但是在C中是支持重载的 这涉及到编译链接的过程下面用一个图来解释 在上面的test.o文件里面包含的有Add.h里面的东西也就是函数的申名在链接的过程中有了函数的申明编译器会找函数的定义也就是在.CPP文件去找函数的地址这里函数的地址实际上就是函数的语句 由于C语言和C找函数的方式不同 C语言用的是函数名去找而C是用被修饰的函数名字去找也就是包含函数里面的参数C语言用函数的名字去找有多个函数名就会报错但是C不会 引用 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体再不能引用其他实体 引用实际上就是给变量取别名对别名进行操作也会引起自身的变化 int main() {//整形变量的别名int a10;intba; //给a取一个别名相当于给a取一个外号//指针变量的别名int x 0;int* p1 x;int* p2 p1;retrun 0;} 权限的平移缩小放大 // 权限的平移可以 int x 0; int y x; y; //权限的缩小可以 int x0; const int z x; z; // 不可以// 权限的方法// m只读// n变成我的别名n的权限是可读可写// 权限的放大不可以const int m 0;// int n m;const int n m;// 可以不是权限的放大// m拷贝的给pp的修改不影响mint p m;// 权限的放大// p1可以修改 *p1不可以const修饰是的*p1const int* p1 m;// p1;// int* p2 p1;const int* p2 p1;// 权限的缩小int* p3 x;const int* p4 p3; 引用作为函数参数 引用也可作为函数参数来代替指针的一些操作形参是实参的引用 void Swap(int x, int y) {int temp x;x y;y temp; }int main() {int a 10;int b 20;Swap(a, b);cout a a endl;cout b b endl;return 0; } 输出结果 传值和传引用效率的比较 值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直 接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效 率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 #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; }int main() {TestRefAndValue();return 0; } 运行结果 通过上述代码的比较发现传值和指针在作为传参以及返回值类型上效率相差很大  引用和指针的区别 语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。 int main() {int a 10;int ra a;cout a a endl;cout ra ra endl;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. 引用比指针使用起来相对更安全  内联函数 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率 上面的call是调用函数地址的意思 内联函数的特性  1. inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。 2. inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性 3. inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到 // 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关键字 auto关键字是根据等式左边的数据类型来确定变量的类型的 auto a1;  //右边是整形左边自动得出a是整形变量 这个关键字现阶段还没有什么意义但是等到等式右边的变量是一个很长的类型的时候就会很有意义 std::mapstd::string, std::string m{ { apple, 苹果 }, { orange, 橙子 },  {pear,梨} }; //std::mapstd::string, std::string::iterator it m.begin();  //换成下面的这个 auto itm.begin(); std::mapstd::string, std::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; } 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替换为变量实际的类型。 auto的使用细则 1. auto与指针和引用结合起来使用 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须 加 int x 10;   auto a x;   auto* b x;    //如果有*右边必须是一个指针变量   auto c x; 在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。 void TestAuto() {   auto a 1, b 2;   auto c 3, d 4.0;  // 该行代码会编译失败因为c和d的初始化表达式类型不同 }   auto不能推导的场景  1auto不能作为函数的参数 // 此处代码编译失败auto不能作为形参类型因为编译器无法对a的实际类型进行推导 void TestAuto(auto a) {} auto不能直接用来声明数组 void TestAuto() {   int a[] {1,2,3};   auto b[] {456}; } 遍历数组 auto还可以用来遍历数组范围for oid TestFor() { int array[] { 1, 2, 3, 4, 5 }; for(auto e : array) //不加是不会改变数组里面的值的e * 2; for(auto e : array)cout e ; return 0; } void TestFor(int array[]) {for(auto e : array)cout e endl; } 范围for的使用条件 1. for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供 begin和end的方法begin和end就是for循环迭代的范围。 注意以下代码就有问题因为for的范围不确定 void TestFor(int array[]) {   for(auto e : array)     cout e endl; } 空指针 在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现 不可预料的错误比如未初始化的指针。如果一个指针没有合法的指向我们基本都是按照如下 方式对其进行初始化  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.dnsts.com.cn/news/18306.html

相关文章:

  • 网站开发常遇到的问题有哪些昆明企业为什么要做网站
  • 西安学校部门定制网站建设公司网页设计与制作难不难
  • 怎样制作表白网站短视频代运营方案模板
  • 戴南网站建设市场调研分析报告怎么写
  • .net 获取网站域名网站后台风格
  • 关于建设部门子网站的请示天津建设工程信息网中标公告
  • 机械设计网站推荐怎么做网站首页弹幕
  • 网站变移动网站浏览器大全下载
  • 湖北做网站哪个在家做兼职网站比较好
  • 个人网站名称创意大全登陆wordpress
  • 中网建站湖南 中小企业 网站建设
  • 温州做网店的网站新变更营业执照注册号查了发现之前有备案过网站了
  • 北京微网站制作微商城网站制作
  • 百度如何验证网站网站建设一年多少
  • 网站内容的排版布局acm网站免费做
  • 陕西天工建设有限公司官方网站做擦边球网站
  • 家禽养殖公司网站怎么做烟台快速建站有哪些公司
  • 大腕 网站建设黄骅怎么样
  • 国际域名网站网站分类目录大全
  • nas 做网站服务器wordpress首页优化
  • mq网站开发html5做网站系统
  • 提供网站建设框架公司网站百度推广
  • 网站改名 seo我是做网站的 怎么才能提高业绩
  • 客户案例 网站建设网络规划设计师教程第三版云盘下载
  • 大型网站建设公司排名设计软件ai
  • 中铁建设集团有限公司招标seo搜索优化推广
  • 在企业网站建设的解决方案中17模板网站
  • 懒人学做网站大数据营销案例有哪些
  • 怎么做一个免费网站网站正在建设中html5
  • 宜昌网站网站建设成功企业vi设计案例