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

dart 网站开发河北网站设计成功柚米科技

dart 网站开发,河北网站设计成功柚米科技,互联网软件开发是什么工作,个人模板图片心中若有桃花源 何处不是水云间 目录 命名空间 #x1f49e;命名空间的定义 #x1f49e; 命名空间的使用 输入输出流 缺省参数 函数的引用 引用的定义#x1f49e; 引用的表示#x1f49e; 引用的特性#x1f49e; 常量引用#x1f49e; 引用的使用场景 做参数 做返回值… 心中若有桃花源 何处不是水云间 目录 命名空间 命名空间的定义  命名空间的使用 输入输出流  缺省参数 函数的引用 引用的定义 引用的表示  引用的特性  常量引用 引用的使用场景  做参数 做返回值  ⭐传值、传引用效率比较  ⭐引用和指针的区别 命名空间 ✨在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。 举个栗子我想输出全局变量 rand 的值 #includestdlib.h #includestdio.hint rand 1;int main() {printf(%d\n, rand); } 我们发现 rand 重定义了因为 #includestdio.h 内有以 rand 命名的函数如果是以前我们为了解决这个问题还要憋屈的去改变量名而现在 C 中的 命名空间 就可以很好的解决问题。 使用命名空间的目的是对标识符的名称进行本地化 以避免命名冲突或名字污染 命名空间的定义 ⭐namespace是命名空间的关键字Df是命名空间的名字一个命名空间就定义了一个新的作用域命名空间中的所有内容都局限于该命名空间中 namespace Df {int rand 10; }⭐命名空间可以嵌套函数、结构体、另一个命名空间等 namespace N1 {int a;int b;int Add(int left, int right){return left right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}} } ⭐同一个工程中允许存在多个相同名称的命名空间编译器最后会合成同一个命名空间中 namespace N1 {int a;int b;int Add(int left, int right){return left right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}} }namespace N1 {int Mul(int left, int right){return left * right;} } 命名空间的使用 ✨1加命名空间名称及作用域限定符:: 是域限定符表示在该命名空间进行访问 namespace Df {int a 0; } int main() {printf(a %d\n,Df::a);system(pause); } ✨2使用 using 将命名空间中某个成员引入 namespace Df {int b 1; } using Df::b; int main() {printf(b %d\n, b);system(pause); } ✨3使用 using namespace 命名空间名称对该空间进行展开 namespace Df {int a 0;int b 1; } using namespace Df; int main() {printf(a %d\n, a);printf(b %d\n, b);system(pause); } 日常操作 c库为了防止命名冲突就把库里面的东西都定义在一个 std 的命名空间里所以要使用c库中的函数方法与上述三种方法一样 1加命名空间名称及作用域限定符 #includeiostream int main() {std::cout Hello world ! std::endl;return 0; } 2使用 using 将命名空间中某个成员引入 using std::cout; using std::endl; cout Hello world ! endl; 3对全部命名空间进行展 using namespace std; cout Hello world ! endl; 一些小细节 1编译默认查找顺序当前局部域、全局域、命名空间中查找 举个栗子 如果把对变量的查找比作在地里采菜那么命名空间就是一个访问权限问题 局部域自己家的地全局域外面的野地命名空间隔壁王叔叔家的地 假如某天家里缺辣椒了自家地里没有那就要去外面的野地去查找若还是没有就看看隔壁王叔叔家的地有没有如果有也不能随便采摘因为没有经过王叔叔的同意有权限后才可以采摘域限定符进行申请访问。 2对全部命名空间进行展开 using namespace std (大型项目不宜使用避免命名冲突) 输入输出流 cout 标准输出流 和 cin 标准输入流包含于 #includeiostream 头文件中 ️  是流插入与 cin 搭配使用是流输出与 cout 搭配使用️ 输入输出流可以自动识别变量类型不需要像 printf/scanf 输入输出时那样需要手动控制格式️ cout 和 cin 是全局的流对象endl 表示换行输出 #includeiostream using std::cout; using std::cin; using std::endl; int main() {int a;double b;cin a b;cout a b endl;return 0; } 缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值 在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参 #includeiostream using std::cout; using std::endl; void Fun(int a 10) {cout a endl; }int main(void) {Fun();//没有指定实参则采用缺省值Fun(314);return 0; } 缺省参数的类型 ️全缺省形参都是表达式 #includeiostream using std::cout; using std::endl; void Fun(int a 10,int b 20,int c 30) {cout a endl;cout b endl;cout c endl; } int main(void) {Fun(1);return 0; } 注意 1缺省参数不是要全部传完没有指定实参采用该形参的缺省值 2缺省值必须从左往右依次传不可以间隔 ️半缺省形参部分没有表达式 #includeiostream using std::cout; using std::endl; void Fun(int a,int b 20,int c 30) {cout a endl;cout b endl;cout c endl; } int main(void) {Fun(1);return 0; } 注意 1半缺省参数必须从右往左依次来给出不能间隔着给 void Fun(int a 10,int b 20,int c) {cout a endl;cout b endl;cout c endl; } int main(void) {Fun(1);return 0; } 因为第三个形参 c 不是表达式没有缺省值而我们实参传的数值是传给 a 的所以报错 2缺省参数不能在函数声明和定义中同时出现 #includeiostream using std::cout; using std::endl; void Fun(int a 10, int b 20, int c 30);int main() {Fun(1);return 0; }void Fun(int a 10, int b 20, int c 30) {cout a endl;cout b endl;cout c endl; } 函数的引用 引用的定义 引用不是新定义一个变量而是给已存在变量取了一个别名 编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间 引用的表示 ️类型 引用变量名(对象名) 引用实体 #includeiostream using std::cout; using std::endl; int main() {int a 10;int b a;cout a a endl;cout b b endl;cout a a endl;cout b b endl;return 0; } 因为 b 是给 a 取的别名我们可以看到 a 和 b 的值以及地址都是一样的 比如水浒传的李逵你叫黑旋风和铁牛他都会应这就是引用取别名 注意 引用类型必须和引用实体是同种类型的 引用的特性 1引用在定义时必须初始化 2一个变量可以有多个引用 #includeiostream using std::cout; using std::endl; int main() {int a 10;int b a;int c b;cout a endl b endl c;return 0; } 3引用一旦引用一个实体再不能引用其他实体 ️引用在定义时必须初始化️一个变量可以有多个引用️引用一旦引用一个实体再不能引用其他实体 常量引用 const int a 10;//int ra a; //该语句编译时会出错a为常量const int ra a;double b 3.14;//int rb b; //该语句编译时会出错类型不同double rb b;int c 10;const int rc c; 加了 const 该变量是不能修改的即成了一种常量可以理解为只读型 而没加 const 的可理解为可读可写型 const int a 10; int ra a; 对常量a进行引用那么我就可以通过引用ra去修改a的值权限放大了所以是不行的 int c 10; const int rc c;   对变量c进行引用并将c置为不可修改的常量权限的缩小所以是可行 const int a 10; const int ra a; 都是const加以修饰的同类型变量权限的平移是可行的 总结 1权限只能缩小不能放大放大就会报错 2权限放大和缩小只针对引用和指针 3使用引用传参函数内不改变参数尽量使用 const 引用传参 引用的使用场景  做参数 1还记得我们之前写过的两数交换的代码吗我们之前传的是指针我们可以用引用代替 #includeiostream using std::cout; using std::endl;void Swap(int n, int m) {int tmp n;n m;m tmp; } int main() {int a 10, b 20;Swap(a, b);cout a endl b endl;return 0; } 2还记得我们之前写过链表时传的二级指针吗今非昔比我们来干爆他 前期回顾单链表 typedef int SListDataType;typedef struct SList {SListDataType data;struct SList* next; }SL;void SListFront(SL** head, SListDataType x) {... }这是我们的第一种写法当初为啥要传二级指针呢 因为我们没有定义哨兵位头节点而我们又想改变我们的首节点假设我们传单指针SL*SL*是结构体指针类型这里是形参形参是实参的拷贝出了作用域就销毁而我们要想改变首节点则必须传地址所以我们要传二级指针 当然这是我们的一种写法用引用该如何写呢 void SListFront(SL* head, SListDataType x) {... }如果你觉得别扭可以将结构体指针的声明放在 typedef 中像这样 typedef int SListDataType;typedef struct SList {SListDataType data;struct SList* next; }SL*;void SListFront(SL head, SListDataType x) {... }这样是不是好看多了 做返回值 错误示范· #includeiostream using namespace std; int Count() {int n 10;return n; } int main() {int ret Count();cout ret ret endl;cout ret ret endl;return 0; } 让我们来分析分析以上打印的值都是 10 吗 我们发现我们打印的第二个 ret 竟然是随机值这是为什么呢 因为局部变量存储在系统的栈区出了定义域就会销毁 ️第一次打印原值是因为编译器在释放时会进行一次保留 Count 函数并不是直接返回 n 的 因为 Count 函数在调用结束后会销毁它所在的栈帧连同 n 会一起销毁所以编译器会先保存 n的值到一个寄存器中再销毁栈帧然后返回寄存器的值给 ret ️第二次出现乱码是因为赋值后寄存器的空间被编译器销毁 当我们用上面的代码返回的是 n 的引用时这就不安全了。因为返回的是 n 的引用不会创建临时空间给 n而是直接返回 n 。 但是返回之后 n 所在的函数栈帧会被销毁所以连同 n 一起销毁了但是此时 ret 是 n 这块已经不属于自己的空间的拷贝所以 ret 是违法 那我们想二次调用 n 该怎么办呢只要不销毁 n 就可以了我们可以给 n 开辟静态空间 正确写法 #includeiostream using namespace std; int Count() {static int n 10;return n; } int main() {int ret Count();cout ret ret endl;cout ret ret endl;return 0; } 此时 n 是被 static 修饰过的变量可以用引用进行返回了因为 n 是在静态区开辟的空间在内存的堆区而函数是在栈区开辟的空间所以不会被销毁。其次因为在堆区返回的时候就不需要借助寄存器的临时拷贝了。 ⭐局部变量用 static 修饰出作用域后不销毁可以传引用返回 ⭐没有用 static 修饰的局部变量出了作用域会被销毁栈必须用传值返回 ⭐引用作为函数的返回值时必须在定义函数时在函数名前 ⭐用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本寄存器 我们在举一个栗子~ #includeiostream using namespace std; 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; } 这里为什么输出的是 7 呢 就像我们学指针时遇到的野指针在我们 free 掉不用的空间后没有将指针置为NULL此时该指针还指向这块空间但是值却是随机的 因为 c 是在栈区在第一次调用Add时ret 为 3Add函数的栈桢销毁在第二次调用时Add函数的栈桢是相同的c 的位置覆盖为 7再次访问 ret 此时就为 7因此这里使用是不安全的 总结 如果函数返回时出了函数作用域如果返回对象还在则可以使用引用返回如果已经还给系统了则必须使用传值返回 ⭐传值、传引用效率比较 #include time.h #includeiostream using namespace std; 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; }int main() {TestReturnByRefOrValue();return 0; } 我们发现引用作为返回值类型大大提高了效率 原因以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 ⭐引用和指针的区别 ✨引用在语法概念上引用就是一个别名没有独立空间指针在底层实现上实际是有空间的 #includeiostream using namespace std; int main() {int a 10;//指针存储a的地址int* pa a;//b是a的引用int b a;return 0; } ✨ 没有NULL引用但有NULL指针 #includeiostream using namespace std; int main() {int* a NULL;int b a;return 0; }✨ 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数 #includeiostream using namespace std; int main() {double a 10;double* b a; //指针取地址cout sizeof(b) endl;double c a; //引用cout sizeof(c) endl;return 0; }✨ 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小 #includeiostream using namespace std; int main() {double a 10;double* b a; cout b endl;b;cout b endl;double c a; cout c endl;c;cout c endl;return 0; }总结  ️引用在语法概念上引用就是一个别名没有独立空间指针在底层实现上实际是有空间的️引用在定义时必须初始化指针没有要求️引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体️没有NULL引用但有NULL指针️在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数️引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小️有多级指针但是没有多级引用️访问实体方式不同指针需要显式解引用引用编译器自己处理️引用比指针使用起来相对更安全 先介绍到这里啦~ 有不对的地方请指出
http://www.tj-hxxt.cn/news/229042.html

