C++基础 inline 默认参数 函数占位参数

1. inline内联函数

内联函数用于替换宏,

实例:

其中宏和 ++ 连用有副作用。

#include "iostream"
using namespace std;
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))  

inline int myfunc(int a, int b)
{
    return a < b ? a : b;
}

int main()
{
    int a = 1;
    int b = 3;
    //int c = myfunc(++a, b);
    int c = MYFUNC(++a, b);  

    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);

system("pause");
    return 0;
}

有以下注意:

(1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块

(2)内联函数在最终生成的代码中没有定义,C++编译器直接将函数体插入函数调用处,所以内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),也不能取地址。

(3)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏由预处理器处理,进行简单文本替换,没有任何编译过程。

(4)内联编译的限制:

不能存在循环语句,不能有太多判断语句,函数体不能过于庞大,不能对函数体取地址,内联声明必须在调用语句之前。

2. 默认参数

如下:

void printAB(int x = 3)
{
    printf("x:%d\n", x);
}

规则:

(1)只有参数列表后面部分才可以使用默认参数。

(2)一旦在函数中使用默认参数,这个参数之后的参数都必须使用默认参数。

//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数
void printABC(int a, int b, int x = 3, int y=4, int z = 5)
{
    printf("x:%d\n", x);
}
int main62(int argc, char *argv[])
{
    printAB(2);
    printAB();
    system("pause");
    return 0;
}

3. 函数占位参数

如下:

int func(int a, int b, int )
{
    return a + b;
}

int main01()
{
    //func(1, 2); //可以吗?
    printf("func(1, 2, 3) = %d\n", func(1, 2, 3));

    getchar();
    return 0;
}

函数占位参数:

(1)占位参数只有参数类型声明,而没有参数名声明

(2)一般情况下,在函数体内部无法使用占位参数。

函数占位参数与默认参数结合

int func2(int a, int b, int = 0)
{
    return a + b;
}
void main()
{
    //如果默认参数和占位参数在一起,都能调用起来
    func2(1, 2);
    func2(1, 2, 3);
    system("pause");
}

原文地址:https://www.cnblogs.com/yangxinrui/p/9783420.html

时间: 2024-11-08 08:55:33

C++基础 inline 默认参数 函数占位参数的相关文章

内联函数、默认参数和函数占位参数

内联函数 定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处.编译时,类似宏替换,使用函数体替换调用处的函数名.一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理. C++中的const常量可以替代宏常数定义,如: const int A = 3; ? #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!) C++

函数参数相关(默认参数,占位参数)

C++中可以在函数声明时为参数提供一个默认值, 当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 函数默认参数的规则 只有参数列表后面部分的参数才可以提供默认参数值 一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值 #include <iostream> using namespace std; void myPrint(int x = 3) { cout<<"x="<<x<<endl; }

Python之路【第三篇】:Python基础(17)——函数动态参数

#动态参数:** 2星默认将传入的参数,全部放置在字典中f1(**{"kl":"v1", "k2":"v2"})#带2星的用来处理那些带有键值对的值,即一个key一个value的值 # 示例# def func(**kwargs):# print(kwargs,type(kwargs))# # 执行方式一# func(name='wupeiqi',age=18)# # 执行方式二# li = {'name':'wupeiqi'

Python之路【第三篇】:Python基础(16)——函数动态参数

# 动态参数:# * 1星默认将传入的参数,全部放置在元组中,f1(*[1`1,22,33,44])# 带1个星的用来处理那些默认按照顺序传的值 # # #示例# def func(*args):# print (args,type(args))# # 执行方式一# func(11,33,4,4454,5)# # 执行方式二# li = [11,2,2,3,3,4,54]# func(*li)# # 输出# # (11, 33, 4, 4454, 5) <class 'tuple'># # (

Python之路【第三篇】:Python基础(15)——函数指定参数

# 指定参数:将实际参数赋值给指定的形式参数# # 示例# def send(name,xx = "ok"):# ...## send('[email protected]',name="你好") # # 练习1def send(mail_addr,content,): print(mail_addr,content,) # print("发送邮件成功:",mail_addr,content) return True send("[em

Python之路【第三篇】:Python基础(18)——函数万能参数

# 万能参数:既带一个星也带两个星# #*args, **kwargs 一般都用这个表示 def func(*args, **kwargs): ## # def func(**kwargs,*args): # 两星和一星的位置不能互换,必须一星的在前面,两星的在后面. print(args,type(args)) print(kwargs,type(kwargs))func(11,22,33,44,k1="v1",k2="v2")# #默认情况会自动把11,22,3

Python之路【第三篇】:Python基础(13)——函数普通参数

# 普通参数:严格按照顺利,将实际参数赋值给形式参数 # def send(name):# ...# send("eric") def sendmail(mail_addr): #第一步.创建函数 (mail_addr是形式参数)第三步.mail_addr = {str}'[email protected]' try: # 这个功能是捕捉异常,目前还没学到. import smtplib from email.mime.text import MIMEText from email.u

C++中的const,引用本质,内联,默认/占位参数,

1.C++中的const (1).C++中的const是真正的常量,可以进行数组大小的定义: 代码如下: #include<iostream> using namespace std; #define A 10 int main(void){     int a = 10;      int array[a]; //Linux内核支持这样定义数组,其他的编译器不支持     const int a = 10;  //这里是常量,所以可以进行下面的数组大小的确定:     int array[a

Python基础笔记:函数:调用函数、定义函数、函数的参数、递归函数

一.定义一个求二元一次方程的根的函数 #Sublime Text import math def ee(a,b,c): delta=b*b-4*a*c if delta<0: return 'null' else: m=math.sqrt(delta) nx=(-b+m)/2/a ny=(-b-m)/2/a return nx,ny #python解释器 >>> from hello import ee #声明调用py文件中所定义的函数ee >>> ee(1,0,