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

黄金网站下载免费冷水滩网站建设

黄金网站下载免费,冷水滩网站建设,四川做网站的公司,枣庄手机网站建设公司. 个人主页#xff1a;晓风飞 专栏#xff1a;数据结构|Linux|C语言 路漫漫其修远兮#xff0c;吾将上下而求索 文章目录 C输入输出cout 和cin 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺… . 个人主页晓风飞 专栏数据结构|Linux|C语言 路漫漫其修远兮吾将上下而求索 文章目录 C输入输出cout 和cin 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺序不同本质还是类型不同 C支持函数重载的原理--名字修饰(name ManglingLinux编译器的命名规则 引用引用概念引用特性引用的作用1.作为参数(输出型参数)2. 做返回值2.对象比较大,减少拷贝提高效率 指针和引用的区别 C输入输出 cout 和cin 这里的c意思是console把数据out到console控制台中去,而最后面的endl其实等价与\n,就是换行 同样的道理cin把数据in到console控制台也就是输入数据到控制台中。 1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件 以及按命名空间使用方法使用std。 2. cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。 3. 是流插入运算符是流提取运算符。 4. 使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。 C的输入输出可以自动识别变量类型。 5. 实际上cout和cin分别是ostream和istream类型的对象和也涉及运算符重载等知识缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。 全缺省 #includeiostream using namespace::std;void Func(int a 10 , int b 20 , int c 30) {cout a: a endl;cout b: b endl;cout c: c endl endl; }int main() { // 没有传参时使用参数的默认值 // 传参时使用指定的实参Func(1,2,3);Func(1,2);Func(1);Func();return 0; }那么可不可以隔着一个数传参呢答案是不能 半缺省 半缺省参数必须从右往左依次来给出不能间隔着给缺省参数不能在函数声明和定义中同时出现 #includeiostream using namespace::std;//半缺省参数从右往左依次给出 //半缺省参数不是缺少一半而是有缺少就是半缺省 void Func(int a , int b 20 , int c 30) {cout a: a endl;cout b: b endl;cout c: c endl endl; }int main() {Func(1,2,3);Func(1,2);Func(1);return 0; }应用场景 假如我有一个栈但是不知道要插入多少数据目前栈的空间是固定的怎么解决数据的容量问题? struct stack {int* a;int size;int capacity; };void stackInit(stack* ps) {//容量固定ps-a (int*)malloc(sizeof(int) * 4); }void StackPush(stack* ps,int x) { }int main() {//不知道要插入多少个数据 }用半缺省参数就可以很好的解决这个问题 声明和定义分离的情况 在声明和定义分离的情况下那么是在声明处缺省还是在定义处缺省呢? //stack.h头文件下的定义 void stackInit(struct stack* ps, int n 4);//stack.cpp下的声明 void stackInit(struct stack* ps, int n) {ps-a (int*)malloc(sizeof(int) * n); } 应该在头文件下的定义处缺省因为在运行时要包含的是头文件程序在编译的时候会展开头文件这时候就可以进行缺省调用。而且在声明处还可以判断语法是否正确 如果在定义处缺省那么在第3个情况下就会出现参数太少的报错情况达不到缺省。 如果声名与定义位置同时出现缺省恰巧两个位置提供的值不同那编译器就无法确定到底该用那个缺省值。出现重定义报错 函数重载 c语言不允许同名函数 c可以要求函数名可以相同但是参数不同构成函数重载 并且会对数据类型自动匹配。 1.参数的类型不同 2.参数的个数不同 3.参数的顺序不同本质还是类型不同 c语言不支持重载链接时直接用函数名去找地址有同名函数区分不开。 那么C是怎么支持的呢? C支持函数重载的原理–名字修饰(name Mangling 函数名修饰规则名字中引入参数类型各个编译器自己实现了一套 Linux编译器的命名规则 因为Linux的规则比较简单我们先理解一下Linux编译器的规则 解释如果是Add这样的前面就是_Z3,f就是_Z1后面就都是加上函数名字和数据类型的首字母 正是用类似这样的规则给函数修饰名字只要参数不同修饰出来的名字就不一样就支持了重载。这样链接的时候用这样的名字就可以找到对应的函数地址 引用 引用概念 引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间。 比如李逵在家称为铁牛江湖上人称黑旋风。 int main() {int a 0;//引用b就是a的别名int b a;cout a endl;cout b endl;return 0; } 注意引用类型必须和引用实体是同种类型的 引用特性 引用在定义时必须初始化 一个变量可以有多个引用 引用一旦引用一个实体再不能引用其他实体 4.引用不能改变指向 引用的作用 1.作为参数(输出型参数) //指针传参 void Swap(int* a, int* b) {int tmp;tmp *a;*a *b;*b tmp; }//引用传参 void Swap(int a , int b) {int tmp;tmp a;a b;b tmp; }int main() {int x 0, y 1;Swap(x, y);cout x x endl;cout y y endl;Swap(x, y);cout x x endl;cout y y endl; }这里a相当于x的别名y相当于b typedef struct Node {struct Node* next;struct Node* prev; }LNode,*Pnode;void PushBack(Pnode phead, int x);void PushBack(struct LNode** phead, int x); void PushBack(struct LNode* phead, int x);int main() {Pnode plist NULL;return 0; }这里*pnode 相当于struct Node*,Node相当于struct Node 2. 做返回值 int func() {int a 0;return a; }int main() {int ret func();return 0; } 这段代码意味着返回a别名但是由于栈帧销毁会造成野引用这里的值是不确定的取决于编译器,以及是否清内存。 可以看到这里随便调用了一个函数就导致结果变化因为fx和func相同空间重复使用所以在原来销毁的a的位置创建了b所以导致输出来的值又a的6变成了b的1。 小结 返回变量出了函数作用域生命周期就到了要销毁局部变量不能引用返回 那么怎么使用引用返回呢 int func() {static int a 6;return a; }int main() {int ret func();cout ret endl;return 0; }这里加上一个static就可以。 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; }#includeiostream using namespace std; #includeassert.hstruct SeqList {//成员变量int* a;int size;int cacpcity;//成员函数void Init(){a (int*)malloc(sizeof(int) * 4);size 0;cacpcity 4;}void PushBack(int x){//... 扩容a[size] x;}//临时变量有常性//读写返回变量int Get(int pos){assert(pos 0);assert(pos size);return a[pos];}};int main() {SeqList s;s.Init();s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);for (int i 0; i s.size; i){cout s.Get(i) ;}cout endl;for (int i 0; i s.size; i){if (s.Get(i) % 2 0){s.Get(i) * 2;}}cout endl;for (int i 0; i s.size; i){cout s.Get(i) ;}}2.对象比较大,减少拷贝提高效率 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。这些效果指针也可以但是引用效率更高 #includeiostream using namespace std; #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; }指针和引用的区别
http://www.w-s-a.com/news/243319/

