int Add(int x, int y)
{
int x1 = x + 1; // 局部变量
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int main()
{
int z = Add(2, 3);
std::cout << z << std::endl;
z = Sub(2, 3);
std::cout << z << std::endl;
}
// ---------------------------------------------------------------------------------------------------------
extern "C" //C类 型函数
int Add(int x, int y)
{
return x + y;
}
函数可以在函数头的小括号中包含零到多个形参
包含零个形参时,可以使用void标记
对于非模板函数来说,其每个形参都有确定的类型,但形参可以没有名称
形参名称的变化并不会引入函数的不同版本
实参到形参的<u>拷贝求值顺序不定</u>,C++17强制<u>忽略复制临时对象</u>
#include <iostream>
void fun(int x, int y)
{
std::cout << y;
}
int main()
{
fun(1, 2); // 拷贝求值顺序不定
fun(1, int{}); // 临时变量会被C++17标准强制忽略,C++17标准之前由编译器决定
}
-fno-elide-constructors
忽略C++11(C++17标准之前)中对复制临时对象强制忽略的约束函数传值、传址、传引用
#include <iostream>
void fun(int par)
{
++par;
}
int main()
{
int arg = 3;
fun(arg);
std::cout << arg << '\n'; // 传值
}
#include <iostream>
void fun(int* par)
{
++(*par);
}
int main()
{
int arg = 3;
fun(&arg);
std::cout << arg << '\n'; // 传址
}
#include <iostream>
void fun(int& par)
{
++par;
}
int main()
{
int arg = 3;
fun(arg);
std::cout << arg << '\n'; // 传引用
}
函数传参过程中的类型退化
#include <iostream>
void fun(int par[]) // void fun(int* par)
{
// ...
}
int main()
{
int a[3];
fun(a);
}
变长参数
initializer_list
#include <iostream>
#include <initializer_list>
void fun(std::initializer_list<int> par)
{
// ...
}
int main()
{
fun({1, 2, 3, 4, 5}); // right
fun({1, 2, 3, "123", 5}); // wrong
}
可变长度模板参数
使用省略号表示形式参数
函数可以定义缺省实参
main
函数的两个版本
int main(){
}
int main(int argc, char *argv[]){
if(argc != 3){
std::cerr<<"Usage: "<<argv[0]<<" param1 param2\n";
return -1;
}
std::cout<<"argc = "<<argc<<std::endl;
for(int i = 0; i < argc ; ++i){
std::cout<<argv[i]<<"\n";
}
}
函数体形成域
函数体执行完成时的返回
隐式返回
#include <iostream>
void fun()
{
std::cout << "Hello" << std::endl;
}
int main()
{
fun();
}
显式返回关键字:return
return;
语句return 表达式;
return 初始化列表;
小心返回自动对象的引用或指针(容易返回已经销毁的对象)
#include <iostream>
#include <initializer_list>
std::initializer_list<int> fun()
{
std::cout << "Hello" << std::endl;
return {1, 2, 3, 4, 5};
std::cout << "World" << std::endl;
}
int main()
{
auto x = fun();
}
#include <iostream>
int& fun()
{
int x = 3;
return x;
}
int main{}
{
int& ref = fun();
}
返回值优化(Return Value Optimization, RVO)—— C++17对返回临时对象的强制优化
#include <iostream>
struct Str
{
Str() = default;
Str(const Str&)
{
std::cout << "Copy constructor is called\n";
}
};
Str fun()
{
Str x;
return x;
}
int main()
{
Str res = fun(); //两次拷贝构造,因此会输出两次"Copy constructor is called"
}
[[nodiscard]]
属性(C++17) 表明返回值很重要需要保留
限定查找
因为obj在是Str对象,所以会去MyNS域中查找
const
)[站外图片上传中...(image-37f2f5-1690910469933)]
constexpr
函数(表示在编译器执行,也可以在运行期执行)(C++11起)/consteval
函数(C++20起)(只能在编译期执行)
内联函数的展开:
1.逻辑简单的函数可能会被展开 2.内联函数展开并不是简单的替换 3. inline void fun() ,inline关键字保证在多个翻译单元定义后只选择一次 ,由程序一次定义原则转为翻译单元一次定义原则。4.inline关键字声明一定要有函数定义。
constexpr函数
函数指针
高阶函数