C++函数修饰符总结

转载请注明文章出处:https://tlanyan.me/cpp-functi…C++博大精深,而且不断拥抱新的变化。本文简要总结一下C++中函数的修饰符,其中部分在实际中极少用到。按修饰符的位置分为函数名前与函数名后两种,以下分别做介绍。函数名前返回值类型返回值类型是C++中定义函数的必备部分,这些修饰符包括void,(unsigned) int,bool等内置基本数据类型和自定义类型,也包括修饰返回值const关键字(如const int*),还包括C++11中新增的类型自动推导auto关键字。templatetemplate关键字声明函数是模板函数。virtualvirtual关键字声明函数是虚函数,可被子类覆盖。inlineinline关键字提示编译器应将函数内联。staticstatic修饰类的成员函数时指示函数是静态成员函数,不从属于具体对象;修饰单独的函数时,限定函数的可见范围为本文件内。externextern关键字声明一个定义在外部的函数explicitexplicit关键字在C++11新增,只用于构造函数,指定构造函数要显式定义,不能隐式转换。friendfriend关键字声明类的友元函数,在函数内可直接访问对象的私有或受保护成员及成员函数。constexprC++11中新增,指示函数返回常量表达式(可以简单理解为返回字面量)。函数名后置于函数名后的修饰符有两种,第一种使用等号(=),第二种直接修饰。使用等号此类较为简单,总共有三种:=0:只能用于虚函数,表示函数为纯虚函数。=default:C++11新增,只能用于编译器提供默认实现的特殊成员函数,指示使用默认实现。=delete:C++11新增,只能用于编译器提供默认实现的特殊成员函数,指示编译器应该删除该函数的默认实现。直接修饰种类繁多,本人已知的修饰符包括:const表示函数不会修改对象(或者说调用期间对象不变),注意不包括mutable修饰的成员变量,可参考本人之前文章:C++中的mutable和volatile。volatile类似于const修饰的函数,表示对象状态可能随时会改变;const修饰的函数内只能调用自身的const成员方法,同理volatile函数内也只能调用自身volatile成员函数。&C++11引入的功能,左值引用限定符,指示函数只能被左值对象调用。&&C++11引入,右值引用限定符,指示函数只能被右值调用。如果函数没有引用限定符修饰,左值和右值均可调用。一个引用限定例子: #include <iostream> struct S { void f() & { std::cout << “lvalue\n”; } void f() &&{ std::cout << “rvalue\n”; } }; int main(){ S s; s.f(); // 打印“ lvalue ” std::move(s).f(); // 打印“ rvalue ” S().f(); // 打印“ rvalue ” }overrideC++11引入的功能,声明成员函数覆盖父类的虚函数。声明为override后,子类声明时可不写virtual。finalC++11引入,指示函数是最终实现,子类不应当再定义或覆盖,可与override同时使用。noexceptC++11引入,修饰函数是否会抛出异常。throw指示函数抛出异常及类型,C++11起被废弃。总结本文简要概括的列出了C++定义函数的修饰符。需要注意的是,严格来说上述内容中并不全是修饰符,部分仅是语法结构。

February 3, 2019 · 1 min · jiezi

Javascript中的变量提升、函数提升及变量访问原则

1、变量提升什么是变量提升?在函数体内声明的变量,无论你是在函数的最底端还是中间声明的,那么都会把该变量的声明提升到函数的最顶端(相当于第一行),但是只是提升变量的声明,不会赋值。var num = 10;fun(); //输出结果为undefinedfunction fun(){ console.log(num); var num = 20;}/上面这个函数相当于: function fun(){ var num; console.log(num); num = 20; }/2、函数提升什么是函数提升?在JavaScript中以函数声明的方式创建的函数就跟用var创建的变量一样,它们的声明都会提前声明,这就使得我们在JavaScript中可以调用函数在前面,而声明函数在后面,这就是函数提升。func();function func(){ alert(“函数执行了!”);}/上面这段代码相当于:function func(){ alert(“函数执行了!”);}func();/3、函数与变量同名时的变量提升alert(fun); // 最终输出结果为:输出fun函数体function fun(){ alert(“我是一个函数”);}var fun = “我是一个变量”;alert(fun); // 输出:我是一个变量/* 为什么第一个alert输出的是fun函数体,而第二个alert输出的是“我是一个变量”?因为用var声明的变量及function声明的函数在执行前都会将声明提升到最前面,如果变量与函数同名,那么在声明的时候会忽略变量,只提升函数声明! *//上面这段代码相当于:function fun(){ alert(“我是一个函数”);}alert(fun);fun = “我是一个变量”;alert(fun);/4、变量搜索原则(变量访问原则)在JavaScript中变量的访问(搜索)是有原则的:1)、首先在访问变量的作用域(函数)中查找该变量,如果找到直接使用2)、如果没有找到,去上一级作用域中查找,如果找到直接使用3)、如果还是没有找到,则再去上一级作用域中查找,知道全局作用域4)、如果找到了就直接使用,如果没有找到则报错var num = 123;function foo1(){ function foo2(){ console.log(num); } /当调用foo2时,会首先去foo2这个作用域中查找是否有num变量,结果没找到则去上一级作用域(即foo1)中查找是否有foo1变量, 结果还 是没找到,则再去上一级作用域(全局作用域)中查找,结果找到了,则拿来使用/ foo2();}5、变量提升、变量搜索机制经典面试题fun();console.log(b);console.log(c);console.log(a);functoin fun(){ var a = b = c = 9; console.log(a); console.log(b); console.log(c);}

January 4, 2019 · 1 min · jiezi