C++使用默认参数的构造函数
我们可以想象一个这样的场景:某一天书店整理库存,发现了一些非常老的书,为了尽快清空库存,店主想了一下,决定开展一个大甩卖活动,所有的这些书全部以五美元的价格出售。此时如果需要尽快将这些书的信息录入到书店的书单中,为了方便,我们可以在book类中添加一个带默认参数的构造函数。
#include<iostream>
using namespace std; class book
{
public:
book(){}
book(char* a, double p = 5.0);
void display();
private:
double price;
char * title;
}; book::book(char* a, double p) //在定义函数的时候可以不指定默认参数
{
title = a;
price = p;
} void book::display()
{
cout<<"The price of "<<title<<" is $"<<price<<endl;
} int main()
{
book Harry("Harry Potter", 49.9);
Harry.display();
book Gone("Gone with the Wind");
Gone.display();
return ;
}
在本例中,book类中的带参构造函数 book(char* a, double p = 5.0); 将价格设置为5.0,如此一来p就被设置成为一个默认参数,如果在创建对象的时候,没有传递实参给该参数p,则该参数会被默认设置为5.0。
在例1的主函数中我们可以看到Harry对象创建时传递了两个实参"Harry potter"和49.9,而Gone 对象则只是传递了一个实参"Gone with the Wind"用于初始化title,此时price就会被用默认参数初始化为5.0。
程序运行结果如下:
The price of Harry Potter is $49.9
The price of Gone with the Wind is $5.0
需要说明的是带默认参数的构造函数,其默认参数必须置于参数列表的结尾。如果例1中带参构造函数 book(char* a, double p = 5.0); 被声明成 book(double p = 5.0, char* a); 则是无法通过编译的,因为默认参数不在参数列表的结尾。
默认带参构造函数所带来的歧义:
#include<iostream>
using namespace std;
class book
{
public:
book(){}
book(char* a, double p = 5.0);
book(char *a);
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
private:
double price;
char * title;
};
book::book(char* a, double p) //在定义函数的时候可以不指定默认参数
{
title = a;
price = p;
}
book::book(char *a)
{
title = a;
}
void book::display()
{
cout<<"The price of "<<title<<" is $"<<price<<endl;
}
int main()
{
book Harry("Harry potter", 49.9);
Harry.display();
book Gone("Gone with the Wind"); //compile error
Gone.display();
return 0;
}
在本例中有三个构造函数,一个是默认构造函数,两个带参构造函数,其中一个为带有默认参数的构造函数。
在主函数中,通过book类创建Harry对象没有问题,此时创建对象只能调用book(char* a, double p = 5.0);构造函数。创建Gone对象时则有问题了,此时我们创建对象有两个与之匹配的构造函数可以调用,分别是book(char *a);和book(char* a, double p = 5.0);,此时该调用哪一个呢?无法得知,编译器只能报错了。
出现这种情况我们只能极力去避免了,通常而言,在设计类的构造函数的时候最好不要同时是用构造函数的重载和带参数的构造函数,以避免上述问题。
C++使用默认参数的构造函数的更多相关文章
- 2.9 C++使用默认参数的构造函数
总结: 默认参数的构造函数,其默认参数必须置于参数列表的结尾. 设计类的构造函数的时候最好不要同时是用构造函数的重载和带参数的构造函数. 我们可以想象一个这样的场景:某一天书店整理库存,发现了一些非常 ...
- C++:构造函数的默认参数知识拓展
和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. 例9.3的问题也可以使用包含默认参数的构造函数来处理. [例9 ...
- C++中关于重载默认构造函数与默认全部参数的构造函数的使用注意
# include<iostream>using namespace std;class Time{public: //公用成员函数 ...
- C++构造函数重载以及默认参数引起的二义性
大家都知道当我们声明一个类时,系统会提供一个默认构造函数.当我们需要提供参数进行对类数据成员进行初始化时,就需要对类的带参构造函数进行重载.同时,如果我们需要调用默认构造函数进行类数据成员的初始化时, ...
- c++默认参数函数注意事项
再有默认参数的函数中,一般我们都把默认参数放在声明处而不是定义处. 如果声明和定义都有默认参数,编译器将会报错. 调用含有默认实参的函数时,我们可以包含参数,也可以省略. 有默认参数的函数,我们可以不 ...
- C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?
我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一 ...
- C#深入学习笔记 - 可空类型与构造函数默认参数
在实际开发中或许可能会遇到某个属性需要提供一个默认参数,如果该参数是引用类型的话,可以通过 使用 null 来表示未知的值,但如果是int或 其他值类型的话就有点不好办了,因为如果需要一个int或fl ...
- [c++] 子类构造函数中有默认参数
子类创建对象时调用父类的构造函数: 1 #include <iostream> 2 using namespace std; 3 class Base 4 { 5 public: 6 Ba ...
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
随机推荐
- MVC--DefaultModelBinder解析request参数
转载:http://www.cnblogs.com/leotsai/p/ASPNET-MVC-DefaultModelBinder.html 看到很多ASP.NET MVC项目还在从request.q ...
- PHP定界符<<<eof 使用
PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...
- Tomcat启动报错:org.apache.catalina.LifecycleException: Failed to start component...java.util.zip.ZipException: error in opening zip file
1.项目环境 IntelliJ IDEA2018.1.6 apache-tomcat-8.0.53 基于springboot开发的项目 maven3.5.3 2.出现问题 从svn同步下项目 启动to ...
- Linux nohup命令应用简介--让Linux的进程不受终端影响
nohup命令应用简介--让Linux的进程不受终端影响 by:授客 QQ:1033553122 #开启ping进程 [root@localhost ~]# ping localhost & ...
- AutoCompleteTextView 自定义提示样式
项目中用到AutoCompleteTextView 自动提示功能,如果用自带的ArrayAdapter就一种样式,非常丑,而且每一项提示文字过多的话不会自动换行. 所以自己自定义了一个适配器. 效果 ...
- Hadoop 客户端问题
错误: log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.Exception in ...
- windows 远程连接
* 方法1:windows自带的远程工具 缺点:如果操作系统是家庭版,会一致连接不上:尽管想办法把这个功能打开: 步骤: * 打开允许远程连接: 点进去自己设置就行,没有什么好说的 设置完之后,需要允 ...
- 开发之道——读《移山之道——VSTS开发之道》后感
开发之道——读<移山之道——VSTS开发之道>后感 <移山之道——VSTS开发之道>(下简称<移山之道>)是邹欣老师的另一本书.相传很有名的<构建之法> ...
- WordCount系统分析与设计作业
Gitee项目地址 https://gitee.com/gitdq/homework psp表 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 10 10 · ...
- continue break exit用法说明
1,continue用法 2,break用法 3,sys.exit用法 1,continue用法(跳出本次循环,继续下次循环) for i in xrange(10): if i == 8: cont ...