ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

初始C++(二)

初始C++(二) 一.学习语法函数重载什么是函数重载呢--简单的说其实就是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()但是调⽤时会报错存在歧义编译器不知道调⽤谁 void f1() { cout f() endl; } void f1(int a 10) { cout f(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比较特殊的概念引用相当于给变量起别名编译器不会为引用变量开辟内存空间它和它引用的变量共用一块内存空间引用的使用类型引用别名 引用int main() { int a 5; int _a a; //这里_a就是a的引用 }这里_a 和a是一个地址引用的特性1.引用在定义是必须初始化2.一个变量可以有多个引用3.引用一但引用一个实体再也不能引用其他实体C规定在函数传参和返回值时如果是传值传参和传值返回。编译器会主动申请创建变量的引用再传到函数中或者再传到函数外。这个创建变量的引用会调用拷贝构造函数。(后面再讲)引用的使用1.引用在实践中的作用主要是用于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象同时改变被引用对象。2.引用传擦和指针传参功能是类似的引用传参相对更方便一些3.引用做返回值情况复杂。4.引用和指针在实践中是相辅相成的各有特点功能有重叠性互相不能替代。其实在编译器层面上引用和指针生成的指令是一样的我们在使用时要特别关注引用是变量别名指针需要解引用才能访问变量。const引用在c中把常量(类似 1 2)他的数据类型是const int,--不能修改的int型变量1.可以引用一个const对象但是必须加上const引用const引用也可以引用普通对象但const限制后不能修改对象内容---对象的访问权限只能缩小不能放大int _a a*3; double d 12.3; int _d d;//这里有类型转换2.上述代码的a*3,和类型转换都会产生一个临时变量存储中间值也就是说_a和_b都是临时对象的声明而C规定临时变量有常性这里权限放大了。要使用常引用3.所谓的临时变量其实就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象C中把这个对象称为临时对象指针和引用的关系1.语法上说引用是一个变量的别名没有开空间指针是存储了变量的地址需要开空间2.在汇编语言上引用的定义和指针的定义是一样的3.引用在使用时必须要进行初始化且一旦初始化之后不能在修改引用对象指针不同可以改变存储的地址4.引用可以直接访问对象指针需要解引用5.sizeof()不一样--如果是引用其结果是引用类型的大小如果是指针其结果是存储地址的字节数6.引用很少有空引用指针常出现这个问题incline函数incline函数修饰的函数叫内联函数编译时c编译器会在调用的地方展开内联函数这样内敛函数不需要创建栈帧提高了效率C设计这个incline是为了替代宏函数(#define 返回类型函数名a,b((a)(b)))incline函数是对于编译器是一个建议incline不支持声明和定义分开。nullptr在c语言中NULL是一个宏可以看到代码#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endifC中把NULL定义为0在C语言中NULL既能做0也能当无类型指针(void*)的常量。但是我们c如果继续延用这一NULL我们写一个函数重载的时候两个函数名相同我们都去传NULL这个变量编译器会调用参数是int的函数还是调用参数是指针的呢为了解决这一问题C规定NULL只能是0nullptr当成指针nullptr是一种特殊类型的字面量它可以转换成任意其他类型的指针类型。使用nullptr定义空指针可以避免转换的问题因为nullptr只能隐式的转换为指针类型而不能转换成证书类型#includeiostream using namespace std; void f(int x) { cout f(int x) endl; } void f(int* ptr) { cout f(int* ptr) endl; } int main() { f(0); // 本想通过f(NULL)调⽤指针版本的f(int*)函数但是由于NULL被定义成0调⽤了f(int x)因此与程序的初衷相悖。 f(NULL); f((int*)NULL); // 编译报错error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 // f((void*)NULL); f(nullptr); return 0; }
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表