反思两个问题

  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. Linq研究

    微软在.NET 3.5中加入了LINQ技术,作为配套改进了C#语言,加入了Lambda表达式,扩展方法,匿名类型等新特性用以支持LINQ.微软同时提出了要使用声明式编程,即描述计算规则,而不是描述计算 ...

  2. scvmm应答文件 无人值守安装系统

    我们可以通过这种windows配置文件实现winpe.光盘等无人职守安装配置操作系统,在scvmm虚拟化平台中这种文件叫做应答文件. 下面为一个windows server 2008 r2的一个完整应 ...

  3. MySQL数据库(三)

    1. 创建表 create table student( id int unsigned not null auto_increment primary key, name varchar(8) no ...

  4. Sql2012 AlwaysOn

    准备: 两台宿主机,两台虚拟机,一根交叉线 系统都是windows server 2012 步骤 1.两台虚拟机均为双网卡 2.配置故障转移群集 3.执行AlwaysOn配置(增加Listen此步骤上 ...

  5. 算法 UVA 11292

    ***从今天开始自学算法. ***代码是用c++,所以顺便再自学一下c++ 例题1  勇者斗恶龙(The Dragon of Loowater, UVa 11292) 你的王国里有一条n个头的恶龙,你 ...

  6. 数数(高维DP)

    T1 数数 [问题描述] fadbec 很善于数数,⽐如他会数将 a 个红球,b 个黄球,c 个蓝球,d 个绿球排成⼀列,任意相邻不同⾊的数⽬. 现在 R 君不知道 fadbec 数的对不对,想让你也 ...

  7. “全栈2019”Java第九章:解释第一个程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. sql指定值排在前面

    示例: SELECT COL1 FROM TABLE1 ORDER BY CASE WHEN COL1 = 'A' THEN 1 ELSE 2 END,COL1;//COL1为A的排在最前面,剩下的按 ...

  9. P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树

    $ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 ...

  10. POJ-2387-Til the Cows Come Home(最短路)

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 72844   Accepted ...