5、函数
来源:互联网 发布:视频综合管理平台软件 编辑:程序博客网 时间:2024/06/14 15:21
1、局部静态变量,只初始化一次,程序终止才销毁
static int a = 1;
2、如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝给形参。C++建议使用引用类型的形参代替指针。如果函数无需改变引用形参的值,最好将其声明为常量引用。
//即(int &)i,引用对象i void reset(int &i){ i = 0;}int j;reset(j);//则j = 0//比较两个字符串长度,采取引用//调用的时候会定义(const string &)s1 = 实参字符串bool isShorter(const string &s1, const string &s2)//引用两个常类型字符串{ return s1.size() < s2.size();}
3、不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。
int i =42;const int &r = i; //初始化绑定,但是不能修改i的值 //非const可以传递给const,只是不能修改int &r3 = r; // 错误!!非const不能绑定const类型
4、数组以指针的形式传递给函数,一开始不知道切确的尺寸,调用者应该提供一些额外的信息。
数组的大小类型为size_t;
void print(const int *beg, const int *end){ while(beg != end) cout << *beg++ << endl;}int a[4] = {0, 1, 2, 3};print(begin(a), end(a));
//(&a)这是一个引用,该引用指向10int的数组void f(int (&a)[10]){}
5、main
//第一个参数argc存命令行传入的字符串数量;二维数组(字符串数组)存每个字符串(命令行传入的具体字符串),一般argv[0]为程序名字,不需要用户传入。int main(int argc, char *argv[]){ ....}
6、含有可变形参的函数
initializer_list类型类似于vector,initializer_list是一种库类型,参数数量可变,类型必须相同,对象中的元素永远是常量值。
void error_msg(initializer_list<string> il){ for(auto beg = il.begin(); beg != il.end(); ++beg) cout << *beg << ""; cout << endl;}string expected = "1234";string actual = "abcdefg";if(expected != actual) error_msg({"functionX", expected, actual});else error_msg({"functionX", "okay"});
6、函数返回
不要返回局部对象的引用和指针
//返回类型为引用(const string &)const string &mapip(){ string ret; if(!ret.empty()) return ret; //错!!,调用时相等于绑定const string &x =ret,那么就是返回局部变量的引用 else return "Empty";//错!!返回了局部临时变量,函数调用完会回收}
尾式返回
//func函数返回一个指针,该指针指向10整数的数组// -> int(*)[10]表示返回类型auto func(int i) -> int(*)[10];
7、函数重载:几个函数名字相同,参数列表不同。
(1)单独返回类型不同不行
(2)顶层const(const执行对象非其指针)不行,底层const可以,即const指针和引用是可以区分的
(3)C++中名字查找发生在类型检测之前
8、默认实参:用户调用时不指定值,则使用默认值
typedef string::size_type sz;string screen(sz ht = 24; sz wid = 80; char backgrnd = ' ');
9、内连函数:在函数前面加上inline,避免函数调用开销
10、constexpr函数:用于常量表达式,规定:返回值及所有形参类型都必须是字面量。编译器会把constexpr函数隐式转化为内连函数。
constexpr int new_sz() { return 42;}
11、调试,预处理宏assert(),定义NDEBUG则关闭该功能,头文件cassert, 预处理命令不需要使用using声明
assert(表达式),如果表达式为假(0),则输出信息并,停止程序__func__//函数名__FILE__//文件名__LINE__//行号__TIME__//编译时间__DATA__//编译日期
12、函数指针
int func(const string &a){ ......}int (*f)(const string &);//下面2句等价f = func;f = &func;//下面调用函数等价f("hello");(*f)("hello");func("hello");
//下面2句等价//*f1(int),f1返回一个指针;int (*xx)(int *, int);该指针指向函数int (*f1(int))(int *, int);auto f1(int) -> int (*)(int *, int);
13、为解决不同源文件中同名函数或变量的问题(引用其他文件变量要加extern,引用函数不需要),C++引入命名空间。命名空间给一组全局程序实体的定义取一个名字,使之构成一个作用域。
- file.h
namespace A{ extern int x; void f(); void g();}
- file.cpp
namespace A{ int x = 1; void f() { ....... } void g() { ....... }}
- main.cpp
#include "file.h"void main(){ A::f();}
- 5 - 函数
- 5、函数
- C++基础5:函数和函数指针
- Creo二次开发--函数(5)--字符串类函数
- C++虚函数(5) - 虚析构函数
- 5函数式编程---高阶函数
- 5函数式编程---返回函数
- 5函数式编程---匿名函数
- oracle--常用函数5--转换函数
- PHP函数大全(5)
- 函数详解(5)
- 5、AddDataSeries函数
- 第5章 函数
- java常用函数(5)
- 11.1.5 socketpair()函数
- ACM内部函数5
- 第5章 函数
- STL(5)find_first_of函数
- HDU 2955
- databinding的一些坑
- wifi 基础
- java poi 解析excel数据
- 存储过程
- 5、函数
- 合并表记录
- TLS/SSL 协议详解(6) SSL 数字证书的一些细节1
- 商品SKU选择实现
- UVA 167
- 1136:矩阵转置
- 倍增法
- 5分钟搞定android混淆
- 点击div显示 文件选择框