C语言函数的默认参数

C语言函数的默认参数,第1张

C语言中没有参数默认值的概念,但其实可以利用宏来模拟参数的默认值;

我们之前介绍过可变参数宏与逗号运算符,将两者相结合的话可以定义出以下形式的宏:

当在 func() 里不填写任何内容的时候,正常情况下宏展开后会是 func((default,)) ,但由于 ##__VA_ARGS__ 会将前面多余的逗号忽略,所以宏展开后就相当于 __func((default)) ;

当在 func() 括号里填写有效值的时候,根据逗号运算符的值等于最后一个表达式的值的性质,宏会被展开为 __func((##__VA_ARGS__)) 既 default 被丢弃,传入的值只有我们填写的内容,通过这个技巧我们就可以设计出一个带有默认参数的函数

示例:

定义一个函数默认参数为 0xff ,不传任何参数的时候打印 0xff ,传入有效值的时候就打印我们传入的内容;

输出:

初学C++,  关于类的声明与实现,要遵守“实现抽象”、“数据隐藏”的原则。因此一般将声明部分放在头文件中,类的成员函数的具体实现放在源代码文件中。但有时为了省事,将头文件中的类的成员函数的声明直接复制到代码文件中,一般情况下是不会出现问题的。但当成员函数的声明中为形参指定了实参时,这样直接复制过去就会造成:error  C2575: 重定义默认参数。初学C++,  关于类的声明与实现,要遵守“实现抽象”、“数据隐藏”的原则。因此一般将声明部分放在头文件中,类的成员函数的具体实现放在源代码文件中。但有时为了省事,将头文件中的类的成员函数的声明直接复制到代码文件中,一般情况下是不会出现问题的。但当成员函数的声明中为形参指定了实参时,这样直接复制过去就会造成:error  C2575: 重定义默认参数。

因此我们只需要在头文件,或者源文件中声明一次该默认参数,习惯上在头文件中声明。代码如下:

//person.h

#ifndef PERSON_H_

#define PERSON_H_

#include <string>

class Person

{

private:

static const int LIMIT = 25

std::string  lname//Person's last name

char fname[LIMIT] //Person's first name

public:

Person() {lname = ""fname[0] = '\0'} //#1

Person(const std::string &ln, const char *fn = "Heyyou") //#2

~Person()

void Show() const

void FormalShow() const

}

#endif

//--------------------------------------------------------

//--------------------------------------------------------

//person.cpp

#include <iostream>

#include <string>

#include "person.h"

Person::Person(const std::string &ln, const char *fn) //#2

{

lname = ln

//fname[LIMIT] = *fn

strcpy(fname,fn)//

}

Person::~Person()

{

std::cout <<"Person class have finished!\n"

}

void Person::Show() const

{

std::cout <<fname <<lname <<std::endl

}

void Person::FormalShow() const

{

std::cout <<lname <<fname <<std::endl

}

其实准确的说,你所说的函数说明是指函数的前项声明。也就是在程序前面,一般在main前面用如下格式声明一个函数:类型+函数名+(参数类型或者默认参数)+分号

你给出的这两个程序不矛盾。第一个中并没有前项声明函数,只是sum函数在main前面定义。第二个则不同,point函数在main前面是前项声明(注意void point(int x=10,y=20)这句是加了分号的),仅仅是声明没有定义,而point函数的定义是放在main后才真正定义的。

函数为什么要前项声明呢,这是因为在比较大的程序中,某些地方调用函数的时候,被调用的函数还没被定义,前项声明的作用就是在程序的最开头就声明了函数名和参数要求,那么整个程序在任何地方都可以调用这个函数。即声明的意思就是告诉整个程序,某个函数名是合法的。

换在你给的第二程序的理解为,main函数要调用point函数,如果前面没有声明,那么main函数就不认识point这个函数。你可以尝试注释掉void point(int x=10,y=20)这句,编译就会报错。但因为这个程序是非常简单的小程序,所以你可以把point函数的定义放在main前面,与此同时把oid point(int x=10,y=20)这句删除,程序也是对的。

明白了吧,你所说的第一节的SUM函数是没有你所说的“说明”的,也就是第一节的只是定义没有前项声明。第二节的首先前项声明,然后再定义的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11839321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存