函数声明

C++模板之函数模板实例化和具体化

蹲街弑〆低调 提交于 2020-01-06 19:00:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 模板声明 template<typename/class T>, typename比class最近后添加到C++标准。 常规模板,具体化模板,非模板函数的优先调用顺序。 非模板函数(普通函数)> 具体化模板函数 > 常规模板 显示具体化: 具体化表示为某一特定的类型重写函数模板,声明的含义是使用独立的,专门的函数定义显示地为 特定类型生成函数定义。 为什么要有显示具体化? 处理模板函数所不能处理的特殊情况。显式具体化显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不同的具体化函数。 显示具体化声明在关键字template后包含<>. 如: template<> void swap<job>(job &j1, job &j2); vs2013不支持: void swap(Any &a, Any &b); struct job { char name[40]; double salary; int floor; }; template<> void swap<job>(job &j1, job &j2); void Show(job &j); int main(){ using namespace std; template void swap<job>(job &,

C#语法——委托,架构的血液

不问归期 提交于 2020-01-06 18:18:30
本篇文章主要介绍委托的应用。 委托是大家最常见的语法了,但会用与精通之间的差别是巨大的。 一个程序员如果不能精通委托,那么,他永远无法成为高级程序员。 所以,让我们把委托刻到血液里吧。 这样,你才能称为[Developer]。 委托的定义 什么是委托? 委托实际上是一种类型,是一种引用类型。 微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样。都是声明用的。 下面先看下声明代码,这里声明了两个委托。 1 2 public delegate void TestDelegate(string message); public delegate int TestDelegate(MyType m, long num); delegate既然是关键字,和int,string一样,那么,为什么delegate后又跟了一个void或者int呢? 如果他们是同等地位的关键字,为什么可以一起使用呢? 很简单,我们把delegate后面的 【void TestDelegate(string message)】理解为一个变量,是不是就清晰明了了一些。 我们把delegate关键字理解为,是用来专门来定义这种复杂的变量的。而这种复杂的变量可以包含一个返回值和任意数目任意类型的传入参数。 有没有感觉,这个复杂的变量特别像一个函数的定义。 没错,官方定义

什么时候可以使用前向声明?

你离开我真会死。 提交于 2020-01-06 16:43:31
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我正在寻找何时允许在另一个类的头文件中对一个类进行前向声明的定义: 我是否可以针对基类,作为成员持有的类,通过引用传递给成员函数的类等进行此操作? #1楼 Lakos 区分类用法 仅名称中 (对于此声明,前向声明已足够)和 in-size (需要为其定义类)。 我从未见过它的发音更简洁:) #2楼 我将其作为一个单独的答案而不是仅仅作为评论,是因为我不同意Luc Touraille的回答,这不是基于合法性,而是基于强大的软件和错误解释的危险。 具体来说,我对您的界面用户希望了解的隐含合同有疑问。 如果您要返回或接受引用类型,那么您只是说它们可以通过指针或引用传递,而这些指针或引用又只能通过前向声明来知道。 当您返回不完整的类型时, X f2(); 那么您说您的呼叫者 必须 具有X的完整类型规范。他们需要它才能在呼叫站点创建LHS或临时对象。 同样,如果您接受不完整的类型,则调用者必须构造了作为参数的对象。 即使该对象作为另一个不完整类型从函数中返回,调用站点也需要完整的声明。 即: class X; // forward for two legal declarations X returnsX(); void XAcceptor(X); XAcepptor( returnsX() ); // X

vector容器的用法

强颜欢笑 提交于 2020-01-05 05:28:00
转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。 (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; (6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; (7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小:vec.size(); (9)清空:vec.clear(); 2 vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码: #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace

C++学习笔记5

三世轮回 提交于 2020-01-05 04:44:33
1.友元   1.定义为谁友元,就在谁的类中用关键字friend声明其要定义的友元。   2.一些函数不是类的一部分,但又频繁访问类的数据成员,此时可定义为友元函数,也可定义友元类。   3.友元只能发生在异类之间,同类之间无隐私。   4.作用:提高程序的运行效率,但破坏了类之间的封装和隐藏性,使得非成员函数可以访问类的私有成员   5.友元目的本质:不让其他不属于本类的成员,成为类的成员而具有本类成员的属性。   6.声明为谁的友元,就能通过其对象访问其私有成员【把a定义为b的友元,则可通过b的对象访问b的私有成员】   7.友元函数无this指针   8.注意事项:       1.友元关系不能被继承。       2.友元关系是单向的不具有交换性。【a是b的友元,b不是a的友元】       3.友元关系不具有传递性。【c是b的友元,b是a的友元,但c不是a的友元】 2.在定义友元函数时,用前向声明。   前向声明:是一种不完全声明,即只需提供类名(无需提供类实现)。但存在限制:       1.不能定义类的对象       2.可以用于定义指向这个类型的指针或引用       3.用于声明(不是定义)使用该类型,作为形参类型或函数返回类型。   友元函数的实现过程:     若将一个类(a)的函数声明为另一个类(b)的友元函数,则类a放在类b前面定义,且将类b进行前向声明

C/C++ 复习

末鹿安然 提交于 2020-01-05 04:23:10
本文总结一下C++面试时常遇到的问题。C++面试中,主要涉及的考点有 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, new, delete等等 语法问题 类型转换 指针以及指针和引用的区别 面向对象的相关问题,如虚函数机制等 泛型编程的相关问题,如模板和函数的区别等 内存管理,如字节对齐(内存对齐)、动态内存管理、内存泄漏等 编译和链接 实现函数和类 本文不涉及STL的内容,有关STL的内容,会另有一篇文章专门总结。 零、序章 0.1 C++与C的对比 C++有三种编程方式:过程性,面向对象,泛型编程。 C++函数符号由 函数名+参数类型 组成,C只有函数名。所以,C没有函数重载的概念。 C++ 在 C的基础上增加了封装、继承、多态的概念 C++增加了泛型编程 C++增加了异常处理,C没有异常处理 C++增加了bool型 C++允许无名的函数形参(如果这个形参没有被用到的话) C允许main函数调用自己 C++支持默认参数,C不支持 C语言中,局部变量必须在函数开头定义,不允许类似for(int a = 0; ;;)这种定义方法。 C++增加了引用 C允许变长数组,C++不允许 C中函数原型可选,C++中在调用之前必须声明函数原型 C++增加了STL标准模板库来支持数据结构和算法 一

《JavaScript 代码优化指南》

最后都变了- 提交于 2020-01-05 02:31:54
~~教你向老鸟一样敲代码~~。 1. 将脚本放在页面的底部 ... <script src="./jquery.min.js"></script> <script src="./index.js"></script> </body> </html> 2. 变量声明合并   将多条var语句合并为一条语句,我建议将未赋值的变量放在最后面。   并且为了代码的美观,还可以将等号对齐。 //糟糕 var oBtn = document.getElementById('button'); var name = ''; var index; var oLis = document.getElementsByTagName('li'); var result = [1,2,3,4]; var i; //建议 var oLis = document.getElementsByTagName('li'), oBtn = document.getElementById('button'), result = [1,2,3,4], name = '', index, j;    3. 减少全局变量   减少全局变量,并不是说不定义全局变量,而是我们可以定义一个对象,来保存我们定义的全局变量。   我称这个对象为变量空间。 //不推荐 var global = 'This is global

.c与.h文件的区别

谁都会走 提交于 2020-01-04 09:43:09
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段   2.词法与语法分析阶段    3 .编译阶段,首先 编译 成纯汇编语句,再将之 汇编 成跟CPU相关的二进制码,生成各个目标文件(.obj文件)    4.连接阶段, 将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件)    编译器在编译时是 以C文件为单位进行的 ,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译, 连接器是以目标文件为单位 ,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!!   (main .c文件 目标文件 可执行文件)   有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:   #include   #include “mytest.h”   int main(int

C语言指针与数组

亡梦爱人 提交于 2020-01-04 05:49:02
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指针和数组始终应该可以互换的呢? 因为对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境, 不幸的是,这只是数组的一种极为普通的用法,并非所用情况下都是如此。 2. 什么是声明,什么是定义 C语言中对象必须有且只有一个定义,但它可以有多个extern声明. 定义:只能出现在一个地方, 确定对象的类型并分配内存 ,用于创建新的对象,例如 int a[100] 声明:可以多次出现,描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里) 例如 extern int a[100] extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行 3. 数组与指针的区别 出现在赋值左边的符号被称为 左值, 出现在赋值右边的符号被称为 右值。 编译器为每个变量分配一个地址(左值),这个地址在编译时可知,并且该变量在运行时一直保存于这个地址中。 存储于变量中的值(右值)只有在运行时才可知,如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量并将它存于寄存器中。 例如: char a[9] = "abcdefgh"; c = a[i]

Web前端知识体系精简

北战南征 提交于 2020-01-04 00:07:49
Web前端技术由 html、css和 javascript 三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言。而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者很难理清楚整个体系的脉络结构。本文将对Web前端知识体系进行简单的梳理,对应的每个知识点点到为止,不作详细介绍。目的是帮助大家审查自己的知识结构是否完善,如有遗漏或不正确的地方,希望共勉。 一、JAVASCRIPT 篇 0、基础语法 Javascript 基础语法包括:变量声明、数据类型、函数、控制语句、内置对象等。 在ES5 中,变量声明有两种方式,分别是 var 和 function ,var 用于声明普通的变量,接收任意类型,function用于声明函数。另外,ES6 新增了 let、const、import 和 class 等四个命令,分别用以声明 普通变量、静态变量、模块 和 类 。 JS数据类型共有六种,分别是 String、Number、Boolean、Null、Undefined 和 Object 等, 另外,ES6新增了 Symbol 类型。其中,Object 是引用类型,其他的都是原始类型(Primitive Type)。 原始类型也称为基本类型或简单类型,因为其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