反思两个问题

  1. 带默认参数的函数,为何声明、定义不能同时有参数?

  2. 带默认参数的函数, 为何带默认参数的参数靠后站?

上程序

#include <iostream>
#include <string>
using namespace std; class A
{
public:
A(const string &a = "hello, nihao!", int b = );
private:
string s;
int sb;
}; A::A(const string &a, int b) : s(a), sb(b)
{
cout << s << " " << sb << endl;
} int main()
{
string s = "hello";
A a("hello" ,);
}

类A的构造函数,参数带着默认值,这样,建立类的对象时可以不给类对象赋全部的参数(没有的参数会用默认值顶上),这里有几个个问题:

问题1: 带参数的构造函数如果声明时带上默认的参数,那么在定义时就不能带了。

这样设计的目的,我认为是这样:如果声明给定了一个参数了,但是定义时又给定了一个不同的参数。这样,用户看到的是类的声明.h文件,但两者不一样,会按着定义来。这就给类的使用者带来了麻烦,因此,为了避免这样,带默认参数的函数,两者只能在一个地方出现,不能同时出现。

其实,不止是构造函数中出现这样的问题,所有的函数,都应该这样:声明和定义的默认默认参数不共戴天----不能同时都有(但是,建议要是有的话,最好在声明时写上)。例如:

#include <iostream>
#include <string>
#include <set>
#include <map>
using namespace std; class A
{
public:
A(const string &a = "hello, nihao!", int b = );
void print_A(int a = );
private:
string s;
int sb;
}; A::A(const string &a = "hello, nihao", int b = ) : s(a), sb(b)
{
cout << s << " " << sb << endl;
} void A::print_A(int a) { cout << a << endl; } int main()
{
string s = "hello";
A a("hello" ,);
}

错误提示

del7.cc::: error: default argument given for parameter  of ‘A::A(const string&, int)’
del7.cc::: error: after previous specification in ‘A::A(const string&, int)’
del7.cc::: error: default argument given for parameter of ‘A::A(const string&, int)’ [-fpermissive]
del7.cc::: error: after previous specification in ‘A::A(const string&, int)’ [-fpermissive]

把定义中默认的参数去掉就行了。

问题2. 带默认参数的函数, 为何带默认参数的参数靠后站?

我这么理解:从前往后写,可以少写,定义对象时,不够的用默认的参数补上,挺好。反之,如果带参数的往前写那么当定义对象时,前边的有参数,又给传了实参;而后边的没有参数,也不传,这不浪费吗。

例证

#include <iostream>
#include <string>
#include <map>
using namespace std; class B
{
public:
B(int c = , const string &s = "newfldr")
{
mapa.insert(make_pair<B*, int>(this, c));
}
void print_Bsize() { cout << mapa.size() << endl; }
private:
static map<B*, int> mapa;
};
map<B*, int> B::mapa; //静态变量,单独在类外开个小灶 int main()
{
B b(, "ni");
B b1(); //参数预定义不同,因为有默认的参数,没问题儿
B b2(, "ni2");
b.print_Bsize(); //因为mapa是类的,所以这里不论是谁,结果都是一样的
}

结果

3

【c++】类中带默认参数的函数的更多相关文章

  1. php课程 3-12 带默认参数的函数怎么写

    php课程 3-12 带默认参数的函数怎么写 一.总结 一句话总结:多看学习视频啊 1.带默认参数的函数怎么写? 直接等于号接默认参数,和js里面一模一样 2.带默认参数的函数的注意事项是什么? 默认 ...

  2. js课程 2-7 带默认参数的函数怎么写

    js课程 2-7 带默认参数的函数怎么写(注意参数顺序) 一.总结 一句话总结:默认参数一定要放在最后面,而且还有注意你调用参数的时候给参数的顺序习惯.直接加个等于号就可以是默认参数.function ...

  3. C/C++中带可变参数的函数

    1.带可变参数的函数由来 当函数中的参数个数不确定时,这时候就需要带可变参数的函数! 如我们经常使用的C库函数printf()实际就是一个可变参数的函数, 其原型为: int printf( cons ...

  4. python 定义带默认参数的函数

  5. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  6. PHP类中的__get()和__set函数到底有什么用

    PHP类中的__get()和__set函数到底有什么用 一.总结 一句话总结:当试图获取一个不可达变量时,类会自动调用__get.同样的,当试图设置一个不可达变量时,类会自动调用__set.在网站中, ...

  7. C++——带默认参数值的函数

    函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认参数值. ,) { return x + y;} int main() { add(,);//10+20 a ...

  8. C++中的默认参数规则

    C++中的默认参数规则 C++的默认参数规则其实是一个非常容易掉坑的规则,尤其是当一个函数拥有多个声明的时候,每个声明的默认参数可以各不相同,在调用时又可能与每个声明都不同:这篇博客稍微列举一下C++ ...

  9. C++中若类中没有默认构造函数,如何使用对象数组

    前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> ...

随机推荐

  1. Android-动态添加控件到ScrollView

    在实际开发过程中,会需要动态添加控件到ScrollView,就需要在Java代码中,找到ScrollView的孩子(ViewGroup),进行添加即可. Layout: <?xml versio ...

  2. Mathcad操作tips:算式输入、变量定义与计算

    算式输入 1. 数字与符号相乘,输入时不必手动输入乘号(“*”). 2. 以下有助于算式的可视化:a. 使用Math工具栏输入,并合理使用tab键:b. 合理使用空格键. 3. 输入开根号时,可用快捷 ...

  3. 织梦CMS让channelartlist标签支持currentstyle【转】

    打开include\taglib\channelartlist.lib.php找到 $pv->Fields['typeurl'] = GetOneTypeUrlA($typeids[$i]); ...

  4. Docker 1.3.3/1.4.0 发布下载,Linux 容器引擎

    Docker 1.3.3 发布,下载地址: https://github.com/docker/docker/archive/v1.3.3.zip 改进记录包括: Security Fix path ...

  5. VMware下拷过来的Linux系统ifconfig下没有网络问题

    拷了同事的Linux系统,拷过来时还可以用,今天再打开发现找不到ip了,于是就在网上找解决方法,因本人从没接触过Linux所以查的挺多的但解决的方法试了好几个就是不行,后面找到的有效的解决方法有: L ...

  6. Open Interface Service WCF三种通信模式

    WCF三种通信模式 一.请求响应模式: 概念:客户端发送请求,一直等待服务端响应,在此期间处于等待(假死)状态:直到服务器响应,才能继续执行其他的操作: 即使返回值是void 也属于请求与答复模式. ...

  7. 如何用Python做Web开发?——Django环境配置

    用Python做Web开发,Django框架是个非常好的起点.如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手.     概念 最近有个词儿很流行,叫做“全栈”(full stack ...

  8. linux命令之磁盘与文件系统管理命令(上)

    1.fdisk:磁盘分区工具 该命令是linux下常用的磁盘分区工具,但是只能给小于2TB的磁盘划分分区. 常用参数为-l,显示所有磁盘分区的信息. 示例: 1)显示磁盘分区列表 [root@boxi ...

  9. SQL语句insert into 不存在则插入,存在则修改

    一 测试表的创建 -- ---------------------------- -- Table structure for User -- ---------------------------- ...

  10. [Swift]队列Queue的两种版本:(1)用类包装Queue (2)用泛型包装Queue

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...