实例代码:
#include <iostream>
using namespace std;
void func123(int, int);//函数声明(函数原型)
void func123(int a, int) { //函数定义
return;
}
//auto: 变量自动类型推断
auto func234(int a, int b) -> void;//函数声明
auto func234(int a, int b) -> void {//函数定义
return;
}
inline int myfunc(int testv) { //函数定义前加inline, 这个普通函数就变成了内联函数。
return 1;
}
constexpr int mf() {
//这个函数要写的特别简单
return 1;
}
int &myfunc1() {
int tmpvalue = 9;
cout << &tmpvalue << endl;
return tmpvalue; //这种写法是一个很大的隐患
}
struct student { int num; }; //定义一个结构
void fs(student& stu) {
stu.num = 1010;
}
int main() {
//一:函数回顾与后置返回类型
//函数声明(函数原型),可以只有形参类型,没有形参名。
//函数定义中,形参如果在函数体内用不到的话,可以不给形参变量名字,只给其类型。如下 第二个参数。
//把函数返回类型放到函数名字之前,这种写法,叫前置返回类型。
func123(12, 13);
//C++ 11中,新添加了 后置返回类型,就是再函数声明和定义中,把返回类型写在参数列表之后。
// 前面放auto,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过 -> 开始的。
func234(11, 22);
//二: 内联函数
// 在函数定义前增加了关键字 inline,导致该函数变成内联函数。
// 引入内联函数的原因: 调用函数需要消耗一定资源,这在经常调用一些很小函数体的函数时不划算,所以定义成内联(inline函数)
//(1). inline 影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本体。通过这种方式,来提升性能
int a = myfunc(5); // int a = 1;
//(2). inline只是我们开发者对编译器的一个建议,编译器可以尝试去做,也可以不去做,这取决于编译器的诊断功能。
//优缺点:
//代码膨胀的问题: 所以内联函数的函数体尽量要小。
//注意:各种编译器对inline的处理各不相同,inline函数尽量简单,代码尽可能少。循环、分支、递归调用尽量不要出现在inline函数中。
// 否则的话,编译器很可能会因为你写这些代码的原因拒绝让这个函数成为一个inline函数。
//constexpr函数 可以看成是更严格的一种内联函数。
//三:函数杂合用法总结
//(1) 函数返回指针和返回引用的情况
//int *p = myfunc1();
//*p = 6;// 你往一个不属于你的地址写了数字
//
//int &k = myfunc1();
//cout << &k << endl;
//k = 10;// 你往一个不属于你的地址写了数字
//
//int k = myfunc1(); //这种写法是可以的
//cout << &k << endl;
//k = 10; //安全
//(2)没有形参可以保持形参列表为空(),或者int myfunc1(void)
//(3)如果一个函数我们如果不调用的话,则该函数可以只有声明部分,没有定义部分
//(4)普通函数,定义只能定义一次,声明可以声明多次。
//(5)void func1(int &ta, int &tb); 在C++中更习惯用引用类型的形参来取代指针类型形参
student abc;
abc.num = 100;
fs(abc);
cout << abc.num << endl; //输出: 1010
//(6)C++中,函数允许同名,但是形参列表的参数类型或者数量应该有明显的区别。
//四: const char* 、char const* 、char* const 三者的区别
const int ab = 12; //定义一个常量abc
//abc = 13; // 不可以
//(1) cosnt char *p; //p 指向的东西不能通过p来修改(p所指向的目标,那个目标中的内容不能通过p来改变)
//(2) char const *p; //和上面cosnt char *p等价
//(3) char* const p; //p指针不可修改,一旦指向了一个东西之后,就不可以再指向其他东西了
char str[] = "I Love China!";
char* const p = str; //定义的时候必须初始化
//(4) const char * const p = str; // p指针不可修改,p指针指向的内容也不能通过p来修改
system("pause");
return 0;
}