相关文章:

  • 博罗做网站哪家强网站打开风险怎么解决
  • 网站标题如何修改老板电器分销系统
  • 合肥网站建设-中国互联做联轴器的网站
  • wordpress单页面网站怎么做济南网站建设方案详细
  • 怎么做网站的签约编辑银川网站建站公司
  • 网站开发推进计划表营销型网站的基础建设
  • 青岛建站方案注册公司选名字
  • 群辉nas怎么做网站重庆房地产新闻
  • zhon中国建设会计学会网站重庆地产网站建设方案
  • 高清免费素材网站荥阳seo推广
  • 杭州专业网站建设公司营销型网站建设一般要多少钱
  • 做跨国婚恋网站赚钱吗网站建设与管理专业就业方向
  • 在国税网站更换购票员怎么做提高
  • 网站建设 肥城建筑行业信息平台
  • 为什么做电商网站新网站怎么运营
  • 温州网站制作报价深圳seo网络推广公司
  • 公司网站建设费用记什么科目谷歌seo零基础教程
  • 网站建设高端网页设计做爰全过程网站
  • 网站注册免费永久drupal joomla wordpress 带后台管理
  • 水头哪里有做网站的工商个人营业执照注册官网
  • 丽水网站建设农业网站建设方案 ppt模板
  • 古典 网站 模板国产搜什么关键词最好看
  • 中国美院网站建设公司wordpress 搜索引索
  • 什么在56网站做推广宝塔做网站安全吗
  • 中国建设人才网信息网站网站打赏怎么做的
  • 建设网站虚拟主机是啥意思网站开发的几个步骤
  • 网站建设费用自建男生和男生男生做的漫画网站
  • 做平面免费接单网站做促销的网站
  • 大气宽屏企业网站源码苏州归巢网络科技有限公司
  • 网门网站下载地址网站建设专业知识应用