相关文章:

  • 网站建设培训学校北京如何搜索网站
  • discuz论坛模板哪些网站容易做seo优化
  • 渭南公司做网站网站建设互联网推广
  • 公司网站app怎么做杭州建设局网站
  • 网站开发需要自己写代码吗12306网站多少钱做的
  • 策勒网站建设四川建设网有限责任公司招聘
  • 网站建设哪里有学网页界面设计论文
  • 怎么做外贸网站推广劳务公司网站怎么做
  • 滴答手表网站中铁建设集团有限公司招聘信息2021
  • 重庆富通科技有限公司网站新闻头条最新消息国家大事
  • 四字母net做网站怎么样企业代运营公司
  • 纪检网站建设方案wordpress首页静态页面
  • 网站右下角浮动效果如何做网站logo设计在线生成
  • 西宁哪里做网站婚纱摄影网站设计思路
  • 凡科用模板做网站网站导入页欣赏
  • 北京响应式网站建设公司十大小程序开发公司
  • dw网站开发删除wordpress主题底部
  • 织梦网站怎样做子域名高德导航怎么看街景地图
  • 宿州专业网站建设株洲网站建设优化
  • 自动生成海报的网站常州建网站公司
  • 网站刷流量对网站有影响吗站长工具欧美高清
  • 百度做网站优化多少钱一年罗庄网站建设
  • 手机网站 自适应屏幕h5网站有哪些
  • 北京企业建站技术临沂网站公众号建设
  • 域名和网站备案一样吗wordpress 封装 app
  • 婚纱摄影网站开题报告c2c模式是什么意思
  • 网站几种颜色wordpress水平菜单
  • php做网站的分站wordpress边下边看
  • 杭州建设实名制报备网站Wordpress外贸网站搭建公司
  • 山西云起时网站建设计算机网站开发实现总结